Newer
Older
Matiss Janis Aboltins
committed
import { useEffect } from 'react';
import { useLocalStorage } from 'usehooks-ts';
import { type LocalPrefs } from 'loot-core/src/types/prefs';
Matiss Janis Aboltins
committed
import { useMetadataPref } from './useMetadataPref';
type SetLocalPrefAction<K extends keyof LocalPrefs> = (
value: LocalPrefs[K],
) => void;
Matiss Janis Aboltins
committed
/**
* Local preferences are scoped to a specific budget file.
*/
export function useLocalPref<K extends keyof LocalPrefs>(
prefName: K,
): [LocalPrefs[K], SetLocalPrefAction<K>] {
Matiss Janis Aboltins
committed
const [budgetId] = useMetadataPref('id');
const [value, setValue] = useLocalStorage<LocalPrefs[K]>(
`${budgetId}-${prefName}`,
undefined,
{
deserializer: JSON.parse,
serializer: JSON.stringify,
Matiss Janis Aboltins
committed
// 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];