import type { Dispatch, SetStateAction } from 'react'; import { useEffect, useRef, useState } from 'react'; export function useLocalStorage(key: string, defaultState: T): [T, Dispatch>] { const state = useState(() => { try { const value = localStorage.getItem(key); if (value) return JSON.parse(value) as T; } catch (error: any) { if (typeof window !== 'undefined') { console.error(error); } } return defaultState; }); const value = state[0]; const isFirstRender = useRef(true); useEffect(() => { if (isFirstRender.current) { isFirstRender.current = false; return; } try { if (value === null) { localStorage.removeItem(key); } else { localStorage.setItem(key, JSON.stringify(value)); } } catch (error: any) { if (typeof window !== 'undefined') { console.error(error); } } }, [value, key]); return state; }