Generalized frontend model store (#193)

This commit is contained in:
Gregory Schier
2025-03-31 11:56:17 -07:00
committed by GitHub
parent ce885c3551
commit f1757ae427
201 changed files with 2185 additions and 2865 deletions

View File

@@ -0,0 +1,25 @@
import { atom } from 'jotai/index';
import { getKeyValue, setKeyValue } from '../keyValueStore';
export function atomWithKVStorage<T extends object | boolean | number | string | null>(
key: string,
fallback: T,
namespace = 'global',
) {
const baseAtom = atom<T>(fallback);
baseAtom.onMount = (setValue) => {
setValue(getKeyValue<T>({ namespace, key, fallback }));
};
const derivedAtom = atom<T, [T | ((prev: T) => T)], void>(
(get) => get(baseAtom),
(get, set, update) => {
const nextValue = typeof update === 'function' ? update(get(baseAtom)) : update;
set(baseAtom, nextValue);
setKeyValue({ namespace, key, value: nextValue }).catch(console.error);
},
);
return derivedAtom;
}