puck / frontend /src /lib /storage.ts
vu1n's picture
Puck — desktop fairy familiar (HF Build Small)
3c124f3
Raw
History Blame Contribute Delete
1.31 kB
import * as React from "react";
const PREFIX = "puck:";
function load<T>(key: string, fallback: () => T): T {
try {
const raw = localStorage.getItem(PREFIX + key);
if (raw == null) return fallback();
// merge over fallback so new fields added later get their defaults
const parsed = JSON.parse(raw);
const base = fallback();
return typeof base === "object" && base !== null && !Array.isArray(base)
? { ...base, ...(parsed as object) }
: (parsed as T);
} catch (e) {
console.error(`puck: failed to load ${key}, using defaults`, e);
return fallback();
}
}
/** useState backed by localStorage. `fallback` runs only when nothing is stored. */
export function usePersistent<T>(key: string, fallback: () => T) {
const [value, setValue] = React.useState<T>(() => load(key, fallback));
React.useEffect(() => {
try {
localStorage.setItem(PREFIX + key, JSON.stringify(value));
} catch (e) {
console.error(`puck: failed to persist ${key}`, e);
}
}, [key, value]);
return [value, setValue] as const;
}
/** Wipe all of Puck's persisted state (the "forget everything" escape hatch). */
export function forgetEverything() {
for (const k of Object.keys(localStorage)) {
if (k.startsWith(PREFIX)) localStorage.removeItem(k);
}
}