UseSessionStorage
guarahooks/use-session-storageFreeHook
Synchronizes a value with sessionStorage.
Live preview
live · rendered by the registry
Rendered by guarahooks on their own page — this is the component running, not a screenshot of it.Install it
npx shadcn@latest add https://guarahooks.com/r/use-session-storage.jsonSource
1'use client';23import { useCallback, useEffect, useMemo, useRef, useState } from 'react';45interface UseSessionStorageOptions<T> {6 serialize?: (value: T) => string;7 deserialize?: (value: string) => T;8}910/**11 * Hook to synchronize a value with sessionStorage in a type-safe, performant, and cross-tab reactive way.12 *13 * @param key sessionStorage key14 * @param initialValue Initial value15 * @param options Custom serialization/deserialization functions16 */17function useSessionStorage<T>(18 key: string,19 initialValue: T,20 options?: UseSessionStorageOptions<T>,21) {22 // Memoize serialize/deserialize to avoid unnecessary dependencies23 const serialize = useMemo(24 () => options?.serialize ?? JSON.stringify,25 [options?.serialize],26 );2728 const deserialize = useMemo(29 () => options?.deserialize ?? JSON.parse,30 [options?.deserialize],31 );3233 // Ref to keep the initial value stable34 const initialRef = useRef(initialValue);3536 const readValue = useCallback((): T => {37 if (typeof window === 'undefined') return initialRef.current;3839 try {40 const item = window.sessionStorage.getItem(key);4142 return item != null ? (deserialize(item) as T) : initialRef.current;43 } catch (error) {44 console.warn(45 `[useSessionStorage] Error reading key "${key}" from sessionStorage:`,46 error,47 );4849 return initialRef.current;50 }51 }, [key, deserialize]);5253 // State synchronized with sessionStorage54 const [storedValue, setStoredValue] = useState<T>(readValue);5556 const setValue = useCallback(57 (value: T | ((val: T) => T)) => {58 try {59 setStoredValue((prev) => {60 const valueToStore = value instanceof Function ? value(prev) : value;6162 window.sessionStorage.setItem(key, serialize(valueToStore));6364 return valueToStore;65 });66 } catch (error) {67 console.warn(68 `[useSessionStorage] Error setting key "${key}" in sessionStorage:`,69 error,70 );71 }72 },73 [key, serialize],74 );7576 // Synchronize between tabs77 useEffect(() => {78 const handleStorage = (event: StorageEvent) => {79 if (event.storageArea === window.sessionStorage && event.key === key) {80 setStoredValue(readValue());81 }82 };8384 window.addEventListener('storage', handleStorage);8586 return () => window.removeEventListener('storage', handleStorage);87 }, [key, readValue]);8889 // Update the value if the key changes90 useEffect(() => {91// … truncated
Files it writes
More from guarahooks
All 100 items| Component | Registry | Kind | Access | Installs | Command |
|---|---|---|---|---|---|
| UseAbortControlleruse-abort-controller | guarahooks | Hooks | Free | no deps | |
| UseArrayStateuse-array-state | guarahooks | Hooks | Free | no deps | |
| UseAxiosuse-axios | guarahooks | Hooks | Free | no deps | |
| UseBatteryStatususe-battery-status | guarahooks | Hooks | Free | no deps | |
| UseBetterAuthuse-better-auth | guarahooks | Hooks | Free | no deps | |
| UseClickOutsideuse-click-outside | guarahooks | Hooks | Free | no deps | |
| UseConfirmuse-confirm | guarahooks | Hooks | Free | no deps | |
| UseCookieuse-cookie | guarahooks | Hooks | Free | no deps |
