Press n or j to go to the next uncovered block, b, p or k for the previous block.
| 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 | /** * useLocalStorage — persistent state in localStorage. */ import {useCallback, useState} from 'react'; export function useLocalStorage<T>( key: string, initialValue: T, ): [T, (value: T | ((prev: T) => T)) => void] { const [storedValue, setStoredValue] = useState<T>(() => { try { const item = window.localStorage.getItem(key); return item ? (JSON.parse(item) as T) : initialValue; } catch { return initialValue; } }); const setValue = useCallback( (value: T | ((prev: T) => T)) => { setStoredValue(prev => { const next = typeof value === 'function' ? (value as (prev: T) => T)(prev) : value; try { window.localStorage.setItem(key, JSON.stringify(next)); } catch { // ignore write errors } return next; }); }, [key], ); return [storedValue, setValue]; } |