Spaces:
Running
Running
| 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); | |
| } | |
| } | |