Skip to content
Snippets Groups Projects
useLocalPref.ts 1.09 KiB
Newer Older
  • Learn to ignore specific revisions
  • import { useEffect } from 'react';
    
    import { useLocalStorage } from 'usehooks-ts';
    
    
    import { type LocalPrefs } from 'loot-core/src/types/prefs';
    
    
    import { useMetadataPref } from './useMetadataPref';
    
    
    type SetLocalPrefAction<K extends keyof LocalPrefs> = (
      value: LocalPrefs[K],
    ) => void;
    
    
    /**
     * Local preferences are scoped to a specific budget file.
     */
    
    export function useLocalPref<K extends keyof LocalPrefs>(
      prefName: K,
    ): [LocalPrefs[K], SetLocalPrefAction<K>] {
    
      const [budgetId] = useMetadataPref('id');
    
      const [value, setValue] = useLocalStorage<LocalPrefs[K]>(
        `${budgetId}-${prefName}`,
        undefined,
        {
          deserializer: JSON.parse,
          serializer: JSON.stringify,
    
      // Migrate from old pref storage location (metadata.json) to local storage
      // eslint-disable-next-line @typescript-eslint/no-explicit-any
      const [metadataPref] = useMetadataPref(prefName as any);
      useEffect(() => {
        if (value !== undefined || metadataPref === undefined) {
          return;
        }
    
        setValue(metadataPref);
      }, [value, metadataPref, setValue]);
    
      return [value, setValue];