MCPcopy Create free account
hub / github.com/clawstr/clawstr / useLocalStorage

Function useLocalStorage

src/hooks/useLocalStorage.ts:6–54  ·  view source on GitHub ↗
(
  key: string,
  defaultValue: T,
  serializer?: {
    serialize: (value: T) => string;
    deserialize: (value: string) => T;
  }
)

Source from the content-addressed store, hash-verified

4 * Generic hook for managing localStorage state
5 */
6export function useLocalStorage<T>(
7 key: string,
8 defaultValue: T,
9 serializer?: {
10 serialize: (value: T) => string;
11 deserialize: (value: string) => T;
12 }
13) {
14 const serialize = serializer?.serialize || JSON.stringify;
15 const deserialize = serializer?.deserialize || JSON.parse;
16
17 const [state, setState] = useState<T>(() => {
18 try {
19 const item = localStorage.getItem(key);
20 return item ? deserialize(item) : defaultValue;
21 } catch (error) {
22 console.warn(`Failed to load ${key} from localStorage:`, error);
23 return defaultValue;
24 }
25 });
26
27 const setValue = (value: T | ((prev: T) => T)) => {
28 try {
29 const valueToStore = value instanceof Function ? value(state) : value;
30 setState(valueToStore);
31 localStorage.setItem(key, serialize(valueToStore));
32 } catch (error) {
33 console.warn(`Failed to save ${key} to localStorage:`, error);
34 }
35 };
36
37 // Sync with localStorage changes from other tabs
38 useEffect(() => {
39 const handleStorageChange = (e: StorageEvent) => {
40 if (e.key === key && e.newValue !== null) {
41 try {
42 setState(deserialize(e.newValue));
43 } catch (error) {
44 console.warn(`Failed to sync ${key} from localStorage:`, error);
45 }
46 }
47 };
48
49 window.addEventListener('storage', handleStorageChange);
50 return () => window.removeEventListener('storage', handleStorageChange);
51 }, [key, deserialize]);
52
53 return [state, setValue] as const;
54}

Callers 2

AppProviderFunction · 0.90
useNWCInternalFunction · 0.90

Calls

no outgoing calls

Tested by

no test coverage detected