@thibault.sh/hooks
Version:
A comprehensive collection of React hooks for browser storage, UI interactions, and more
1 lines • 57.9 kB
Source Map (JSON)
{"version":3,"sources":["../src/hooks/useAsync.ts","../src/hooks/useClickOutside.ts","../src/hooks/useMediaQuery.ts","../src/hooks/useHover.ts","../src/hooks/useKeyPress.ts","../src/hooks/useKeyCombo.ts","../src/hooks/useLongPress.ts","../src/hooks/useWindowSize.ts","../src/hooks/useScrollPosition.ts","../src/hooks/useContainerScroll.ts","../src/hooks/useElementSize.ts","../src/hooks/useIntersectionObserver.ts","../src/hooks/useResizeObserver.ts","../src/hooks/useDebounce.ts","../src/hooks/useThrottle.ts","../src/hooks/useTimer.ts","../src/hooks/useInterval.ts","../src/hooks/useEventListener.ts","../src/hooks/useCookieState.ts","../src/hooks/useLocalStorageState.ts","../src/hooks/useSessionStorageState.ts","../src/hooks/useQueryParamsState.ts"],"names":["useAsync","asyncFunction","status","setStatus","useState","useCallback","args","__async","result","error","useClickOutside","ref","handler","useEffect","listener","event","useMediaQuery","query","matches","setMatches","mediaQuery","useHover","_ref","isHovered","setIsHovered","useRef","element","handleMouseEnter","handleMouseLeave","useKeyPress","targetKey","isPressed","setIsPressed","handleKeyDown","handleKeyUp","useKeyCombo","targetCombo","pressedKeys","setPressedKeys","prev","next","key","useLongPress","options","delay","preventContext","onPress","onLongPress","onLongPressCanceled","timeout","startTime","frameRef","pressState","setPressState","updateProgress","elapsed","newProgress","__spreadProps","__spreadValues","start","end","cancel","useWindowSize","windowSize","setWindowSize","handleResize","useScrollPosition","scrollPosition","setScrollPosition","handleScroll","useContainerScroll","containerRef","scroll","setScroll","scrollTimeout","scrollTop","scrollLeft","scrollWidth","scrollHeight","clientWidth","clientHeight","useElementSize","elementRef","size","setSize","resizeObserver","entries","width","height","useIntersectionObserver","threshold","root","rootMargin","freezeOnceVisible","entry","setEntry","observer","useResizeObserver","useDebounce","value","debouncedValue","setDebouncedValue","timer","useThrottle","interval","throttledValue","setThrottledValue","lastUpdated","now","timeSinceLastUpdate","timeoutId","useTimer","initialTime","step","countDown","time","setTime","isRunning","setIsRunning","intervalRef","prevTime","newTime","pause","reset","useInterval","callback","savedCallback","id","useEventListener","eventName","savedHandler","targetElement","eventListener","useCookieState","name","initialValue","setValue","cookie","row","setCookie","newValue","days","path","domain","secure","sameSite","expires","deleteCookie","useLocalStorageState","readValue","item","storedValue","setStoredValue","valueToStore","useSessionStorageState","useQueryParamsState","serialize","deserialize","updateValue","params","newUrl","handlePopState"],"mappings":"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","file":"index.cjs","sourcesContent":["import { useState, useCallback } from \"react\";\n\ninterface AsyncState<T> {\n isLoading: boolean;\n error: Error | null;\n value: T | null;\n}\n\n/**\n * Hook that handles async operations with loading and error states\n * @param asyncFunction - Async function to execute\n * @returns Object containing execute function, loading state, error, and value\n */\nexport function useAsync<T>(asyncFunction: (...args: any[]) => Promise<T>): {\n execute: (...args: any[]) => Promise<void>;\n status: AsyncState<T>;\n} {\n const [status, setStatus] = useState<AsyncState<T>>({\n isLoading: false,\n error: null,\n value: null,\n });\n\n const execute = useCallback(\n async (...args: any[]) => {\n setStatus({ isLoading: true, error: null, value: null });\n try {\n const result = await asyncFunction(...args);\n setStatus({ isLoading: false, error: null, value: result });\n } catch (error) {\n setStatus({\n isLoading: false,\n error: error instanceof Error ? error : new Error(String(error)),\n value: null,\n });\n }\n },\n [asyncFunction]\n );\n\n return { execute, status };\n}\n","import { useEffect, RefObject } from \"react\";\n\ntype Handler = (event: MouseEvent | TouchEvent) => void;\n\n/**\n * Hook that handles click outside of the referenced element\n * @param ref - React ref object for the element to monitor\n * @param handler - Callback function to execute when click outside occurs\n */\nexport const useClickOutside = <T extends HTMLElement = HTMLElement>(\n ref: RefObject<T | null> | null,\n handler: Handler\n): void => {\n useEffect(() => {\n const listener = (event: MouseEvent | TouchEvent) => {\n if (!ref?.current || ref.current.contains(event.target as Node)) {\n return;\n }\n handler(event);\n };\n\n document.addEventListener(\"mousedown\", listener);\n document.addEventListener(\"touchstart\", listener);\n\n return () => {\n document.removeEventListener(\"mousedown\", listener);\n document.removeEventListener(\"touchstart\", listener);\n };\n }, [ref, handler]);\n};\n","import { useEffect, useState } from \"react\";\n\n/**\n * Hook that tracks state of a CSS media query\n * @param query - CSS media query string\n * @returns boolean indicating if the media query matches\n */\nexport const useMediaQuery = (query: string): boolean => {\n const [matches, setMatches] = useState(false);\n\n useEffect(() => {\n const mediaQuery = window.matchMedia(query);\n setMatches(mediaQuery.matches);\n\n const handler = (event: MediaQueryListEvent) => {\n setMatches(event.matches);\n };\n\n mediaQuery.addEventListener(\"change\", handler);\n\n return () => {\n mediaQuery.removeEventListener(\"change\", handler);\n };\n }, [query]);\n\n return matches;\n};\n","import { useState, useRef, useEffect, RefObject } from \"react\";\n\n/**\n * Hook that detects hover state on an element\n * @param ref - (optional) React ref object for the element to monitor\n * @returns Tuple containing ref to attach to element and boolean indicating hover state\n */\nexport const useHover = <T extends HTMLElement>(_ref?: RefObject<T | null> | null): [RefObject<T>, boolean] => {\n const [isHovered, setIsHovered] = useState(false);\n const ref = useRef<T>(null);\n\n useEffect(() => {\n const element = _ref?.current || ref.current;\n if (!element) return;\n\n const handleMouseEnter = () => setIsHovered(true);\n const handleMouseLeave = () => setIsHovered(false);\n\n element.addEventListener(\"mouseenter\", handleMouseEnter);\n element.addEventListener(\"mouseleave\", handleMouseLeave);\n\n return () => {\n element.removeEventListener(\"mouseenter\", handleMouseEnter);\n element.removeEventListener(\"mouseleave\", handleMouseLeave);\n };\n }, []);\n\n return [(ref as RefObject<T>) || _ref, isHovered];\n};\n","import { useEffect, useState } from \"react\";\n\n/**\n * Hook that detects when a specific key is pressed\n * @param targetKey - The key to detect (e.g., \"Enter\", \"Escape\", \"a\")\n * @returns boolean indicating if the key is currently pressed\n */\nexport function useKeyPress(targetKey: string): boolean {\n const [isPressed, setIsPressed] = useState(false);\n\n useEffect(() => {\n const handleKeyDown = (event: KeyboardEvent) => {\n if (event.key === targetKey) {\n setIsPressed(true);\n }\n };\n\n const handleKeyUp = (event: KeyboardEvent) => {\n if (event.key === targetKey) {\n setIsPressed(false);\n }\n };\n\n window.addEventListener(\"keydown\", handleKeyDown);\n window.addEventListener(\"keyup\", handleKeyUp);\n\n return () => {\n window.removeEventListener(\"keydown\", handleKeyDown);\n window.removeEventListener(\"keyup\", handleKeyUp);\n };\n }, [targetKey]);\n\n return isPressed;\n}\n","import { useEffect, useState } from \"react\";\n\ntype KeyCombo = string[];\n\n/**\n * Hook that detects when a specific combination of keys is pressed\n * @param targetCombo - Array of keys that make up the combination (e.g., [\"Control\", \"Shift\", \"a\"])\n * @returns boolean indicating if the combination is currently active\n */\nexport function useKeyCombo(targetCombo: KeyCombo): boolean {\n const [pressedKeys, setPressedKeys] = useState<Set<string>>(new Set());\n\n useEffect(() => {\n const handleKeyDown = (event: KeyboardEvent) => {\n setPressedKeys((prev) => new Set([...prev, event.key]));\n };\n\n const handleKeyUp = (event: KeyboardEvent) => {\n setPressedKeys((prev) => {\n const next = new Set(prev);\n next.delete(event.key);\n return next;\n });\n };\n\n window.addEventListener(\"keydown\", handleKeyDown);\n window.addEventListener(\"keyup\", handleKeyUp);\n\n return () => {\n window.removeEventListener(\"keydown\", handleKeyDown);\n window.removeEventListener(\"keyup\", handleKeyUp);\n };\n }, []);\n\n return targetCombo.every((key) => pressedKeys.has(key));\n}\n","import { useCallback, useRef, useState, useEffect } from \"react\";\n\n/**\n * Configuration options for the useLongPress hook\n */\ninterface LongPressOptions {\n /** Duration in milliseconds before long press is triggered (default: 400) */\n delay?: number;\n /** Whether to disable context menu on long press (default: true) */\n preventContext?: boolean;\n /** Callback fired when a normal press (shorter than delay) is completed */\n onPress?: () => void;\n /** Callback fired when a long press is successfully triggered */\n onLongPress?: () => void;\n /** Callback fired when a long press is canceled before completion */\n onLongPressCanceled?: () => void;\n}\n\n/**\n * Internal state for tracking press status and progress\n */\ninterface PressState {\n /** Whether the element is currently being pressed */\n isPressed: boolean;\n /** Whether the press has exceeded the long press threshold */\n isLongPressed: boolean;\n /** Progress towards completing a long press (0 to 1) */\n progress: number;\n}\n\n/**\n * A hook that handles both normal press and long press interactions\n *\n * @param options - Configuration options for the long press behavior\n * @param options.delay - Duration in milliseconds before a press is considered a long press (default: 400)\n * @param options.preventContext - When true, prevents the default context menu on long press (default: true)\n * @param options.onPress - Callback fired when a normal press (shorter than delay) is completed.\n * Triggers only if the press duration was less than the specified delay\n * @param options.onLongPress - Callback fired when a long press is successfully triggered.\n * Triggers exactly once when the press duration exceeds the delay\n * @param options.onLongPressCanceled - Callback fired when a long press is canceled before completion.\n * Triggers if the press is released or canceled before reaching the delay threshold\n * @returns Object containing event handlers and current press state\n *\n * @example\n * ```tsx\n * const MyComponent = () => {\n * const { handlers, state } = useLongPress({\n * delay: 1000,\n * onPress: () => console.log('Normal press'),\n * onLongPress: () => console.log('Long press completed'),\n * onLongPressCanceled: () => console.log('Long press canceled'),\n * });\n *\n * return (\n * <button {...handlers}>\n * {state.isLongPressed\n * ? 'Long Press!'\n * : `Hold me (${Math.round(state.progress * 100)}%)`}\n * </button>\n * );\n * };\n * ```\n */\nexport function useLongPress(options: LongPressOptions = {}) {\n const { delay = 400, preventContext = true, onPress, onLongPress, onLongPressCanceled } = options;\n\n const timeout = useRef<ReturnType<typeof setTimeout>>();\n const startTime = useRef<number>(0);\n const frameRef = useRef<number>();\n\n const [pressState, setPressState] = useState<PressState>({\n isPressed: false,\n isLongPressed: false,\n progress: 0,\n });\n\n /**\n * Updates the progress of the long press animation\n * Uses requestAnimationFrame for smooth updates\n */\n const updateProgress = useCallback(() => {\n if (!startTime.current || !pressState.isPressed) return;\n\n const elapsed = Date.now() - startTime.current;\n const newProgress = Math.min(elapsed / delay, 1);\n\n setPressState((prev) => ({ ...prev, progress: newProgress }));\n\n if (newProgress < 1) {\n frameRef.current = requestAnimationFrame(updateProgress);\n }\n }, [delay, pressState.isPressed]);\n\n // Cleanup animation frames and timeouts on unmount\n useEffect(() => {\n return () => {\n if (frameRef.current) cancelAnimationFrame(frameRef.current);\n if (timeout.current) clearTimeout(timeout.current);\n };\n }, []);\n\n /**\n * Handles the start of a press interaction\n * Initializes timers and starts progress tracking\n */\n const start = useCallback(\n (event: React.TouchEvent | React.MouseEvent) => {\n if (preventContext) {\n event.preventDefault();\n }\n\n startTime.current = Date.now();\n setPressState({ isPressed: true, isLongPressed: false, progress: 0 });\n frameRef.current = requestAnimationFrame(updateProgress);\n\n timeout.current = setTimeout(() => {\n setPressState((prev) => ({ ...prev, isLongPressed: true }));\n onLongPress?.();\n }, delay);\n },\n [delay, onLongPress, preventContext, updateProgress]\n );\n\n /**\n * Handles the end of a press interaction\n * Determines if it was a long press and fires appropriate callbacks\n */\n const end = useCallback(\n (event: React.TouchEvent | React.MouseEvent) => {\n if (frameRef.current) cancelAnimationFrame(frameRef.current);\n if (timeout.current) clearTimeout(timeout.current);\n\n const wasLongPress = pressState.isLongPressed;\n\n if (!wasLongPress) {\n if (pressState.progress < 1) {\n onLongPressCanceled?.();\n }\n onPress?.();\n }\n\n setPressState({ isPressed: false, isLongPressed: false, progress: 0 });\n },\n [onLongPressCanceled, onPress, pressState.isLongPressed, pressState.progress]\n );\n\n /**\n * Handles cancellation of a press interaction\n * (e.g., pointer leave or touch cancel events)\n */\n const cancel = useCallback(\n (event: React.TouchEvent | React.MouseEvent) => {\n if (frameRef.current) cancelAnimationFrame(frameRef.current);\n if (timeout.current) clearTimeout(timeout.current);\n\n if (pressState.isPressed && !pressState.isLongPressed) {\n onLongPressCanceled?.();\n }\n\n setPressState({ isPressed: false, isLongPressed: false, progress: 0 });\n },\n [onLongPressCanceled, pressState.isPressed, pressState.isLongPressed]\n );\n\n return {\n /** Event handlers to attach to the target element */\n handlers: {\n onMouseDown: start,\n onMouseUp: end,\n onMouseLeave: cancel,\n onTouchStart: start,\n onTouchEnd: end,\n onTouchCancel: cancel,\n },\n /** Current state of the press interaction */\n state: {\n isPressed: pressState.isPressed,\n isLongPressed: pressState.isLongPressed,\n progress: pressState.progress,\n },\n };\n}\n","import { useState, useEffect } from \"react\";\n\ninterface WindowSize {\n width: number;\n height: number;\n}\n\n/**\n * Hook that tracks window dimensions\n * @returns Object containing current window width and height\n * @example\n * const { width, height } = useWindowSize();\n * console.log(width, height);\n */\nexport function useWindowSize(): WindowSize {\n const [windowSize, setWindowSize] = useState<WindowSize>({\n width: typeof window !== \"undefined\" ? window.innerWidth : 0,\n height: typeof window !== \"undefined\" ? window.innerHeight : 0,\n });\n\n useEffect(() => {\n if (typeof window === \"undefined\") return;\n\n const handleResize = () => {\n setWindowSize({\n width: window.innerWidth,\n height: window.innerHeight,\n });\n };\n\n window.addEventListener(\"resize\", handleResize);\n handleResize();\n\n return () => window.removeEventListener(\"resize\", handleResize);\n }, []);\n\n return windowSize;\n} ","import { useState, useEffect } from \"react\";\n\ninterface ScrollPosition {\n x: number;\n y: number;\n}\n\n/**\n * Hook that tracks window scroll position\n * @returns Object containing current scroll x and y coordinates\n */\nexport function useScrollPosition(): ScrollPosition {\n const [scrollPosition, setScrollPosition] = useState<ScrollPosition>({\n x: typeof window !== \"undefined\" ? window.scrollX : 0,\n y: typeof window !== \"undefined\" ? window.scrollY : 0,\n });\n\n useEffect(() => {\n if (typeof window === \"undefined\") return;\n\n const handleScroll = () => {\n setScrollPosition({\n x: window.scrollX,\n y: window.scrollY,\n });\n };\n\n window.addEventListener(\"scroll\", handleScroll);\n handleScroll();\n\n return () => window.removeEventListener(\"scroll\", handleScroll);\n }, []);\n\n return scrollPosition;\n} ","import { useState, useEffect, RefObject } from \"react\";\n\ninterface ContainerScroll {\n scrollTop: number;\n scrollLeft: number;\n scrollWidth: number;\n scrollHeight: number;\n clientWidth: number;\n clientHeight: number;\n isScrolling: boolean;\n}\n\n/**\n * Hook that tracks scroll position and dimensions of a container element\n * @param containerRef - React ref object pointing to the container element\n * @param delay - Delay in milliseconds before setting isScrolling to false\n * @returns Object containing scroll position and dimension information\n */\nexport function useContainerScroll(containerRef: RefObject<HTMLElement | null>, delay: number = 150): ContainerScroll {\n const [scroll, setScroll] = useState<ContainerScroll>({\n scrollTop: 0,\n scrollLeft: 0,\n scrollWidth: 0,\n scrollHeight: 0,\n clientWidth: 0,\n clientHeight: 0,\n isScrolling: false,\n });\n\n useEffect(() => {\n if (!containerRef.current) return;\n\n let scrollTimeout: ReturnType<typeof setTimeout>;\n const element = containerRef.current;\n\n const handleScroll = () => {\n const { scrollTop, scrollLeft, scrollWidth, scrollHeight, clientWidth, clientHeight } = element;\n\n setScroll((prev) => ({\n scrollTop,\n scrollLeft,\n scrollWidth,\n scrollHeight,\n clientWidth,\n clientHeight,\n isScrolling: true,\n }));\n\n clearTimeout(scrollTimeout);\n scrollTimeout = setTimeout(() => {\n setScroll((prev) => ({ ...prev, isScrolling: false }));\n }, delay);\n };\n\n element.addEventListener(\"scroll\", handleScroll);\n handleScroll();\n\n return () => {\n element.removeEventListener(\"scroll\", handleScroll);\n clearTimeout(scrollTimeout);\n };\n }, [containerRef]);\n\n return scroll;\n}\n","import { useState, useEffect, RefObject } from \"react\";\n\ninterface ElementSize {\n width: number;\n height: number;\n}\n\n/**\n * Hook that tracks an element's dimensions using ResizeObserver\n * @param elementRef - React ref object pointing to the target element\n * @returns Object containing current element width and height\n */\nexport function useElementSize(elementRef: RefObject<HTMLElement>): ElementSize {\n const [size, setSize] = useState<ElementSize>({\n width: 0,\n height: 0,\n });\n\n useEffect(() => {\n if (!elementRef.current) return;\n\n const element = elementRef.current;\n const resizeObserver = new ResizeObserver((entries) => {\n if (!entries[0]) return;\n\n const { width, height } = entries[0].contentRect;\n setSize({ width, height });\n });\n\n resizeObserver.observe(element);\n setSize({\n width: element.offsetWidth,\n height: element.offsetHeight,\n });\n\n return () => {\n resizeObserver.disconnect();\n };\n }, [elementRef]);\n\n return size;\n}\n","import { useState, useEffect, RefObject } from \"react\";\n\ninterface IntersectionOptions extends IntersectionObserverInit {\n freezeOnceVisible?: boolean;\n}\n\n/**\n * Hook that tracks element's intersection with viewport using IntersectionObserver\n * @param elementRef - React ref object pointing to the target element\n * @param options - IntersectionObserver options with additional freezeOnceVisible flag\n * @returns IntersectionObserverEntry if available, null otherwise\n */\nexport function useIntersectionObserver(\n elementRef: RefObject<HTMLElement>,\n {\n threshold = 0,\n root = null,\n rootMargin = \"0%\",\n freezeOnceVisible = false,\n }: IntersectionOptions = {}\n): IntersectionObserverEntry | null {\n const [entry, setEntry] = useState<IntersectionObserverEntry | null>(null);\n\n useEffect(() => {\n const element = elementRef.current;\n if (!element) return;\n\n // Don't observe if element is already visible and freeze is enabled\n if (freezeOnceVisible && entry?.isIntersecting) return;\n\n const observer = new IntersectionObserver(\n ([entry]) => {\n setEntry(entry);\n },\n { threshold, root, rootMargin }\n );\n\n observer.observe(element);\n\n return () => {\n observer.disconnect();\n };\n }, [elementRef, threshold, root, rootMargin, freezeOnceVisible, entry?.isIntersecting]);\n\n return entry;\n} ","import { useState, useEffect, RefObject } from \"react\";\n\ninterface ResizeObserverEntry {\n contentRect: DOMRectReadOnly;\n contentBoxSize: ReadonlyArray<ResizeObserverSize>;\n borderBoxSize: ReadonlyArray<ResizeObserverSize>;\n devicePixelContentBoxSize: ReadonlyArray<ResizeObserverSize>;\n target: Element;\n}\n\n/**\n * Hook that tracks element's size changes using ResizeObserver with full entry details\n * @param elementRef - React ref object pointing to the target element\n * @returns Latest ResizeObserverEntry if available, null otherwise\n */\nexport function useResizeObserver(\n elementRef: RefObject<HTMLElement>\n): ResizeObserverEntry | null {\n const [entry, setEntry] = useState<ResizeObserverEntry | null>(null);\n\n useEffect(() => {\n if (!elementRef.current) return;\n\n const element = elementRef.current;\n const resizeObserver = new ResizeObserver((entries) => {\n if (!entries[0]) return;\n setEntry(entries[0]);\n });\n\n resizeObserver.observe(element);\n\n return () => {\n resizeObserver.disconnect();\n };\n }, [elementRef]);\n\n return entry;\n} ","import { useState, useEffect } from \"react\";\n\n/**\n * Hook that debounces a value\n * @param value - The value to debounce\n * @param delay - The delay in milliseconds\n * @returns The debounced value\n */\nexport function useDebounce<T>(value: T, delay: number): T {\n const [debouncedValue, setDebouncedValue] = useState<T>(value);\n\n useEffect(() => {\n const timer = setTimeout(() => {\n setDebouncedValue(value);\n }, delay);\n\n return () => {\n clearTimeout(timer);\n };\n }, [value, delay]);\n\n return debouncedValue;\n} ","import { useState, useEffect, useRef } from \"react\";\n\n/**\n * Hook that throttles a value\n * @param value - The value to throttle\n * @param interval - The minimum time interval between updates in milliseconds\n * @returns The throttled value\n */\nexport function useThrottle<T>(value: T, interval: number): T {\n const [throttledValue, setThrottledValue] = useState<T>(value);\n const lastUpdated = useRef<number>(Date.now());\n\n useEffect(() => {\n const now = Date.now();\n const timeSinceLastUpdate = now - lastUpdated.current;\n\n if (timeSinceLastUpdate >= interval) {\n setThrottledValue(value);\n lastUpdated.current = now;\n } else {\n const timeoutId = setTimeout(() => {\n setThrottledValue(value);\n lastUpdated.current = Date.now();\n }, interval - timeSinceLastUpdate);\n\n return () => clearTimeout(timeoutId);\n }\n }, [value, interval]);\n\n return throttledValue;\n} ","import { useState, useEffect, useCallback, useRef } from \"react\";\n\ninterface TimerControls {\n start: () => void;\n pause: () => void;\n reset: () => void;\n isRunning: boolean;\n}\n\n/**\n * Hook that provides a timer with controls\n * @param initialTime - Initial time in seconds\n * @param step - Time step in seconds (default: 1)\n * @param countDown - Whether to count down instead of up (default: false)\n * @returns [currentTime, controls]\n */\nexport function useTimer(initialTime: number, step: number = 1, countDown: boolean = false): [number, TimerControls] {\n const [time, setTime] = useState(initialTime);\n const [isRunning, setIsRunning] = useState(false);\n const intervalRef = useRef<ReturnType<typeof setInterval>>();\n\n const start = useCallback(() => {\n if (!isRunning) {\n setIsRunning(true);\n intervalRef.current = setInterval(() => {\n setTime((prevTime) => {\n const newTime = countDown ? prevTime - step : prevTime + step;\n if (countDown && newTime <= 0) {\n clearInterval(intervalRef.current);\n setIsRunning(false);\n return 0;\n }\n return newTime;\n });\n }, step * 1000);\n }\n }, [isRunning, step, countDown]);\n\n const pause = useCallback(() => {\n if (isRunning && intervalRef.current) {\n clearInterval(intervalRef.current);\n intervalRef.current = undefined;\n setIsRunning(false);\n }\n }, [isRunning]);\n\n const reset = useCallback(() => {\n if (intervalRef.current) {\n clearInterval(intervalRef.current);\n intervalRef.current = undefined;\n }\n setIsRunning(false);\n setTime(initialTime);\n }, [initialTime]);\n\n useEffect(() => {\n return () => {\n if (intervalRef.current) {\n clearInterval(intervalRef.current);\n intervalRef.current = undefined;\n }\n };\n }, []);\n\n return [\n time,\n {\n start,\n pause,\n reset,\n isRunning,\n },\n ];\n}\n","import { useEffect, useRef } from \"react\";\n\n/**\n * Hook that sets up an interval that is properly cleaned up when the component unmounts\n * @param callback - Function to call on each interval\n * @param delay - Delay in milliseconds (null to pause)\n */\nexport function useInterval(callback: () => void, delay: number | null) {\n const savedCallback = useRef(callback);\n\n useEffect(() => {\n savedCallback.current = callback;\n }, [callback]);\n\n useEffect(() => {\n if (delay === null) return;\n\n const tick = () => {\n savedCallback.current();\n };\n\n const id = setInterval(tick, delay);\n return () => clearInterval(id);\n }, [delay]);\n} ","import { useEffect, useRef, RefObject } from \"react\";\n\ntype EventMap = WindowEventMap & HTMLElementEventMap & DocumentEventMap;\n\n/**\n * Hook that adds an event listener to a target element or window\n * @param eventName - Name of the event to listen for\n * @param handler - Event handler function\n * @param element - Target element (defaults to window)\n * @param options - AddEventListener options\n */\nexport function useEventListener<K extends keyof EventMap>(\n eventName: K,\n handler: (event: EventMap[K]) => void,\n element?: RefObject<HTMLElement> | null,\n options?: boolean | AddEventListenerOptions\n): void {\n const savedHandler = useRef(handler);\n\n useEffect(() => {\n savedHandler.current = handler;\n }, [handler]);\n\n useEffect(() => {\n const targetElement = element?.current || window;\n if (!targetElement?.addEventListener) return;\n\n const eventListener = (event: Event) => {\n savedHandler.current(event as EventMap[K]);\n };\n\n targetElement.addEventListener(eventName, eventListener, options);\n\n return () => {\n targetElement.removeEventListener(eventName, eventListener, options);\n };\n }, [eventName, element, options]);\n}\n","import { useState, useCallback } from \"react\";\n\n/**\n * Options for configuring cookie behavior\n */\ninterface CookieOptions {\n /** Number of days until the cookie expires (default: 7) */\n days?: number;\n /** Cookie path (default: \"/\") */\n path?: string;\n /** Cookie domain */\n domain?: string;\n /** Whether the cookie requires HTTPS (default: false) */\n secure?: boolean;\n /** SameSite cookie attribute (default: \"Lax\") */\n sameSite?: \"Strict\" | \"Lax\" | \"None\";\n}\n\n/**\n * Hook for managing state persisted in a browser cookie\n * @param name - The name of the cookie\n * @param initialValue - The initial value to use if no cookie exists\n * @returns A tuple containing:\n * - The current cookie value (or null if not set)\n * - A function to update the cookie value and its options\n * - A function to delete the cookie\n */\nexport function useCookieState(\n name: string,\n initialValue: string\n): [string | null, (newValue: string, options?: CookieOptions) => void, () => void] {\n const [value, setValue] = useState<string | null>(() => {\n if (typeof window === \"undefined\") return initialValue;\n\n try {\n const cookie = document.cookie.split(\"; \"