UNPKG

raycast-hooks

Version:
41 lines (31 loc) 1.16 kB
import { useCallback, useEffect, useState } from "react"; import { LocalStorage } from "@raycast/api"; type PrefList = { [key: string]: boolean | string; }; const key = "app.preferences"; const getPrefs = async (): Promise<PrefList> => { const val: string | undefined = await LocalStorage.getItem(key); return (JSON.parse(val ?? "{}") ?? {}) as PrefList; }; const updatePrefs = async (prefs: PrefList): Promise<void> => { await LocalStorage.setItem(key, JSON.stringify(prefs)); }; export function usePreferences( defaults: PrefList ): [PrefList, {update: (pref: string, value: boolean | string) => Promise<void>, reset: () => void}] { const [prefs, setPrefs] = useState<PrefList>(defaults); useEffect(() => { getPrefs().then((prefs) => setPrefs({ ...defaults, ...prefs })); }, []); const update = useCallback(async (pref: string, value: boolean | string) => { const prefs = await getPrefs(); prefs[pref] = value; await updatePrefs(prefs); setPrefs(prefs); }, []); const reset = useCallback(() => { updatePrefs(defaults).then(() => setPrefs(defaults)); }, [defaults]); return [prefs, {update, reset}]; }