import { useEffect, useState } from "react"; import { isDefined } from "helpers/others"; export const useStateWithLocalStorage = ( key: string, initialValue: T ): [T, React.Dispatch>] => { const [value, setValue] = useState(initialValue); const [isFromLocaleStorage, setFromLocaleStorage] = useState(false); useEffect(() => { try { const item = localStorage.getItem(key); if (isDefined(item)) { setValue(JSON.parse(item) as T); } else { setValue(initialValue); } setFromLocaleStorage(true); } catch (error) { console.warn(`Error reading localStorage key “${key}”:`, error); setValue(initialValue); } }, [initialValue, key]); useEffect(() => { if (isFromLocaleStorage) localStorage.setItem(key, JSON.stringify(value)); }, [value, key, isFromLocaleStorage]); return [value, setValue]; };