diff --git a/src/app/state/hooks/settings.ts b/src/app/state/hooks/settings.ts new file mode 100644 index 00000000..e1de5579 --- /dev/null +++ b/src/app/state/hooks/settings.ts @@ -0,0 +1,26 @@ +import { atom, useAtomValue, useSetAtom, WritableAtom } from 'jotai'; +import { selectAtom } from 'jotai/utils'; +import { useMemo } from 'react'; +import { Settings } from '../settings'; + +export const useSetting = ( + settingsAtom: WritableAtom, + key: K +): [Settings[K], (value: Settings[K]) => void] => { + const selector = useMemo(() => (s: Settings) => s[key], [key]); + const setting = useAtomValue(selectAtom(settingsAtom, selector)); + + const setterAtom = useMemo( + () => + atom(null, (get, set, value) => { + const s = { ...get(settingsAtom) }; + s[key] = value; + set(settingsAtom, s); + }), + [settingsAtom, key] + ); + + const setter = useSetAtom(setterAtom); + + return [setting, setter]; +};