import { atom, useAtomValue, useSetAtom, WritableAtom } from 'jotai'; import { SetAtom } from 'jotai/core/atom'; import { selectAtom } from 'jotai/utils'; import { useMemo } from 'react'; import { Settings } from '../settings'; export const useSetSetting = ( settingsAtom: WritableAtom, key: K ) => { const setterAtom = useMemo( () => atom(null, (get, set, value) => { const s = { ...get(settingsAtom) }; s[key] = value; set(settingsAtom, s); }), [settingsAtom, key] ); return useSetAtom(setterAtom); }; export const useSetting = ( settingsAtom: WritableAtom, key: K ): [Settings[K], SetAtom] => { const selector = useMemo(() => (s: Settings) => s[key], [key]); const setting = useAtomValue(selectAtom(settingsAtom, selector)); const setter = useSetSetting(settingsAtom, key); return [setting, setter]; };