UNPKG

@technicalshree/use-localstorage

Version:

Feature-rich React hook that keeps state synchronised with localStorage across tabs and sessions.

1 lines 36 kB
{"version":3,"sources":["../src/index.ts"],"sourcesContent":["import { useCallback, useEffect, useMemo, useRef, useState } from 'react';\n\ntype StorageLike = Pick<Storage, 'getItem' | 'setItem' | 'removeItem'>;\n\ntype CookieSameSite = 'strict' | 'lax' | 'none';\n\nexport interface CookieAttributes {\n domain?: string;\n path?: string;\n expires?: Date | string;\n maxAge?: number;\n sameSite?: CookieSameSite;\n secure?: boolean;\n}\n\nexport interface CookieHandlers {\n getCookieString?: () => string | undefined;\n setCookieString?: (cookie: string) => void;\n}\n\nexport interface CookieStorageConfig {\n handlers?: CookieHandlers;\n attributes?: CookieAttributes;\n}\n\ntype InitialValue<T> = T | (() => T);\n\ntype SetValue<T> = T | ((previous: T) => T) | undefined;\n\nconst SYNC_FLAG = '__useSyncedStorage_v1__';\nconst UNINITIALIZED = Symbol('useSyncedStorage.uninitialized');\n\ninterface StoredEnvelopeMeta {\n expiresAt?: number;\n version?: number;\n}\n\ninterface StoredEnvelope {\n [SYNC_FLAG]: true;\n data: string;\n meta?: StoredEnvelopeMeta;\n}\n\ninterface ResolvedStorage {\n storage: StorageLike;\n listenToStorageEvent: boolean;\n}\n\ninterface InterpretResult<T> {\n kind: 'empty' | 'expired' | 'ok' | 'legacy' | 'error';\n value?: T;\n meta?: StoredEnvelopeMeta | null;\n}\n\ninterface PendingWrite<T> {\n value: T;\n expiresAt?: number;\n}\n\nexport interface ExpiryEvent {\n type: 'expiry';\n key: string;\n}\n\nexport interface UseSyncedStorageErrorContext {\n operation: 'read' | 'write' | 'remove' | 'serialize' | 'deserialize' | 'migrate';\n key: string;\n}\n\nexport interface UseSyncedStorageOptions<T> {\n storage?: StorageLike | Storage | 'local' | 'session' | 'memory' | 'cookie';\n cookie?: CookieStorageConfig;\n serializer?: (value: T) => string;\n deserializer?: (value: string) => T;\n ttl?: number;\n onExpire?: (info: { key: string }) => void;\n onError?: (error: unknown, context: UseSyncedStorageErrorContext) => void;\n onExternalChange?: (info: {\n key: string;\n value: T | undefined;\n event?: StorageEvent | ExpiryEvent;\n }) => void;\n version?: number;\n migrate?: (value: T, storedVersion: number | undefined) => T;\n}\n\nexport type UseSyncedStorageReturn<T> = readonly [T, UseLocalStorageSetter<T>];\n\nexport interface UseLocalStorageOptions<T>\n extends Omit<UseSyncedStorageOptions<T>, 'storage'> {}\n\nexport interface UseCookieStorageOptions<T>\n extends Omit<UseSyncedStorageOptions<T>, 'storage'> {\n cookie?: CookieStorageConfig;\n}\n\nexport type UseLocalStorageSetter<T> = (value: SetValue<T>) => void;\n\nexport type UseLocalStorageReturn<T> = readonly [T, UseLocalStorageSetter<T>];\n\nexport interface UseObjectLocalStorageHelpers<T extends Record<string, unknown>> {\n setPartial: (\n update: Partial<T> | ((previous: Readonly<T>) => Partial<T>)\n ) => void;\n reset: () => void;\n}\n\nexport type UseObjectLocalStorageReturn<T extends Record<string, unknown>> = readonly [\n T,\n UseLocalStorageSetter<T>,\n UseObjectLocalStorageHelpers<T>\n];\n\nconst defaultSerializer = <T,>(value: T): string => JSON.stringify(value);\nconst defaultDeserializer = <T,>(raw: string): T => JSON.parse(raw) as T;\n\nconst createMemoryStorage = (): StorageLike => {\n const store = new Map<string, string>();\n return {\n getItem(key) {\n return store.has(key) ? store.get(key)! : null;\n },\n setItem(key, value) {\n store.set(key, value);\n },\n removeItem(key) {\n store.delete(key);\n }\n };\n};\n\nconst MEMORY_STORAGE = createMemoryStorage();\n\nconst DEFAULT_COOKIE_PATH = '/';\n\nconst normaliseSameSite = (value: CookieSameSite | undefined): CookieSameSite | undefined => {\n if (!value) {\n return undefined;\n }\n\n const normalised = value.toLowerCase() as CookieSameSite;\n if (normalised === 'none' || normalised === 'lax' || normalised === 'strict') {\n return normalised;\n }\n return undefined;\n};\n\nconst toUTCString = (input: Date | string): string => {\n if (input instanceof Date) {\n return input.toUTCString();\n }\n const parsed = new Date(input);\n return Number.isNaN(parsed.getTime()) ? new Date(input).toUTCString() : parsed.toUTCString();\n};\n\nconst serialiseCookie = (\n key: string,\n value: string,\n attributes: CookieAttributes,\n removal = false\n): string => {\n const segments: string[] = [\n `${encodeURIComponent(key)}=${encodeURIComponent(value)}`\n ];\n\n const path = attributes.path ?? DEFAULT_COOKIE_PATH;\n if (path) {\n segments.push(`Path=${path}`);\n }\n\n if (attributes.domain) {\n segments.push(`Domain=${attributes.domain}`);\n }\n\n if (attributes.secure) {\n segments.push('Secure');\n }\n\n const sameSite = normaliseSameSite(attributes.sameSite);\n if (sameSite) {\n segments.push(`SameSite=${sameSite.charAt(0).toUpperCase()}${sameSite.slice(1)}`);\n }\n\n if (removal) {\n segments.push('Expires=Thu, 01 Jan 1970 00:00:00 GMT');\n segments.push('Max-Age=0');\n } else {\n if (attributes.expires) {\n segments.push(`Expires=${toUTCString(attributes.expires)}`);\n }\n if (attributes.maxAge !== undefined) {\n segments.push(`Max-Age=${Math.max(0, Math.floor(attributes.maxAge))}`);\n }\n }\n\n return segments.join('; ');\n};\n\nconst parseCookieString = (cookieString: string, target: Map<string, string>) => {\n target.clear();\n if (!cookieString) {\n return;\n }\n\n cookieString.split(';').forEach(entry => {\n const part = entry.trim();\n if (!part) {\n return;\n }\n\n const separatorIndex = part.indexOf('=');\n if (separatorIndex === -1) {\n return;\n }\n\n const name = decodeURIComponent(part.slice(0, separatorIndex).trim());\n const rawValue = part.slice(separatorIndex + 1);\n target.set(name, decodeURIComponent(rawValue));\n });\n};\n\nexport const createCookieStorage = (config: CookieStorageConfig = {}): StorageLike => {\n const attributes: CookieAttributes = {\n path: DEFAULT_COOKIE_PATH,\n ...config.attributes\n };\n\n const getCookieString = config.handlers?.getCookieString\n ? () => config.handlers?.getCookieString?.() ?? ''\n : () => {\n if (typeof document === 'undefined') {\n return '';\n }\n try {\n return document.cookie ?? '';\n } catch (error) {\n return '';\n }\n };\n\n const setCookieString = config.handlers?.setCookieString\n ? (cookie: string) => {\n config.handlers?.setCookieString?.(cookie);\n }\n : (cookie: string) => {\n if (typeof document === 'undefined') {\n return;\n }\n try {\n document.cookie = cookie;\n } catch (error) {\n // no-op: silent failure keeps in-memory cache consistent\n }\n };\n\n const state = new Map<string, string>();\n let initialised = false;\n let dirty = false;\n let lastSnapshot: string | null = null;\n\n const initialise = () => {\n if (initialised) {\n return;\n }\n const snapshot = getCookieString();\n parseCookieString(snapshot ?? '', state);\n lastSnapshot = snapshot ?? '';\n initialised = true;\n };\n\n const refreshFromSource = () => {\n if (dirty) {\n return;\n }\n\n const snapshot = getCookieString();\n if (snapshot === undefined || snapshot === lastSnapshot) {\n return;\n }\n\n parseCookieString(snapshot, state);\n lastSnapshot = snapshot;\n };\n\n const markDirty = () => {\n dirty = true;\n };\n\n const clearDirty = () => {\n dirty = false;\n const snapshot = getCookieString();\n if (snapshot === undefined) {\n return;\n }\n\n if (snapshot !== lastSnapshot) {\n parseCookieString(snapshot, state);\n lastSnapshot = snapshot;\n }\n };\n\n return {\n getItem(key) {\n initialise();\n refreshFromSource();\n return state.has(key) ? state.get(key)! : null;\n },\n setItem(key, value) {\n initialise();\n state.set(key, value);\n markDirty();\n setCookieString(serialiseCookie(key, value, attributes));\n clearDirty();\n },\n removeItem(key) {\n initialise();\n state.delete(key);\n markDirty();\n setCookieString(serialiseCookie(key, '', attributes, true));\n clearDirty();\n }\n };\n};\n\nconst resolveInitial = <T,>(value: InitialValue<T>): T =>\n value instanceof Function ? value() : value;\n\nconst isEnvelope = (payload: unknown): payload is StoredEnvelope => {\n return (\n !!payload &&\n typeof payload === 'object' &&\n SYNC_FLAG in (payload as Record<string, unknown>)\n );\n};\n\nconst interpretStoredValue = <T,>(\n raw: string | null,\n options: UseSyncedStorageOptions<T> | undefined,\n reportError: (error: unknown, operation: UseSyncedStorageErrorContext['operation']) => void\n): InterpretResult<T> => {\n if (raw === null) {\n return { kind: 'empty' };\n }\n\n let parsed: unknown;\n\n try {\n parsed = JSON.parse(raw);\n } catch (error) {\n reportError(error, 'read');\n return { kind: 'error' };\n }\n\n if (isEnvelope(parsed)) {\n const envelope = parsed as StoredEnvelope;\n const meta = envelope.meta ?? null;\n\n if (meta?.expiresAt !== undefined && meta.expiresAt <= Date.now()) {\n return { kind: 'expired', meta };\n }\n\n const deserializer = options?.deserializer ?? defaultDeserializer<T>;\n\n try {\n const value = deserializer(envelope.data);\n return { kind: 'ok', value, meta };\n } catch (error) {\n reportError(error, 'deserialize');\n return { kind: 'error' };\n }\n }\n\n return { kind: 'legacy', value: parsed as T, meta: null };\n};\n\nconst isStorageLike = (candidate: unknown): candidate is StorageLike => {\n if (!candidate || typeof candidate !== 'object') {\n return false;\n }\n\n return ['getItem', 'setItem', 'removeItem'].every(key =>\n typeof (candidate as Record<string, unknown>)[key] === 'function'\n );\n};\n\nconst resolveStorage = (\n options?: UseSyncedStorageOptions<unknown>\n): ResolvedStorage => {\n const canUseDom = typeof window !== 'undefined';\n const source = options?.storage ?? (options?.cookie ? 'cookie' : undefined);\n\n if (!source || source === 'local') {\n if (canUseDom && typeof window !== 'undefined' && window.localStorage) {\n return { storage: window.localStorage, listenToStorageEvent: true };\n }\n return { storage: MEMORY_STORAGE, listenToStorageEvent: false };\n }\n\n if (source === 'session') {\n if (canUseDom && typeof window !== 'undefined' && window.sessionStorage) {\n return { storage: window.sessionStorage, listenToStorageEvent: true };\n }\n return { storage: MEMORY_STORAGE, listenToStorageEvent: false };\n }\n\n if (source === 'memory') {\n return { storage: MEMORY_STORAGE, listenToStorageEvent: false };\n }\n\n if (source === 'cookie') {\n return {\n storage: createCookieStorage(options?.cookie),\n listenToStorageEvent: false\n };\n }\n\n if (isStorageLike(source)) {\n const listenToStorageEvent =\n canUseDom &&\n (source === window.localStorage || source === window.sessionStorage);\n return { storage: source, listenToStorageEvent };\n }\n\n return { storage: MEMORY_STORAGE, listenToStorageEvent: false };\n};\n\nexport function useSyncedStorage<T>(\n key: string,\n initialValue: InitialValue<T>,\n options?: UseSyncedStorageOptions<T>\n): UseSyncedStorageReturn<T> {\n const optionsRef = useRef(options);\n useEffect(() => {\n optionsRef.current = options;\n }, [options]);\n\n const storageTarget = options?.storage;\n const cookieConfig = options?.cookie;\n\n const resolvedStorage = useMemo(\n () => resolveStorage({ storage: storageTarget, cookie: cookieConfig }),\n [storageTarget, cookieConfig]\n );\n\n const fallbackRef = useRef<T | typeof UNINITIALIZED>(UNINITIALIZED);\n const metadataRef = useRef<StoredEnvelopeMeta | null>(null);\n const pendingWriteRef = useRef<PendingWrite<T> | null>(null);\n const expiryTimeoutRef = useRef<number | null>(null);\n const previousKeyRef = useRef(key);\n\n const clearExpiryTimerRef = useRef<() => void>(() => undefined);\n const scheduleExpiryRef = useRef<(expiresAt?: number) => void>(() => undefined);\n\n const getFallback = useCallback((): T => {\n if (fallbackRef.current === UNINITIALIZED) {\n fallbackRef.current = resolveInitial(initialValue);\n }\n\n return fallbackRef.current as T;\n }, [initialValue]);\n\n const reportError = useCallback(\n (error: unknown, operation: UseSyncedStorageErrorContext['operation']) => {\n if (process.env.NODE_ENV !== 'production') {\n console.warn(`useSyncedStorage: ${operation} error for key \"${key}\"`, error);\n }\n\n optionsRef.current?.onError?.(error, { operation, key });\n },\n [key]\n );\n\n const removeItem = useCallback(() => {\n try {\n resolvedStorage.storage.removeItem(key);\n } catch (error) {\n reportError(error, 'remove');\n }\n }, [key, reportError, resolvedStorage.storage]);\n\n const writeValue = useCallback(\n (value: T, preservedExpiresAt?: number): T | undefined => {\n const currentOptions = optionsRef.current;\n const serializer = currentOptions?.serializer ?? defaultSerializer<T>;\n\n let serialized: string;\n try {\n serialized = serializer(value);\n } catch (error) {\n reportError(error, 'serialize');\n return undefined;\n }\n\n let expiresAt = preservedExpiresAt;\n if (currentOptions?.ttl !== undefined) {\n expiresAt = Date.now() + currentOptions.ttl;\n }\n\n const meta: StoredEnvelopeMeta = {};\n\n if (currentOptions?.version !== undefined) {\n meta.version = currentOptions.version;\n }\n\n if (expiresAt !== undefined) {\n meta.expiresAt = expiresAt;\n }\n\n const envelope: StoredEnvelope = {\n [SYNC_FLAG]: true,\n data: serialized\n };\n\n if (meta.version !== undefined || meta.expiresAt !== undefined) {\n envelope.meta = meta;\n }\n\n let payload: string;\n try {\n payload = JSON.stringify(envelope);\n } catch (error) {\n reportError(error, 'serialize');\n return undefined;\n }\n\n try {\n resolvedStorage.storage.setItem(key, payload);\n } catch (error) {\n reportError(error, 'write');\n return undefined;\n }\n\n metadataRef.current = envelope.meta ?? null;\n scheduleExpiryRef.current(meta.expiresAt);\n\n return value;\n },\n [key, reportError, resolvedStorage.storage]\n );\n\n const interpretAndResolve = useCallback((): T => {\n const fallback = getFallback();\n let raw: string | null = null;\n\n try {\n raw = resolvedStorage.storage.getItem(key);\n } catch (error) {\n reportError(error, 'read');\n metadataRef.current = null;\n return fallback;\n }\n\n const result = interpretStoredValue(raw, optionsRef.current, reportError);\n\n if (result.kind === 'empty') {\n metadataRef.current = null;\n return fallback;\n }\n\n if (result.kind === 'error') {\n metadataRef.current = null;\n return fallback;\n }\n\n if (result.kind === 'expired') {\n metadataRef.current = null;\n fallbackRef.current = UNINITIALIZED;\n removeItem();\n const expiryEvent: ExpiryEvent = { type: 'expiry', key };\n optionsRef.current?.onExpire?.({ key });\n optionsRef.current?.onExternalChange?.({\n key,\n value: undefined,\n event: expiryEvent\n });\n return getFallback();\n }\n\n metadataRef.current = result.meta ?? null;\n\n const currentOptions = optionsRef.current;\n let value = result.value as T;\n const targetVersion = currentOptions?.version;\n const storedVersion = result.meta?.version;\n\n if (\n targetVersion !== undefined &&\n targetVersion !== storedVersion &&\n currentOptions?.migrate\n ) {\n try {\n value = currentOptions.migrate(value, storedVersion);\n pendingWriteRef.current = {\n value,\n expiresAt: result.meta?.expiresAt\n };\n } catch (error) {\n reportError(error, 'migrate');\n return fallback;\n }\n }\n\n return value;\n }, [getFallback, key, removeItem, reportError, resolvedStorage.storage]);\n\n const [storedValue, setStoredValue] = useState<T>(interpretAndResolve);\n\n const clearExpiryTimer = useCallback(() => {\n if (expiryTimeoutRef.current !== null) {\n clearTimeout(expiryTimeoutRef.current);\n expiryTimeoutRef.current = null;\n }\n }, []);\n\n clearExpiryTimerRef.current = clearExpiryTimer;\n\n const handleExpiry = useCallback(\n (\n source: 'timer' | 'read' | 'external',\n details?: { event?: StorageEvent | ExpiryEvent; alreadyRemoved?: boolean }\n ) => {\n clearExpiryTimer();\n metadataRef.current = null;\n fallbackRef.current = UNINITIALIZED;\n\n if (!details?.alreadyRemoved) {\n removeItem();\n }\n\n if (source !== 'external') {\n optionsRef.current?.onExpire?.({ key });\n }\n\n const expiryEvent: ExpiryEvent = { type: 'expiry', key };\n const event = details?.event ?? expiryEvent;\n\n optionsRef.current?.onExternalChange?.({\n key,\n value: undefined,\n event\n });\n },\n [clearExpiryTimer, key, removeItem]\n );\n\n const scheduleExpiry = useCallback(\n (expiresAt?: number) => {\n clearExpiryTimer();\n\n if (expiresAt === undefined) {\n return;\n }\n\n if (typeof window === 'undefined') {\n return;\n }\n\n const delay = expiresAt - Date.now();\n\n if (delay <= 0) {\n handleExpiry('timer');\n const fallback = getFallback();\n setStoredValue(fallback);\n return;\n }\n\n expiryTimeoutRef.current = window.setTimeout(() => {\n handleExpiry('timer');\n const fallback = getFallback();\n setStoredValue(fallback);\n }, delay);\n },\n [clearExpiryTimer, getFallback, handleExpiry]\n );\n\n scheduleExpiryRef.current = scheduleExpiry;\n\n const setValue = useCallback(\n (value: SetValue<T>): void => {\n setStoredValue(previous => {\n const next = value instanceof Function ? value(previous) : value;\n\n if (next === undefined) {\n clearExpiryTimerRef.current();\n metadataRef.current = null;\n fallbackRef.current = UNINITIALIZED;\n removeItem();\n return getFallback();\n }\n\n const written = writeValue(next as T);\n return written ?? previous;\n });\n },\n [getFallback, removeItem, writeValue]\n );\n\n useEffect(() => {\n if (previousKeyRef.current === key) {\n return;\n }\n\n previousKeyRef.current = key;\n fallbackRef.current = UNINITIALIZED;\n setStoredValue(interpretAndResolve());\n }, [interpretAndResolve, key]);\n\n useEffect(() => {\n fallbackRef.current = UNINITIALIZED;\n setStoredValue(interpretAndResolve());\n }, [initialValue, interpretAndResolve]);\n\n useEffect(() => {\n const pendingWrite = pendingWriteRef.current;\n if (!pendingWrite) {\n return;\n }\n\n pendingWriteRef.current = null;\n writeValue(pendingWrite.value, pendingWrite.expiresAt);\n }, [writeValue, storedValue]);\n\n useEffect(() => {\n const expiresAt = metadataRef.current?.expiresAt;\n\n if (expiresAt === undefined) {\n clearExpiryTimer();\n return;\n }\n\n scheduleExpiry(expiresAt);\n }, [clearExpiryTimer, scheduleExpiry, storedValue]);\n\n useEffect(() => {\n if (!resolvedStorage.listenToStorageEvent || typeof window === 'undefined') {\n return;\n }\n\n const handleStorageChange = (event: StorageEvent) => {\n if (event.key !== key || event.storageArea !== resolvedStorage.storage) {\n return;\n }\n\n if (event.newValue === null) {\n handleExpiry('external', { event, alreadyRemoved: true });\n const fallback = getFallback();\n setStoredValue(fallback);\n return;\n }\n\n const result = interpretStoredValue(\n event.newValue,\n optionsRef.current,\n reportError\n );\n\n if (result.kind === 'error') {\n return;\n }\n\n if (result.kind === 'expired') {\n handleExpiry('external', { event, alreadyRemoved: true });\n const fallback = getFallback();\n setStoredValue(fallback);\n return;\n }\n\n metadataRef.current = result.meta ?? null;\n\n const currentOptions = optionsRef.current;\n let value = result.value as T;\n const targetVersion = currentOptions?.version;\n const storedVersion = result.meta?.version;\n\n if (\n targetVersion !== undefined &&\n targetVersion !== storedVersion &&\n currentOptions?.migrate\n ) {\n try {\n value = currentOptions.migrate(value, storedVersion);\n pendingWriteRef.current = {\n value,\n expiresAt: result.meta?.expiresAt\n };\n } catch (error) {\n reportError(error, 'migrate');\n return;\n }\n }\n\n optionsRef.current?.onExternalChange?.({ key, value, event });\n setStoredValue(value);\n };\n\n window.addEventListener('storage', handleStorageChange);\n return () => window.removeEventListener('storage', handleStorageChange);\n }, [getFallback, handleExpiry, key, reportError, resolvedStorage.storage, resolvedStorage.listenToStorageEvent]);\n\n useEffect(() => () => clearExpiryTimer(), [clearExpiryTimer]);\n\n return [storedValue, setValue] as const;\n}\n\nexport function useLocalStorage<T>(\n key: string,\n initialValue: InitialValue<T>,\n options?: UseLocalStorageOptions<T>\n): UseLocalStorageReturn<T> {\n return useSyncedStorage(key, initialValue, { ...options, storage: 'local' });\n}\n\nexport function useObjectLocalStorage<T extends Record<string, unknown>>(\n key: string,\n initialValue: InitialValue<T>,\n options?: UseLocalStorageOptions<T>\n): UseObjectLocalStorageReturn<T> {\n const initialRef = useRef(initialValue);\n\n useEffect(() => {\n initialRef.current = initialValue;\n }, [initialValue]);\n\n const [value, setValue] = useLocalStorage<T>(key, initialValue, options);\n\n const setPartial = useCallback(\n (update: Partial<T> | ((previous: Readonly<T>) => Partial<T>)) => {\n setValue(previous => {\n const base = previous ?? resolveInitial(initialRef.current);\n const patch =\n update instanceof Function ? update(base as Readonly<T>) : update;\n return { ...base, ...patch } as T;\n });\n },\n [setValue]\n );\n\n const reset = useCallback(() => {\n setValue(undefined);\n }, [setValue]);\n\n return [value, setValue, { setPartial, reset }] as const;\n}\n\nexport default useLocalStorage;\n\nexport function useCookieStorage<T>(\n key: string,\n initialValue: InitialValue<T>,\n options?: UseCookieStorageOptions<T>\n): UseLocalStorageReturn<T> {\n return useSyncedStorage(key, initialValue, {\n ...options,\n storage: 'cookie'\n });\n}\n"],"mappings":"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","names":["_a","_b"]}