useSessionStorage
hookas/use-session-storageFreeHook
A hook to store data in the browser's session storage
Install it
npx shadcn@latest add https://hookas.letstri.dev/r/use-session-storage.jsonSource
1'use client'23import * as React from 'react'45export function sessionStorageValue<T>(key: string, defaultValue: T) {6 return {7 get(): T {8 if (typeof window === 'undefined') {9 return defaultValue10 }1112 const item = window.sessionStorage.getItem(key)1314 if (item === null) {15 return defaultValue16 }1718 try {19 return JSON.parse(item)20 }21 catch {22 return typeof defaultValue === 'string' ? item as T : defaultValue23 }24 },25 set(value: T): void {26 if (typeof window !== 'undefined') {27 window.sessionStorage.setItem(key, JSON.stringify(value))28 window.dispatchEvent(new Event('storage'))29 }30 },31 remove(): void {32 if (typeof window !== 'undefined') {33 window.sessionStorage.removeItem(key)34 window.dispatchEvent(new Event('storage'))35 }36 },37 }38}3940export function useSessionStorage<T>(key: string, defaultValue: T | (() => T)) {41 const value = React.useMemo(() => {42 const defaultVal = typeof defaultValue === 'function' ? (defaultValue as () => T)() : defaultValue43 return sessionStorageValue(key, defaultVal)44 }, [key, defaultValue])45 const [storedValue, setStoredValue] = React.useState(value.get)46 const setValue = React.useCallback((newValue: T | ((val: T) => T)) => {47 value.set(typeof newValue === 'function' ? (newValue as (val: T) => T)(storedValue) : newValue)48 }, [value, storedValue])4950 React.useEffect(() => {51 const abortController = new AbortController()5253 window.addEventListener('storage', () => {54 setStoredValue(value.get)55 }, { signal: abortController.signal })5657 return () => {58 abortController.abort()59 }60 }, [value, setStoredValue])6162 return [storedValue, setValue] as const63}
Files it writes
More from hookas
All 30 items| Component | Registry | Kind | Access | Installs | Command |
|---|---|---|---|---|---|
| useAsyncEffectuse-async-effect | hookas | Hooks | Free | no deps | |
| useClickOutsideuse-click-outside | hookas | Hooks | Free | no deps | |
| useDebounceCallbackuse-debounced-callback | hookas | Hooks | Free | no deps | |
| useDebounceMemouse-debounced-memo | hookas | Hooks | Free | no deps | |
| useDebounceStateuse-debounced-state | hookas | Hooks | Free | no deps | |
| useElementSizeuse-element-size | hookas | Hooks | Free | no deps | |
| useFullscreenuse-fullscreen | hookas | Hooks | Free | no deps | |
| useIntervaluse-interval | hookas | Hooks | Free | no deps |
