@djangocfg/ui-core 2.1.100 → 2.1.102

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/hooks/useCountdown.ts","../src/hooks/useDebouncedCallback.ts","../src/hooks/useDebounce.ts","../src/hooks/useDebugTools.ts","../src/hooks/useEventsBus.ts","../src/hooks/useMobile.tsx","../src/hooks/useMediaQuery.ts","../src/hooks/useToast.ts","../src/hooks/useCopy.ts","../src/hooks/useImageLoader.ts","../src/hooks/useResolvedTheme.ts","../src/hooks/useLocalStorage.ts","../src/hooks/useSessionStorage.ts"],"names":["useEffect","useState","useRef","toast","useCallback","key","isWrappedFormat","isExpired"],"mappings":"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","file":"hooks.mjs","sourcesContent":["'use client';\n\nimport moment from 'moment';\nimport { useEffect, useState } from 'react';\n\ninterface CountdownState {\n days: number;\n hours: number;\n minutes: number;\n seconds: number;\n isExpired: boolean;\n totalSeconds: number;\n}\n\nexport const useCountdown = (targetDate: string | null): CountdownState => {\n const [countdown, setCountdown] = useState<CountdownState>({\n days: 0,\n hours: 0,\n minutes: 0,\n seconds: 0,\n isExpired: false,\n totalSeconds: 0,\n });\n\n useEffect(() => {\n if (!targetDate) {\n return;\n }\n\n const target = moment.utc(targetDate);\n\n const updateCountdown = () => {\n const now = moment.utc();\n const diff = target.diff(now, 'seconds');\n\n if (diff <= 0) {\n setCountdown({\n days: 0,\n hours: 0,\n minutes: 0,\n seconds: 0,\n isExpired: true,\n totalSeconds: 0,\n });\n return;\n }\n\n const days = Math.floor(diff / (24 * 60 * 60));\n const hours = Math.floor((diff % (24 * 60 * 60)) / (60 * 60));\n const minutes = Math.floor((diff % (60 * 60)) / 60);\n const seconds = diff % 60;\n\n setCountdown({\n days,\n hours,\n minutes,\n seconds,\n isExpired: false,\n totalSeconds: diff,\n });\n };\n\n // Update immediately\n updateCountdown();\n\n // Update every second\n const interval = setInterval(updateCountdown, 1000);\n\n return () => clearInterval(interval);\n }, [targetDate]);\n\n return countdown;\n};\n","'use client';\n\nimport { useCallback, useEffect, useRef } from 'react';\n\n/**\n * Creates a debounced version of a callback function.\n *\n * @param callback The function to debounce.\n * @param delay The debounce delay in milliseconds.\n * @returns A debounced callback function.\n */\nexport function useDebouncedCallback<T extends (...args: any[]) => any>(\n callback: T,\n delay: number\n): (...args: Parameters<T>) => void {\n const callbackRef = useRef(callback);\n const timeoutRef = useRef<NodeJS.Timeout | null>(null);\n\n // Update ref when callback changes, but don't trigger effect\n useEffect(() => {\n callbackRef.current = callback;\n }, [callback]);\n\n // Cleanup timeout on unmount\n useEffect(() => {\n return () => {\n if (timeoutRef.current) {\n clearTimeout(timeoutRef.current);\n }\n };\n }, []);\n\n const debouncedCallback = useCallback(\n (...args: Parameters<T>) => {\n if (timeoutRef.current) {\n clearTimeout(timeoutRef.current);\n }\n\n timeoutRef.current = setTimeout(() => {\n callbackRef.current(...args);\n }, delay);\n },\n [delay]\n );\n\n // Add a cancel method to the debounced function\n // We attach it directly to the function object\n (debouncedCallback as any).cancel = useCallback(() => {\n if (timeoutRef.current) {\n clearTimeout(timeoutRef.current);\n timeoutRef.current = null;\n }\n }, []);\n\n return debouncedCallback;\n}\n\nexport default useDebouncedCallback; ","/**\n * useDebounce hook\n *\n * Debounces a value by delaying its update until after a specified delay.\n */\n\n'use client';\n\nimport { useEffect, useState } from 'react';\n\nexport function useDebounce<T>(value: T, delay: number = 300): T {\n const [debouncedValue, setDebouncedValue] = useState<T>(value);\n\n useEffect(() => {\n const handler = setTimeout(() => {\n setDebouncedValue(value);\n }, delay);\n\n return () => {\n clearTimeout(handler);\n };\n }, [value, delay]);\n\n return debouncedValue;\n}\n","'use client';\n\nimport { useDebugValue } from 'react';\n\ntype DebugValue = Record<string, unknown> | unknown[] | null | undefined;\n\nexport function useDebugTools(values: DebugValue, prefix = '') {\n if (values === null || values === undefined) {\n useDebugValue(values, () => `${prefix}: ${values === null ? 'null' : 'undefined'}`);\n return;\n }\n\n if (Array.isArray(values)) {\n values.forEach((value, index) => {\n useDebugValue(value, (v) => {\n const label = prefix ? `${prefix}[${index}]` : `[${index}]`;\n return `${label}: ${formatValue(v)}`;\n });\n });\n return;\n }\n\n if (typeof values === 'object') {\n for (const [key, value] of Object.entries(values)) {\n useDebugValue(value, (v) => {\n const label = prefix ? `${prefix}.${key}` : key;\n return `${label}: ${formatValue(v)}`;\n });\n }\n return;\n }\n\n // Handle primitive values\n useDebugValue(values, (v) => `${prefix}: ${formatValue(v)}`);\n}\n\nfunction formatValue(value: unknown): string {\n if (value === null) return 'null';\n if (value === undefined) return 'undefined';\n\n try {\n if (typeof value === 'object') {\n if (Array.isArray(value)) {\n return `Array(${value.length})`;\n }\n return JSON.stringify(value);\n }\n return String(value);\n } catch {\n return '[Unserializable]';\n }\n}\n","'use client';\n\nimport { useEffect, useRef } from 'react';\n\nexport type FormEvent<T extends string = string, P = any> = {\n type: T;\n payload?: P;\n timestamp?: number;\n};\n\ntype EventListener<T extends FormEvent> = (event: T) => void;\n\nclass EventBus {\n private listeners: Set<EventListener<any>> = new Set();\n\n publish<T extends FormEvent>(event: T) {\n this.listeners.forEach(listener => listener({\n ...event,\n timestamp: event.timestamp || Date.now(),\n }));\n }\n\n subscribe<T extends FormEvent>(listener: EventListener<T>) {\n this.listeners.add(listener);\n return () => {\n this.listeners.delete(listener);\n };\n }\n}\n\nexport const events = new EventBus();\n\nexport function useEventListener<T extends string, P>(\n eventType: T,\n handler: (payload: P) => void\n) {\n const savedHandler = useRef(handler);\n\n useEffect(() => {\n savedHandler.current = handler;\n }, [handler]);\n\n useEffect(() => {\n const listener = (event: FormEvent) => {\n if (event.type === eventType) {\n savedHandler.current(event.payload);\n }\n };\n\n const unsubscribe = events.subscribe(listener);\n return () => unsubscribe();\n }, [eventType]);\n}\n","'use client';\n\nimport * as React from 'react';\n\n// Увеличил breakpoint до 1024px чтобы включить планшеты\nconst MOBILE_BREAKPOINT = 1024\n\nexport function useIsMobile() {\n const [isMobile, setIsMobile] = React.useState<boolean | undefined>(undefined)\n\n React.useEffect(() => {\n const mql = window.matchMedia(`(max-width: ${MOBILE_BREAKPOINT - 1}px)`)\n const onChange = () => {\n setIsMobile(window.innerWidth < MOBILE_BREAKPOINT)\n }\n mql.addEventListener(\"change\", onChange)\n setIsMobile(window.innerWidth < MOBILE_BREAKPOINT)\n return () => mql.removeEventListener(\"change\", onChange)\n }, [])\n\n return !!isMobile\n}\n","'use client';\n\nimport { useEffect, useState } from 'react';\n\n/**\n * Hook to check if a media query matches\n *\n * @param query - CSS media query string\n * @returns boolean indicating if the query matches\n *\n * @example\n * const isMobile = useMediaQuery('(max-width: 768px)');\n * const prefersDark = useMediaQuery('(prefers-color-scheme: dark)');\n * const isLandscape = useMediaQuery('(orientation: landscape)');\n */\nexport function useMediaQuery(query: string): boolean {\n const [matches, setMatches] = useState<boolean>(false);\n\n useEffect(() => {\n const mediaQuery = window.matchMedia(query);\n\n // Set initial value\n setMatches(mediaQuery.matches);\n\n // Create event listener\n const handler = (event: MediaQueryListEvent) => {\n setMatches(event.matches);\n };\n\n // Add listener\n mediaQuery.addEventListener('change', handler);\n\n // Cleanup\n return () => {\n mediaQuery.removeEventListener('change', handler);\n };\n }, [query]);\n\n return matches;\n}\n","\"use client\"\n\n/**\n * Toast notifications using Sonner\n *\n * @example\n * import { toast } from '@djangocfg/ui-core/hooks';\n *\n * toast.success('Saved!');\n * toast.error('Error', { description: 'Details here' });\n * toast.promise(fetchData(), { loading: 'Loading...', success: 'Done!', error: 'Failed' });\n */\n\nimport { toast } from 'sonner';\n\n// Re-export types and toast from sonner\nexport { toast, type ExternalToast as ToastOptions } from 'sonner';\n\n// Hook for components using destructuring pattern: const { toast } = useToast()\ntype ToastFn = typeof toast;\nexport function useToast(): { toast: ToastFn; dismiss: ToastFn['dismiss'] } {\n return { toast, dismiss: toast.dismiss };\n}\n","'use client';\n\nimport { useCallback } from 'react';\n\nimport { useToast } from './useToast';\n\ninterface UseCopyOptions {\n successMessage?: string;\n errorMessage?: string;\n}\n\nexport const useCopy = (options: UseCopyOptions = {}) => {\n const { toast } = useToast();\n\n const {\n successMessage = \"Copied to clipboard\",\n errorMessage = \"Failed to copy to clipboard\"\n } = options;\n\n const copyToClipboard = useCallback(async (text: string, customSuccessMessage?: string) => {\n try {\n await navigator.clipboard.writeText(text);\n toast.success(customSuccessMessage || successMessage);\n return true;\n } catch (error) {\n console.error('Failed to copy:', error);\n toast.error(errorMessage);\n return false;\n }\n }, [toast, successMessage, errorMessage]);\n\n return { copyToClipboard };\n};\n","/**\n * Enhanced Image Loader Hook\n * \n * Hook to check if an image is loaded successfully with callback support\n */\n\n'use client';\n\nimport { useCallback, useEffect, useState } from 'react';\n\nexport interface ImageLoaderState {\n isLoading: boolean;\n isLoaded: boolean;\n hasError: boolean;\n}\n\nexport interface ImageLoaderCallbacks {\n onLoadStart?: () => void;\n onLoad?: (event: React.SyntheticEvent<HTMLImageElement>) => void;\n onError?: (event: React.SyntheticEvent<HTMLImageElement>) => void;\n}\n\nexport const useImageLoader = (\n src?: string, \n callbacks?: ImageLoaderCallbacks\n): ImageLoaderState => {\n const [state, setState] = useState<ImageLoaderState>({\n isLoading: false,\n isLoaded: false,\n hasError: false,\n });\n\n const handleLoad = useCallback((event: Event) => {\n setState({\n isLoading: false,\n isLoaded: true,\n hasError: false,\n });\n \n // Call user callback if provided\n if (callbacks?.onLoad) {\n callbacks.onLoad(event as unknown as React.SyntheticEvent<HTMLImageElement>);\n }\n }, [callbacks?.onLoad]);\n\n const handleError = useCallback((event: Event) => {\n setState({\n isLoading: false,\n isLoaded: false,\n hasError: true,\n });\n \n // Call user callback if provided\n if (callbacks?.onError) {\n callbacks.onError(event as unknown as React.SyntheticEvent<HTMLImageElement>);\n }\n }, [callbacks?.onError]);\n\n useEffect(() => {\n if (!src) {\n setState({\n isLoading: false,\n isLoaded: false,\n hasError: true,\n });\n return;\n }\n\n setState({\n isLoading: true,\n isLoaded: false,\n hasError: false,\n });\n\n // Call load start callback\n if (callbacks?.onLoadStart) {\n callbacks.onLoadStart();\n }\n\n const img = new Image();\n \n img.addEventListener('load', handleLoad);\n img.addEventListener('error', handleError);\n \n img.src = src;\n\n // Cleanup function\n return () => {\n img.removeEventListener('load', handleLoad);\n img.removeEventListener('error', handleError);\n };\n }, [src, handleLoad, handleError, callbacks?.onLoadStart]);\n\n return state;\n};\n","'use client';\n\nimport { useEffect, useState } from 'react';\n\nexport type ResolvedTheme = 'light' | 'dark';\n\n/**\n * Hook to detect the current resolved theme (light or dark)\n *\n * Standalone hook - doesn't require ThemeProvider.\n * Detects theme from:\n * 1. 'dark' class on html element\n * 2. System preference (prefers-color-scheme)\n *\n * For full theme control (setTheme, toggleTheme), use useThemeContext instead.\n *\n * @example\n * ```tsx\n * const theme = useResolvedTheme(); // 'light' | 'dark'\n * ```\n */\nexport const useResolvedTheme = (): ResolvedTheme => {\n const [theme, setTheme] = useState<ResolvedTheme>('light');\n\n useEffect(() => {\n const checkTheme = (): ResolvedTheme => {\n // Check if dark class is applied to html element\n if (document.documentElement.classList.contains('dark')) {\n return 'dark';\n }\n\n // Check system preference\n if (window.matchMedia('(prefers-color-scheme: dark)').matches) {\n return 'dark';\n }\n\n return 'light';\n };\n\n // Set initial theme\n setTheme(checkTheme());\n\n // Listen for class changes on html element\n const observer = new MutationObserver(() => {\n setTheme(checkTheme());\n });\n\n observer.observe(document.documentElement, {\n attributes: true,\n attributeFilter: ['class']\n });\n\n // Listen for system theme changes\n const mediaQuery = window.matchMedia('(prefers-color-scheme: dark)');\n const handleMediaChange = () => {\n setTheme(checkTheme());\n };\n\n mediaQuery.addEventListener('change', handleMediaChange);\n\n return () => {\n observer.disconnect();\n mediaQuery.removeEventListener('change', handleMediaChange);\n };\n }, []);\n\n return theme;\n};\n","'use client';\n\nimport { useEffect, useRef, useState } from 'react';\n\n/**\n * Storage wrapper format with metadata\n * Used when TTL is specified\n */\ninterface StorageWrapper<T> {\n _meta: {\n createdAt: number;\n ttl: number;\n };\n _value: T;\n}\n\n/**\n * Options for useLocalStorage hook\n */\nexport interface UseLocalStorageOptions {\n /**\n * Time-to-live in milliseconds.\n * After this time, value is considered expired and initialValue is returned.\n * Data is automatically cleaned up on next read.\n * @example 24 * 60 * 60 * 1000 // 24 hours\n */\n ttl?: number;\n}\n\n/**\n * Check if data is in new wrapped format with _meta\n */\nfunction isWrappedFormat<T>(data: unknown): data is StorageWrapper<T> {\n return (\n data !== null &&\n typeof data === 'object' &&\n '_meta' in data &&\n '_value' in data &&\n typeof (data as StorageWrapper<T>)._meta === 'object' &&\n typeof (data as StorageWrapper<T>)._meta.createdAt === 'number'\n );\n}\n\n/**\n * Check if wrapped data is expired\n */\nfunction isExpired<T>(wrapped: StorageWrapper<T>): boolean {\n if (!wrapped._meta.ttl) return false;\n const age = Date.now() - wrapped._meta.createdAt;\n return age > wrapped._meta.ttl;\n}\n\n/**\n * Simple localStorage hook with better error handling and optional TTL support\n *\n * IMPORTANT: To prevent hydration mismatch, this hook:\n * - Always returns initialValue on first render (same as SSR)\n * - Reads from localStorage only after component mounts\n *\n * @param key - Storage key\n * @param initialValue - Default value if key doesn't exist\n * @param options - Optional configuration (ttl for auto-expiration)\n * @returns [value, setValue, removeValue] - Current value, setter function, and remove function\n *\n * @example\n * // Without TTL (backwards compatible)\n * const [value, setValue] = useLocalStorage('key', 'default');\n *\n * @example\n * // With TTL (24 hours)\n * const [value, setValue] = useLocalStorage('key', 'default', {\n * ttl: 24 * 60 * 60 * 1000\n * });\n */\nexport function useLocalStorage<T>(\n key: string,\n initialValue: T,\n options?: UseLocalStorageOptions\n) {\n const ttl = options?.ttl;\n // Always start with initialValue to match SSR\n const [storedValue, setStoredValue] = useState<T>(initialValue);\n const [isHydrated, setIsHydrated] = useState(false);\n const isInitialized = useRef(false);\n\n // Read from localStorage after mount (avoids hydration mismatch)\n useEffect(() => {\n if (isInitialized.current) return;\n isInitialized.current = true;\n\n try {\n const item = window.localStorage.getItem(key);\n if (item !== null) {\n // Try to parse as JSON first, fallback to string\n try {\n const parsed = JSON.parse(item);\n\n // Check if new format with _meta\n if (isWrappedFormat<T>(parsed)) {\n // Check TTL expiration\n if (isExpired(parsed)) {\n // Expired! Clean up and use initial value\n window.localStorage.removeItem(key);\n // Keep initialValue (already set)\n } else {\n // Not expired, extract value\n setStoredValue(parsed._value);\n }\n } else {\n // Old format (backwards compatible)\n setStoredValue(parsed as T);\n }\n } catch {\n // If JSON.parse fails, return as string\n setStoredValue(item as T);\n }\n }\n } catch (error) {\n console.error(`Error reading localStorage key \"${key}\":`, error);\n }\n\n setIsHydrated(true);\n }, [key]);\n\n // Check data size and limit\n const checkDataSize = (data: any): boolean => {\n try {\n const jsonString = JSON.stringify(data);\n const sizeInBytes = new Blob([jsonString]).size;\n const sizeInKB = sizeInBytes / 1024;\n \n // Limit to 1MB per item\n if (sizeInKB > 1024) {\n console.warn(`Data size (${sizeInKB.toFixed(2)}KB) exceeds 1MB limit for key \"${key}\"`);\n return false;\n }\n \n return true;\n } catch (error) {\n console.error(`Error checking data size for key \"${key}\":`, error);\n return false;\n }\n };\n\n // Clear old data when localStorage is full\n const clearOldData = () => {\n try {\n const keys = Object.keys(localStorage).filter(key => key && typeof key === 'string');\n // Remove oldest items if we have more than 50 items\n if (keys.length > 50) {\n const itemsToRemove = Math.ceil(keys.length * 0.2);\n for (let i = 0; i < itemsToRemove; i++) {\n try {\n const key = keys[i];\n if (key) {\n localStorage.removeItem(key);\n }\n } catch {\n // Ignore errors when removing items\n }\n }\n }\n } catch (error) {\n console.error('Error clearing old localStorage data:', error);\n }\n };\n\n // Force clear all data if quota is exceeded\n const forceClearAll = () => {\n try {\n const keys = Object.keys(localStorage);\n for (const key of keys) {\n try {\n localStorage.removeItem(key);\n } catch {\n // Ignore errors when removing items\n }\n }\n } catch (error) {\n console.error('Error force clearing localStorage:', error);\n }\n };\n\n // Prepare data for storage (with or without TTL wrapper)\n const prepareForStorage = (value: T): string => {\n if (ttl) {\n // Wrap with _meta for TTL support\n const wrapped: StorageWrapper<T> = {\n _meta: {\n createdAt: Date.now(),\n ttl,\n },\n _value: value,\n };\n return JSON.stringify(wrapped);\n }\n // Old format (no wrapper) - for strings, store directly\n if (typeof value === 'string') {\n return value;\n }\n return JSON.stringify(value);\n };\n\n // Update localStorage when value changes\n const setValue = (value: T | ((val: T) => T)) => {\n try {\n const valueToStore = value instanceof Function ? value(storedValue) : value;\n\n // Check data size before attempting to save\n if (!checkDataSize(valueToStore)) {\n console.warn(`Data size too large for key \"${key}\", removing key`);\n // Remove the key if data is too large\n try {\n window.localStorage.removeItem(key);\n } catch {\n // Ignore errors when removing\n }\n // Still update the state\n setStoredValue(valueToStore);\n return;\n }\n\n setStoredValue(valueToStore);\n\n if (typeof window !== 'undefined') {\n const dataToStore = prepareForStorage(valueToStore);\n\n // Try to set the value\n try {\n window.localStorage.setItem(key, dataToStore);\n } catch (storageError: any) {\n // If quota exceeded, clear old data and try again\n if (storageError.name === 'QuotaExceededError' ||\n storageError.code === 22 ||\n storageError.message?.includes('quota')) {\n console.warn('localStorage quota exceeded, clearing old data...');\n clearOldData();\n\n // Try again after clearing\n try {\n window.localStorage.setItem(key, dataToStore);\n } catch (retryError) {\n console.error(`Failed to set localStorage key \"${key}\" after clearing old data:`, retryError);\n // If still fails, force clear all and try one more time\n try {\n forceClearAll();\n window.localStorage.setItem(key, dataToStore);\n } catch (finalError) {\n console.error(`Failed to set localStorage key \"${key}\" after force clearing:`, finalError);\n // If still fails, just update the state without localStorage\n setStoredValue(valueToStore);\n }\n }\n } else {\n throw storageError;\n }\n }\n }\n } catch (error) {\n console.error(`Error setting localStorage key \"${key}\":`, error);\n // Still update the state even if localStorage fails\n const valueToStore = value instanceof Function ? value(storedValue) : value;\n setStoredValue(valueToStore);\n }\n };\n\n // Remove value from localStorage\n const removeValue = () => {\n try {\n setStoredValue(initialValue);\n if (typeof window !== 'undefined') {\n try {\n window.localStorage.removeItem(key);\n } catch (removeError: any) {\n // If removal fails due to quota, try to clear some data first\n if (removeError.name === 'QuotaExceededError' || \n removeError.code === 22 || \n removeError.message?.includes('quota')) {\n console.warn('localStorage quota exceeded during removal, clearing old data...');\n clearOldData();\n\n try {\n window.localStorage.removeItem(key);\n } catch (retryError) {\n console.error(`Failed to remove localStorage key \"${key}\" after clearing:`, retryError);\n // If still fails, force clear all\n forceClearAll();\n }\n } else {\n throw removeError;\n }\n }\n }\n } catch (error) {\n console.error(`Error removing localStorage key \"${key}\":`, error);\n }\n };\n\n return [storedValue, setValue, removeValue] as const;\n}\n","'use client';\n\nimport { useState } from 'react';\n\n/**\n * Storage wrapper format with metadata\n * Used when TTL is specified\n */\ninterface StorageWrapper<T> {\n _meta: {\n createdAt: number;\n ttl: number;\n };\n _value: T;\n}\n\n/**\n * Options for useSessionStorage hook\n */\nexport interface UseSessionStorageOptions {\n /**\n * Time-to-live in milliseconds.\n * After this time, value is considered expired and initialValue is returned.\n * Data is automatically cleaned up on next read.\n * @example 24 * 60 * 60 * 1000 // 24 hours\n */\n ttl?: number;\n}\n\n/**\n * Check if data is in new wrapped format with _meta\n */\nfunction isWrappedFormat<T>(data: unknown): data is StorageWrapper<T> {\n return (\n data !== null &&\n typeof data === 'object' &&\n '_meta' in data &&\n '_value' in data &&\n typeof (data as StorageWrapper<T>)._meta === 'object' &&\n typeof (data as StorageWrapper<T>)._meta.createdAt === 'number'\n );\n}\n\n/**\n * Check if wrapped data is expired\n */\nfunction isExpired<T>(wrapped: StorageWrapper<T>): boolean {\n if (!wrapped._meta.ttl) return false;\n const age = Date.now() - wrapped._meta.createdAt;\n return age > wrapped._meta.ttl;\n}\n\n/**\n * Simple sessionStorage hook with better error handling and optional TTL support\n *\n * @param key - Storage key\n * @param initialValue - Default value if key doesn't exist\n * @param options - Optional configuration (ttl for auto-expiration)\n * @returns [value, setValue, removeValue] - Current value, setter function, and remove function\n *\n * @example\n * // Without TTL (backwards compatible)\n * const [value, setValue] = useSessionStorage('key', 'default');\n *\n * @example\n * // With TTL (1 hour)\n * const [value, setValue] = useSessionStorage('key', 'default', {\n * ttl: 60 * 60 * 1000\n * });\n */\nexport function useSessionStorage<T>(\n key: string,\n initialValue: T,\n options?: UseSessionStorageOptions\n) {\n const ttl = options?.ttl;\n\n // Get initial value from sessionStorage or use provided initialValue\n const [storedValue, setStoredValue] = useState<T>(() => {\n if (typeof window === 'undefined') {\n return initialValue;\n }\n\n try {\n const item = window.sessionStorage.getItem(key);\n if (item === null) return initialValue;\n\n try {\n const parsed = JSON.parse(item);\n\n // Check if new format with _meta\n if (isWrappedFormat<T>(parsed)) {\n // Check TTL expiration\n if (isExpired(parsed)) {\n // Expired! Clean up and use initial value\n window.sessionStorage.removeItem(key);\n return initialValue;\n }\n // Not expired, extract value\n return parsed._value;\n }\n\n // Old format (backwards compatible)\n return parsed as T;\n } catch {\n // If JSON.parse fails, return as string\n return item as T;\n }\n } catch (error) {\n console.error(`Error reading sessionStorage key \"${key}\":`, error);\n return initialValue;\n }\n });\n\n // Check data size and limit\n const checkDataSize = (data: any): boolean => {\n try {\n const jsonString = JSON.stringify(data);\n const sizeInBytes = new Blob([jsonString]).size;\n const sizeInKB = sizeInBytes / 1024;\n\n // Limit to 1MB per item\n if (sizeInKB > 1024) {\n console.warn(`Data size (${sizeInKB.toFixed(2)}KB) exceeds 1MB limit for key \"${key}\"`);\n return false;\n }\n\n return true;\n } catch (error) {\n console.error(`Error checking data size for key \"${key}\":`, error);\n return false;\n }\n };\n\n // Clear old data when sessionStorage is full\n const clearOldData = () => {\n try {\n const keys = Object.keys(sessionStorage).filter(k => k && typeof k === 'string');\n // Remove oldest items if we have more than 50 items\n if (keys.length > 50) {\n const itemsToRemove = Math.ceil(keys.length * 0.2);\n for (let i = 0; i < itemsToRemove; i++) {\n try {\n const k = keys[i];\n if (k) {\n sessionStorage.removeItem(k);\n }\n } catch {\n // Ignore errors when removing items\n }\n }\n }\n } catch (error) {\n console.error('Error clearing old sessionStorage data:', error);\n }\n };\n\n // Force clear all data if quota is exceeded\n const forceClearAll = () => {\n try {\n const keys = Object.keys(sessionStorage);\n for (const k of keys) {\n try {\n sessionStorage.removeItem(k);\n } catch {\n // Ignore errors when removing items\n }\n }\n } catch (error) {\n console.error('Error force clearing sessionStorage:', error);\n }\n };\n\n // Prepare data for storage (with or without TTL wrapper)\n const prepareForStorage = (value: T): string => {\n if (ttl) {\n // Wrap with _meta for TTL support\n const wrapped: StorageWrapper<T> = {\n _meta: {\n createdAt: Date.now(),\n ttl,\n },\n _value: value,\n };\n return JSON.stringify(wrapped);\n }\n // Old format (no wrapper) - for strings, store directly\n if (typeof value === 'string') {\n return value;\n }\n return JSON.stringify(value);\n };\n\n // Update sessionStorage when value changes\n const setValue = (value: T | ((val: T) => T)) => {\n try {\n const valueToStore = value instanceof Function ? value(storedValue) : value;\n\n // Check data size before attempting to save\n if (!checkDataSize(valueToStore)) {\n console.warn(`Data size too large for key \"${key}\", removing key`);\n // Remove the key if data is too large\n try {\n window.sessionStorage.removeItem(key);\n } catch {\n // Ignore errors when removing\n }\n // Still update the state\n setStoredValue(valueToStore);\n return;\n }\n\n setStoredValue(valueToStore);\n\n if (typeof window !== 'undefined') {\n const dataToStore = prepareForStorage(valueToStore);\n\n // Try to set the value\n try {\n window.sessionStorage.setItem(key, dataToStore);\n } catch (storageError: any) {\n // If quota exceeded, clear old data and try again\n if (storageError.name === 'QuotaExceededError' ||\n storageError.code === 22 ||\n storageError.message?.includes('quota')) {\n console.warn('sessionStorage quota exceeded, clearing old data...');\n clearOldData();\n\n // Try again after clearing\n try {\n window.sessionStorage.setItem(key, dataToStore);\n } catch (retryError) {\n console.error(`Failed to set sessionStorage key \"${key}\" after clearing old data:`, retryError);\n // If still fails, force clear all and try one more time\n try {\n forceClearAll();\n window.sessionStorage.setItem(key, dataToStore);\n } catch (finalError) {\n console.error(`Failed to set sessionStorage key \"${key}\" after force clearing:`, finalError);\n // If still fails, just update the state without sessionStorage\n setStoredValue(valueToStore);\n }\n }\n } else {\n throw storageError;\n }\n }\n }\n } catch (error) {\n console.error(`Error setting sessionStorage key \"${key}\":`, error);\n // Still update the state even if sessionStorage fails\n const valueToStore = value instanceof Function ? value(storedValue) : value;\n setStoredValue(valueToStore);\n }\n };\n\n // Remove value from sessionStorage\n const removeValue = () => {\n try {\n setStoredValue(initialValue);\n if (typeof window !== 'undefined') {\n try {\n window.sessionStorage.removeItem(key);\n } catch (removeError: any) {\n // If removal fails due to quota, try to clear some data first\n if (removeError.name === 'QuotaExceededError' ||\n removeError.code === 22 ||\n removeError.message?.includes('quota')) {\n console.warn('sessionStorage quota exceeded during removal, clearing old data...');\n clearOldData();\n\n try {\n window.sessionStorage.removeItem(key);\n } catch (retryError) {\n console.error(`Failed to remove sessionStorage key \"${key}\" after clearing:`, retryError);\n // If still fails, force clear all\n forceClearAll();\n }\n } else {\n throw removeError;\n }\n }\n }\n } catch (error) {\n console.error(`Error removing sessionStorage key \"${key}\":`, error);\n }\n };\n\n return [storedValue, setValue, removeValue] as const;\n}\n"]}