use-local-storage.ts
typescript/hooks/use-local-storage.ts
TypeScript
React hook for synced localStorage state with SSR safety.
use-local-storage.ts
/**
* @description React hook for synced localStorage state with SSR safety.
* @tags react, hook, storage, ssr
*/
import { useState, useEffect, useCallback } from "react";
export function useLocalStorage<T>(
key: string,
initialValue: T
): [T, (value: T | ((val: T) => T)) => void] {
const readValue = useCallback((): T => {
if (typeof window === "undefined") return initialValue;
try {
const item = window.localStorage.getItem(key);
return item ? (JSON.parse(item) as T) : initialValue;
} catch {
return initialValue;
}
}, [key, initialValue]);
const [storedValue, setStoredValue] = useState<T>(readValue);
const setValue = useCallback(
(value: T | ((val: T) => T)) => {
try {
const newValue = value instanceof Function ? value(storedValue) : value;
window.localStorage.setItem(key, JSON.stringify(newValue));
setStoredValue(newValue);
} catch (error) {
console.warn(`Error setting localStorage key "${key}":`, error);
}
},
[key, storedValue]
);
useEffect(() => {
setStoredValue(readValue());
}, [readValue]);
return [storedValue, setValue];
}