Files
yaak-mountain-loop/src-web/lib/atoms/atomWithKVStorage.ts
Gregory Schier 5919fae739 Run oxfmt across repo, add format script and ignore config
Format all non-generated files with oxfmt via `vp fmt`. Add
.oxfmtignore to skip bindings/ and wasm-pack output. Add npm
format script and update DEVELOPMENT.md docs.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-13 09:52:11 -07:00

26 lines
742 B
TypeScript

import { atom } from "jotai";
import { getKeyValue, setKeyValue } from "../keyValueStore";
export function atomWithKVStorage<T extends object | boolean | number | string | null>(
key: string | 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;
}