UNPKG

@technicalshree/use-localstorage

Version:

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

72 lines (69 loc) 3.43 kB
type StorageLike = Pick<Storage, 'getItem' | 'setItem' | 'removeItem'>; type CookieSameSite = 'strict' | 'lax' | 'none'; interface CookieAttributes { domain?: string; path?: string; expires?: Date | string; maxAge?: number; sameSite?: CookieSameSite; secure?: boolean; } interface CookieHandlers { getCookieString?: () => string | undefined; setCookieString?: (cookie: string) => void; } interface CookieStorageConfig { handlers?: CookieHandlers; attributes?: CookieAttributes; } type InitialValue<T> = T | (() => T); type SetValue<T> = T | ((previous: T) => T) | undefined; interface ExpiryEvent { type: 'expiry'; key: string; } interface UseSyncedStorageErrorContext { operation: 'read' | 'write' | 'remove' | 'serialize' | 'deserialize' | 'migrate'; key: string; } interface UseSyncedStorageOptions<T> { storage?: StorageLike | Storage | 'local' | 'session' | 'memory' | 'cookie'; cookie?: CookieStorageConfig; serializer?: (value: T) => string; deserializer?: (value: string) => T; ttl?: number; onExpire?: (info: { key: string; }) => void; onError?: (error: unknown, context: UseSyncedStorageErrorContext) => void; onExternalChange?: (info: { key: string; value: T | undefined; event?: StorageEvent | ExpiryEvent; }) => void; version?: number; migrate?: (value: T, storedVersion: number | undefined) => T; } type UseSyncedStorageReturn<T> = readonly [T, UseLocalStorageSetter<T>]; interface UseLocalStorageOptions<T> extends Omit<UseSyncedStorageOptions<T>, 'storage'> { } interface UseCookieStorageOptions<T> extends Omit<UseSyncedStorageOptions<T>, 'storage'> { cookie?: CookieStorageConfig; } type UseLocalStorageSetter<T> = (value: SetValue<T>) => void; type UseLocalStorageReturn<T> = readonly [T, UseLocalStorageSetter<T>]; interface UseObjectLocalStorageHelpers<T extends Record<string, unknown>> { setPartial: (update: Partial<T> | ((previous: Readonly<T>) => Partial<T>)) => void; reset: () => void; } type UseObjectLocalStorageReturn<T extends Record<string, unknown>> = readonly [ T, UseLocalStorageSetter<T>, UseObjectLocalStorageHelpers<T> ]; declare const createCookieStorage: (config?: CookieStorageConfig) => StorageLike; declare function useSyncedStorage<T>(key: string, initialValue: InitialValue<T>, options?: UseSyncedStorageOptions<T>): UseSyncedStorageReturn<T>; declare function useLocalStorage<T>(key: string, initialValue: InitialValue<T>, options?: UseLocalStorageOptions<T>): UseLocalStorageReturn<T>; declare function useObjectLocalStorage<T extends Record<string, unknown>>(key: string, initialValue: InitialValue<T>, options?: UseLocalStorageOptions<T>): UseObjectLocalStorageReturn<T>; declare function useCookieStorage<T>(key: string, initialValue: InitialValue<T>, options?: UseCookieStorageOptions<T>): UseLocalStorageReturn<T>; export { type CookieAttributes, type CookieHandlers, type CookieStorageConfig, type ExpiryEvent, type UseCookieStorageOptions, type UseLocalStorageOptions, type UseLocalStorageReturn, type UseLocalStorageSetter, type UseObjectLocalStorageHelpers, type UseObjectLocalStorageReturn, type UseSyncedStorageErrorContext, type UseSyncedStorageOptions, type UseSyncedStorageReturn, createCookieStorage, useLocalStorage as default, useCookieStorage, useLocalStorage, useObjectLocalStorage, useSyncedStorage };