import { useState, useEffect } from 'react'; /** * Hook to persist state in localStorage * @param key The localStorage key * @param initialValue The initial value * @returns A tuple with the current value, setter function, and clear function */ export function useLocalStorage( key: string, initialValue: T ): [T, (value: T | ((val: T) => T)) => void, () => void] { const readValue = (): T => { if (typeof window === 'undefined') { return initialValue; } try { const item = window.localStorage.getItem(key); return item ? (JSON.parse(item) as T) : initialValue; } catch (error) { return initialValue; } }; const [storedValue, setStoredValue] = useState(readValue); const setValue = (value: T | ((val: T) => T)) => { try { const valueToStore = value instanceof Function ? value(storedValue) : value; setStoredValue(valueToStore); if (typeof window !== 'undefined') { window.localStorage.setItem(key, JSON.stringify(valueToStore)); } } catch (error) { } }; const clearValue = () => { try { setStoredValue(initialValue); if (typeof window !== 'undefined') { window.localStorage.removeItem(key); } } catch (error) { } }; useEffect(() => { const handleStorageChange = (event: StorageEvent) => { if (event.key === key && event.newValue) { try { setStoredValue(JSON.parse(event.newValue)); } catch (error) { } } }; window.addEventListener('storage', handleStorageChange); return () => { window.removeEventListener('storage', handleStorageChange); }; }, [key]); return [storedValue, setValue, clearValue]; }