import { useState, useEffect } from 'react'; type SetValue = (value: T | ((val: T) => T)) => void; export const useLocalStorage = (key: string, initialValue: T): [T, SetValue] => { const [storedValue, setStoredValue] = useState(() => { if (typeof window === 'undefined') { return initialValue; } try { const item = window.localStorage.getItem(key); return item ? JSON.parse(item) : initialValue; } catch (error) { console.error(error); return initialValue; } }); const setValue: SetValue = (value) => { try { const valueToStore = value instanceof Function ? value(storedValue) : value; setStoredValue(valueToStore); if (typeof window !== 'undefined') { window.localStorage.setItem(key, JSON.stringify(valueToStore)); } } catch (error) { console.error(error); } }; useEffect(() => { const handleStorageChange = (e: StorageEvent) => { if (e.key === key) { try { setStoredValue(e.newValue ? JSON.parse(e.newValue) : initialValue); } catch (error) { console.error(error) } } }; window.addEventListener('storage', handleStorageChange); return () => { window.removeEventListener('storage', handleStorageChange); }; }, [initialValue, key]); return [storedValue, setValue]; };