@mwakidenis/logx-react 0.0.0-stage → 0.1.0

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.
Files changed (46) hide show
  1. package/CHANGELOG.md +18 -0
  2. package/LICENSE +23 -0
  3. package/README.md +151 -3
  4. package/dist/components/index.d.mts +71 -0
  5. package/dist/components/index.d.ts +71 -0
  6. package/dist/components/index.js +268 -0
  7. package/dist/components/index.js.map +1 -0
  8. package/dist/components/index.mjs +262 -0
  9. package/dist/components/index.mjs.map +1 -0
  10. package/dist/hooks/index.d.mts +316 -0
  11. package/dist/hooks/index.d.ts +316 -0
  12. package/dist/hooks/index.js +638 -0
  13. package/dist/hooks/index.js.map +1 -0
  14. package/dist/hooks/index.mjs +615 -0
  15. package/dist/hooks/index.mjs.map +1 -0
  16. package/dist/hooks/storage/index.d.mts +40 -0
  17. package/dist/hooks/storage/index.d.ts +40 -0
  18. package/dist/hooks/storage/index.js +119 -0
  19. package/dist/hooks/storage/index.js.map +1 -0
  20. package/dist/hooks/storage/index.mjs +116 -0
  21. package/dist/hooks/storage/index.mjs.map +1 -0
  22. package/dist/index.d.mts +16 -0
  23. package/dist/index.d.ts +16 -0
  24. package/dist/index.js +1066 -0
  25. package/dist/index.js.map +1 -0
  26. package/dist/index.mjs +974 -0
  27. package/dist/index.mjs.map +1 -0
  28. package/dist/providers/LogxProvider.d.mts +134 -0
  29. package/dist/providers/LogxProvider.d.ts +134 -0
  30. package/dist/providers/LogxProvider.js +117 -0
  31. package/dist/providers/LogxProvider.js.map +1 -0
  32. package/dist/providers/LogxProvider.mjs +114 -0
  33. package/dist/providers/LogxProvider.mjs.map +1 -0
  34. package/dist/types/index.d.mts +87 -0
  35. package/dist/types/index.d.ts +87 -0
  36. package/dist/types/index.js +4 -0
  37. package/dist/types/index.js.map +1 -0
  38. package/dist/types/index.mjs +3 -0
  39. package/dist/types/index.mjs.map +1 -0
  40. package/dist/utilities/index.d.mts +140 -0
  41. package/dist/utilities/index.d.ts +140 -0
  42. package/dist/utilities/index.js +167 -0
  43. package/dist/utilities/index.js.map +1 -0
  44. package/dist/utilities/index.mjs +104 -0
  45. package/dist/utilities/index.mjs.map +1 -0
  46. package/package.json +127 -6
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../src/hooks/useToggle.ts","../../src/hooks/useBoolean.ts","../../src/hooks/useCounter.ts","../../src/hooks/usePrevious.ts","../../src/hooks/useLatest.ts","../../src/hooks/useMounted.ts","../../src/hooks/useArray.ts","../../src/hooks/useObject.ts","../../src/hooks/useDebouncedValue.ts","../../src/hooks/useDebouncedCallback.ts","../../src/hooks/useThrottle.ts","../../src/internal/storage.ts","../../src/hooks/storage/useLocalStorage.ts","../../src/hooks/storage/useSessionStorage.ts","../../src/hooks/useMediaQuery.ts","../../src/hooks/useWindowSize.ts","../../src/hooks/useClickOutside.ts","../../src/hooks/useEventListener.ts","../../src/hooks/useClipboard.ts","../../src/hooks/useOnlineStatus.ts","../../src/hooks/useTimeout.ts","../../src/hooks/useInterval.ts","../../src/hooks/useAsync.ts"],"names":["set","useState","useCallback","useRef","useEffect","unique","compact","shuffle","logxDebounce","logxThrottle","logxLocalStorageHelpers","logxSessionStorageHelpers"],"mappings":"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","file":"index.mjs","sourcesContent":["import { useCallback, useState } from \"react\";\r\n\r\n/**\r\n * A boolean toggle hook.\r\n *\r\n * Returns the current boolean value and a stable set of actions to mutate it.\r\n * All callbacks are stable (no unnecessary re-renders of consumers).\r\n *\r\n * @param initialValue - Initial boolean value (defaults to false)\r\n */\r\nexport function useToggle(\r\n initialValue: boolean = false,\r\n): [\r\n boolean,\r\n {\r\n toggle: () => void;\r\n set: (next?: boolean) => void;\r\n setTrue: () => void;\r\n setFalse: () => void;\r\n },\r\n] {\r\n const [value, setValue] = useState(!!initialValue);\r\n\r\n const toggle = useCallback(() => setValue((current) => !current), []);\r\n const setTrue = useCallback(() => setValue(true), []);\r\n const setFalse = useCallback(() => setValue(false), []);\r\n const set = useCallback(\r\n (next?: boolean) =>\r\n setValue((current) => (typeof next === \"boolean\" ? next : !current)),\r\n [],\r\n );\r\n\r\n return [value, { toggle, set, setTrue, setFalse }];\r\n}\r\n","import { useCallback, useState } from \"react\";\r\n\r\n/**\r\n * A boolean state hook with explicit setTrue/setFalse/toggle actions.\r\n *\r\n * Alias of useToggle with a more descriptive name. Provides stable callbacks.\r\n *\r\n * @param initialValue - Initial boolean value (defaults to false)\r\n */\r\nexport function useBoolean(\r\n initialValue: boolean = false,\r\n): [\r\n boolean,\r\n {\r\n setTrue: () => void;\r\n setFalse: () => void;\r\n toggle: () => void;\r\n set: (next?: boolean) => void;\r\n },\r\n] {\r\n const [value, setValue] = useState(!!initialValue);\r\n\r\n const setTrue = useCallback(() => setValue(true), []);\r\n const setFalse = useCallback(() => setValue(false), []);\r\n const toggle = useCallback(() => setValue((current) => !current), []);\r\n const set = useCallback(\r\n (next?: boolean) =>\r\n setValue((current) => (typeof next === \"boolean\" ? next : !current)),\r\n [],\r\n );\r\n\r\n return [value, { setTrue, setFalse, toggle, set }];\r\n}\r\n","import { useCallback, useState } from \"react\";\r\n\r\n/**\r\n * A numeric counter hook.\r\n *\r\n * @param initialValue - Starting value (defaults to 0)\r\n */\r\nexport function useCounter(\r\n initialValue: number = 0,\r\n): {\r\n count: number;\r\n increment: (step?: number) => void;\r\n decrement: (step?: number) => void;\r\n reset: () => void;\r\n set: (value: number) => void;\r\n} {\r\n const [count, setCount] = useState(initialValue);\r\n\r\n const increment = useCallback(\r\n (step: number = 1) => setCount((current) => current + step),\r\n [],\r\n );\r\n const decrement = useCallback(\r\n (step: number = 1) => setCount((current) => current - step),\r\n [],\r\n );\r\n const reset = useCallback(() => setCount(initialValue), [initialValue]);\r\n const set = useCallback((value: number) => setCount(value), []);\r\n\r\n return { count, increment, decrement, reset, set };\r\n}\r\n","import { useEffect, useRef } from \"react\";\r\n\r\n/**\r\n * Returns the previous value of a tracked value.\r\n *\r\n * On first render returns undefined (there is no previous value yet).\r\n * The returned ref updates after each render so the value is always the\r\n * value from the previous committed render.\r\n *\r\n * @param value - The value to track\r\n */\r\nexport function usePrevious<T>(value: T): T | undefined {\r\n const ref = useRef<T | undefined>(undefined);\r\n\r\n useEffect(() => {\r\n ref.current = value;\r\n });\r\n\r\n return ref.current;\r\n}\r\n","import { useRef } from \"react\";\r\n\r\n/**\r\n * Returns a ref whose `.current` always holds the latest value without\r\n * triggering re-renders. Useful for accessing the most recent value inside\r\n * timers, callbacks or event listeners without stale closures.\r\n *\r\n * @param value - The value to track\r\n */\r\nexport function useLatest<T>(value: T): { current: T } {\r\n const ref = useRef(value);\r\n ref.current = value;\r\n return ref;\r\n}\r\n","import { useEffect, useState } from \"react\";\r\n\r\n/**\r\n * Returns whether the component is mounted.\r\n *\r\n * The value starts false (SSR-safe) and becomes true after mount. It returns\r\n * to false on unmount. Use sparingly; prefer event-driven logic where possible.\r\n *\r\n * NOTE: Reading this during render can cause a flash of unmounted content on\r\n * the client. Prefer using it inside effects or event handlers.\r\n */\r\nexport function useMounted(): boolean {\r\n const [mounted, setMounted] = useState(false);\r\n\r\n useEffect(() => {\r\n setMounted(true);\r\n return () => setMounted(false);\r\n }, []);\r\n\r\n return mounted;\r\n}\r\n","import { useCallback, useState } from \"react\";\r\nimport {\r\n compact as logxCompact,\r\n difference,\r\n first,\r\n flatten,\r\n intersection,\r\n last,\r\n partition,\r\n shuffle as logxShuffle,\r\n take,\r\n drop,\r\n union,\r\n unique as logxUnique,\r\n} from \"../internal/logx\";\r\n\r\n/**\r\n * Array state with immutable helpers.\r\n *\r\n * Several helpers delegate to @mwakidenis/logx array utilities (unique,\r\n * compact, first, last, take, drop, shuffle, partition, difference,\r\n * intersection, union, flatten). React-specific state management is kept in\r\n * this hook; LOGX provides the pure array transformations.\r\n *\r\n * @param initialValue - Initial array (defaults to [])\r\n */\r\nexport function useArray<T>(initialValue: T[] = []): {\r\n array: T[];\r\n set: (value: T[] | ((prev: T[]) => T[])) => void;\r\n push: (...items: T[]) => void;\r\n unshift: (...items: T[]) => void;\r\n remove: (index: number) => void;\r\n removeBy: (predicate: (value: T, index: number) => unknown) => void;\r\n update: (index: number, value: T) => void;\r\n clear: () => void;\r\n reset: () => void;\r\n unique: () => void;\r\n compact: () => void;\r\n shuffle: () => void;\r\n first: () => T | undefined;\r\n last: () => T | undefined;\r\n take: (count: number) => T[];\r\n drop: (count: number) => T[];\r\n difference: (...others: T[][]) => T[];\r\n intersection: (...others: T[][]) => T[];\r\n union: (...others: T[][]) => T[];\r\n partition: (predicate: (value: T, index: number) => unknown) => [T[], T[]];\r\n flatten: () => unknown[];\r\n} {\r\n const [array, setArray] = useState<T[]>(initialValue);\r\n\r\n const set = useCallback(\r\n (value: T[] | ((prev: T[]) => T[])) =>\r\n setArray((prev) =>\r\n typeof value === \"function\" ? (value as (prev: T[]) => T[])(prev) : value,\r\n ),\r\n [],\r\n );\r\n const push = useCallback((...items: T[]) => setArray((prev) => [...prev, ...items]), []);\r\n const unshift = useCallback((...items: T[]) => setArray((prev) => [...items, ...prev]), []);\r\n const remove = useCallback((index: number) =>\r\n setArray((prev) => prev.filter((_, i) => i !== index)),\r\n []);\r\n const removeBy = useCallback(\r\n (predicate: (value: T, index: number) => unknown) =>\r\n setArray((prev) => prev.filter((v, i) => !predicate(v, i))),\r\n [],\r\n );\r\n const update = useCallback((index: number, value: T) =>\r\n setArray((prev) => prev.map((v, i) => (i === index ? value : v))),\r\n []);\r\n const clear = useCallback(() => setArray([]), []);\r\n const reset = useCallback(() => setArray(initialValue), [initialValue]);\r\n const unique = useCallback(() => setArray((prev) => logxUnique(prev)), []);\r\n const compact = useCallback(() => setArray((prev) => logxCompact(prev)), []);\r\n const shuffle = useCallback(() => setArray((prev) => logxShuffle(prev)), []);\r\n\r\n const firstValue = useCallback(() => first(array), [array]);\r\n const lastValue = useCallback(() => last(array), [array]);\r\n const takeValue = useCallback(\r\n (count: number) => take(array, count),\r\n [array],\r\n );\r\n const dropValue = useCallback(\r\n (count: number) => drop(array, count),\r\n [array],\r\n );\r\n\r\n return {\r\n array,\r\n set,\r\n push,\r\n unshift,\r\n remove,\r\n removeBy,\r\n update,\r\n clear,\r\n reset,\r\n unique,\r\n compact,\r\n shuffle,\r\n first: firstValue,\r\n last: lastValue,\r\n take: takeValue,\r\n drop: dropValue,\r\n // Expose LOGX-derived pure helpers for consumers who need them.\r\n difference: useCallback(\r\n (...others: T[][]) => difference(array, ...others),\r\n [array],\r\n ),\r\n intersection: useCallback(\r\n (...others: T[][]) => intersection(array, ...others),\r\n [array],\r\n ),\r\n union: useCallback(\r\n (...others: T[][]) => union(array, ...others),\r\n [array],\r\n ),\r\n partition: useCallback(\r\n (predicate: (value: T, index: number) => unknown) => partition(array, predicate),\r\n [array],\r\n ),\r\n flatten: useCallback(() => flatten(array as unknown[]), [array]),\r\n };\r\n}\r\n","import { useCallback, useState } from \"react\";\r\nimport {\r\n clone,\r\n deepClone,\r\n entries,\r\n get,\r\n keys,\r\n mapValues,\r\n merge,\r\n omit,\r\n pick,\r\n values,\r\n} from \"../internal/logx\";\r\n\r\n/**\r\n * Object state with immutable helpers.\r\n *\r\n * Several helpers delegate to @mwakidenis/logx object utilities (get, set,\r\n * pick, omit, merge, keys, values, entries, clone, deepClone, mapValues).\r\n * React-specific state management is kept in this hook; LOGX provides the pure\r\n * object transformations.\r\n *\r\n * @param initialValue - Initial object (defaults to {})\r\n */\r\nexport function useObject<T extends Record<string, unknown>>(\r\n initialValue: T = {} as T,\r\n): {\r\n object: T;\r\n set: (value: T | ((prev: T) => T)) => void;\r\n setKey: (key: string, value: unknown) => void;\r\n removeKey: (key: string) => void;\r\n clear: () => void;\r\n reset: () => void;\r\n pick: (keys: readonly string[]) => Partial<T>;\r\n omit: (keys: readonly string[]) => Partial<T>;\r\n merge: (sources: Partial<T>[]) => T;\r\n get: (path: string | Array<string | number>) => unknown;\r\n keys: () => string[];\r\n values: () => unknown[];\r\n entries: () => [string, unknown][];\r\n clone: () => T;\r\n deepClone: () => T;\r\n mapValues: <U>(iteratee: (value: unknown, key: string) => U) => Record<string, U>;\r\n} {\r\n const [object, setObject] = useState<T>(initialValue);\r\n\r\n const set = useCallback(\r\n (value: T | ((prev: T) => T)) =>\r\n setObject((prev) =>\r\n typeof value === \"function\"\r\n ? (value as (prev: T) => T)(prev)\r\n : value,\r\n ),\r\n [],\r\n );\r\n const setKey = useCallback((key: string, value: unknown) =>\r\n setObject((prev) => ({ ...prev, [key]: value }) as T),\r\n []);\r\n const removeKey = useCallback((key: string) =>\r\n setObject((prev) => {\r\n const next = { ...prev };\r\n delete next[key];\r\n return next as T;\r\n }),\r\n []);\r\n const clear = useCallback(() => setObject({} as T), []);\r\n const reset = useCallback(() => setObject(initialValue), [initialValue]);\r\n\r\n const pickValue = useCallback(\r\n (pickedKeys: readonly string[]) => pick(object, pickedKeys),\r\n [object],\r\n );\r\n const omitValue = useCallback(\r\n (omittedKeys: readonly string[]) => omit(object, omittedKeys),\r\n [object],\r\n );\r\n const mergeValue = useCallback(\r\n (sources: Partial<T>[]) => merge(object, ...sources) as T,\r\n [object],\r\n );\r\n const getValue = useCallback(\r\n (path: string | Array<string | number>) => get(object, path),\r\n [object],\r\n );\r\n const keysValue = useCallback(() => keys(object), [object]);\r\n const valuesValue = useCallback(() => values(object), [object]);\r\n const entriesValue = useCallback(() => entries(object), [object]);\r\n const cloneValue = useCallback(() => clone(object) as T, [object]);\r\n const deepCloneValue = useCallback(() => deepClone(object) as T, [object]);\r\n const mapValuesValue = useCallback(\r\n <U>(iteratee: (value: unknown, key: string) => U) =>\r\n mapValues(object, iteratee),\r\n [object],\r\n );\r\n\r\n return {\r\n object,\r\n set,\r\n setKey,\r\n removeKey,\r\n clear,\r\n reset,\r\n pick: pickValue,\r\n omit: omitValue,\r\n merge: mergeValue,\r\n get: getValue,\r\n keys: keysValue,\r\n values: valuesValue,\r\n entries: entriesValue,\r\n clone: cloneValue,\r\n deepClone: deepCloneValue,\r\n mapValues: mapValuesValue,\r\n };\r\n}\r\n","import { useEffect, useRef, useState } from \"react\";\r\nimport { useLatest } from \"./useLatest\";\r\nimport type { DebouncedValueOptions } from \"../types\";\r\n\r\n/**\r\n * Debounce a value.\r\n *\r\n * Returns the value after it has stopped changing for `delay` milliseconds.\r\n * Uses reference equality to detect changes; for objects/arrays pass a new\r\n * reference only when you want a debounce to restart.\r\n *\r\n * LOGX provides function debouncing (@mwakidenis/logx/function). This hook\r\n * implements value debouncing (a React-specific behaviour) on top of timers;\r\n * it does not map to an existing LOGX function.\r\n *\r\n * @param value - The value to debounce\r\n * @param options - delay (ms, default 300) and leading (default false)\r\n */\r\nexport function useDebouncedValue<T>(\r\n value: T,\r\n options: DebouncedValueOptions = {},\r\n): T {\r\n const { delay = 300, leading = false } = options;\r\n const [debounced, setDebounced] = useState(value);\r\n const latest = useLatest(value);\r\n const timerRef = useRef<ReturnType<typeof setTimeout> | null>(null);\r\n const lastLeadingRef = useRef<T | undefined>(undefined);\r\n\r\n useEffect(() => {\r\n if (timerRef.current !== null) {\r\n clearTimeout(timerRef.current);\r\n timerRef.current = null;\r\n }\r\n timerRef.current = setTimeout(() => {\r\n setDebounced(latest.current);\r\n timerRef.current = null;\r\n }, delay);\r\n return () => {\r\n if (timerRef.current !== null) {\r\n clearTimeout(timerRef.current);\r\n timerRef.current = null;\r\n }\r\n };\r\n }, [value, delay]);\r\n\r\n useEffect(() => {\r\n if (!leading) return;\r\n const current = latest.current;\r\n if (lastLeadingRef.current !== current) {\r\n lastLeadingRef.current = current;\r\n setDebounced(current);\r\n }\r\n }, [value, leading]);\r\n\r\n return debounced;\r\n}\r\n","import { useCallback, useEffect, useRef } from \"react\";\r\nimport { debounce as logxDebounce, type Cancelable } from \"../internal/logx\";\r\nimport { useLatest } from \"./useLatest\";\r\n\r\n/**\r\n * Debounce a callback using LOGX's `debounce` (@mwakidenis/logx/function).\r\n *\r\n * LOGX debounce is trailing-edge only: the function is invoked after `delay`\r\n * milliseconds of inactivity. It exposes `cancel`, `flush` and `pending`.\r\n *\r\n * The latest callback reference is captured internally so the debounced\r\n * function never holds a stale closure, even if `callback` changes every render.\r\n *\r\n * @param callback - Function to debounce\r\n * @param delay - Delay in milliseconds\r\n */\r\nexport function useDebouncedCallback<\r\n F extends (...args: unknown[]) => unknown,\r\n>(\r\n callback: F,\r\n delay: number,\r\n): {\r\n (...args: Parameters<F>): void;\r\n cancel: () => void;\r\n flush: () => void;\r\n pending: () => boolean;\r\n} {\r\n const latest = useLatest(callback);\r\n const debouncedRef = useRef<((...args: Parameters<F>) => void) & Cancelable | null>(null);\r\n\r\n useEffect(() => {\r\n const debounced = logxDebounce(\r\n (...args: unknown[]) => {\r\n latest.current(...(args as Parameters<F>));\r\n },\r\n delay,\r\n );\r\n debouncedRef.current = debounced as ((...args: Parameters<F>) => void) & Cancelable;\r\n return () => {\r\n debounced.cancel();\r\n };\r\n }, [delay]);\r\n\r\n const invoke = useCallback((...args: Parameters<F>) => {\r\n debouncedRef.current?.(...args);\r\n }, []);\r\n\r\n const cancel = useCallback(() => {\r\n debouncedRef.current?.cancel();\r\n }, []);\r\n const flush = useCallback(() => {\r\n debouncedRef.current?.flush();\r\n }, []);\r\n const pending = useCallback(() => debouncedRef.current?.pending() ?? false, []);\r\n\r\n return Object.assign(invoke, { cancel, flush, pending });\r\n}\r\n","import { useCallback, useEffect, useRef } from \"react\";\r\nimport { throttle as logxThrottle, type Cancelable } from \"../internal/logx\";\r\nimport { useLatest } from \"./useLatest\";\r\n\r\n/**\r\n * Throttle a callback using LOGX's `throttle` (@mwakidenis/logx/function).\r\n *\r\n * LOGX throttle invokes on the leading edge and flushes the trailing edge at\r\n * the end of the wait period. It exposes `cancel`, `flush` and `pending`.\r\n *\r\n * @param callback - Function to throttle\r\n * @param wait - Wait period in milliseconds\r\n */\r\nexport function useThrottle<F extends (...args: unknown[]) => unknown>(\r\n callback: F,\r\n wait: number,\r\n): {\r\n (...args: Parameters<F>): void;\r\n cancel: () => void;\r\n flush: () => void;\r\n pending: () => boolean;\r\n} {\r\n const latest = useLatest(callback);\r\n const throttledRef = useRef<((...args: Parameters<F>) => void) & Cancelable | null>(null);\r\n\r\n useEffect(() => {\r\n const throttled = logxThrottle(\r\n (...args: unknown[]) => {\r\n latest.current(...(args as Parameters<F>));\r\n },\r\n wait,\r\n );\r\n throttledRef.current = throttled as ((...args: Parameters<F>) => void) & Cancelable;\r\n return () => {\r\n throttled.cancel();\r\n };\r\n }, [wait]);\r\n\r\n const invoke = useCallback((...args: Parameters<F>) => {\r\n throttledRef.current?.(...args);\r\n }, []);\r\n\r\n const cancel = useCallback(() => {\r\n throttledRef.current?.cancel();\r\n }, []);\r\n const flush = useCallback(() => {\r\n throttledRef.current?.flush();\r\n }, []);\r\n const pending = useCallback(() => throttledRef.current?.pending() ?? false, []);\r\n\r\n return Object.assign(invoke, { cancel, flush, pending });\r\n}\r\n","/**\r\n * Storage utilities.\r\n *\r\n * React-specific storage logic lives here. The underlying safe, exception-guarded\r\n * storage operations come from @mwakidenis/logx (safeStorage, localStorageHelpers,\r\n * sessionStorageHelpers) and are re-exported through the LOGX integration layer\r\n * so the consumer sees a single integration boundary.\r\n */\r\n\r\nexport interface StorageValue<T> {\r\n value: T | null;\r\n error: Error | null;\r\n}\r\n\r\nexport interface Serializer<T> {\r\n serialize(value: T): string;\r\n deserialize(raw: string | null): T | null;\r\n}\r\n\r\nexport const jsonSerializer: Serializer<unknown> = {\r\n serialize: (value) => JSON.stringify(value),\r\n deserialize: (raw) => {\r\n if (raw === null) return null;\r\n try {\r\n return JSON.parse(raw);\r\n } catch {\r\n return null;\r\n }\r\n },\r\n};\r\n\r\nexport function createSerializer<T>(): Serializer<T> {\r\n return {\r\n serialize: (value) => JSON.stringify(value) as unknown as string,\r\n deserialize: (raw) => {\r\n if (raw === null) return null;\r\n try {\r\n return JSON.parse(raw) as T;\r\n } catch {\r\n return null;\r\n }\r\n },\r\n };\r\n}\r\n","import { useCallback, useEffect, useState } from \"react\";\r\nimport { localStorageHelpers } from \"../../internal/logx\";\r\nimport { jsonSerializer } from \"../../internal/storage\";\r\nimport type { Serializer } from \"../../internal/storage\";\r\nimport type { SetValue } from \"../../types\";\r\n\r\n/**\r\n * State synchronized with localStorage.\r\n *\r\n * Uses @mwakidenis/logx `localStorageHelpers` / `safeStorage` under the hood,\r\n * so storage access is exception-guarded and returns gracefully when\r\n * localStorage is unavailable (e.g. private browsing, SSR).\r\n *\r\n * Hydration-safe: the initial render returns `initialValue` on both server\r\n * and client; storage is read in an effect after mount.\r\n *\r\n * @param key - Storage key\r\n * @param initialValue - Fallback value when nothing is stored or on SSR\r\n * @param options - Optional custom serializer\r\n */\r\nexport function useLocalStorage<T>(\r\n key: string,\r\n initialValue: T,\r\n options?: { serializer?: Serializer<T> },\r\n): [T, (value: SetValue<T>) => void, () => void] {\r\n const serializer = options?.serializer ?? (jsonSerializer as Serializer<T>);\r\n const [value, setValue] = useState<T>(initialValue);\r\n\r\n useEffect(() => {\r\n const helpers = localStorageHelpers();\r\n if (!helpers) return;\r\n const raw = helpers.get(key);\r\n if (raw === null) return;\r\n const parsed = serializer.deserialize(raw);\r\n if (parsed !== null) setValue(parsed as T);\r\n }, [key, serializer]);\r\n\r\n const set = useCallback(\r\n (next: T | ((prev: T) => T)) =>\r\n setValue((prev) => {\r\n const resolved = typeof next === \"function\"\r\n ? (next as (prev: T) => T)(prev)\r\n : next;\r\n const helpers = localStorageHelpers();\r\n if (helpers) {\r\n try {\r\n helpers.set(key, serializer.serialize(resolved));\r\n } catch {\r\n // Storage write failed; state is still updated locally.\r\n }\r\n }\r\n return resolved;\r\n }),\r\n [key, serializer],\r\n );\r\n\r\n const remove = useCallback(() => {\r\n setValue(initialValue);\r\n const helpers = localStorageHelpers();\r\n if (helpers) {\r\n try {\r\n helpers.remove(key);\r\n } catch {\r\n // Ignore storage removal failures.\r\n }\r\n }\r\n }, [key, initialValue]);\r\n\r\n useEffect(() => {\r\n if (typeof window === \"undefined\") return;\r\n const handle = (event: StorageEvent) => {\r\n if (event.key === key && event.storageArea === localStorage) {\r\n const parsed =\r\n event.newValue === null\r\n ? null\r\n : serializer.deserialize(event.newValue);\r\n if (parsed !== null) setValue(parsed as T);\r\n }\r\n };\r\n window.addEventListener(\"storage\", handle);\r\n return () => window.removeEventListener(\"storage\", handle);\r\n }, [key, serializer]);\r\n\r\n return [value, set, remove];\r\n}\r\n","import { useCallback, useEffect, useState } from \"react\";\r\nimport { sessionStorageHelpers } from \"../../internal/logx\";\r\nimport { jsonSerializer } from \"../../internal/storage\";\r\nimport type { Serializer } from \"../../internal/storage\";\r\nimport type { SetValue } from \"../../types\";\r\n\r\n/**\r\n * State synchronized with sessionStorage.\r\n *\r\n * Same contract as useLocalStorage but backed by sessionStorage (tab-scoped,\r\n * cleared when the tab/session ends).\r\n *\r\n * @param key - Storage key\r\n * @param initialValue - Fallback value when nothing is stored or on SSR\r\n * @param options - Optional custom serializer\r\n */\r\nexport function useSessionStorage<T>(\r\n key: string,\r\n initialValue: T,\r\n options?: { serializer?: Serializer<T> },\r\n): [T, (value: SetValue<T>) => void, () => void] {\r\n const serializer = options?.serializer ?? (jsonSerializer as Serializer<T>);\r\n const [value, setValue] = useState<T>(initialValue);\r\n\r\n useEffect(() => {\r\n const helpers = sessionStorageHelpers();\r\n if (!helpers) return;\r\n const raw = helpers.get(key);\r\n if (raw === null) return;\r\n const parsed = serializer.deserialize(raw);\r\n if (parsed !== null) setValue(parsed as T);\r\n }, [key, serializer]);\r\n\r\n const set = useCallback(\r\n (next: T | ((prev: T) => T)) =>\r\n setValue((prev) => {\r\n const resolved = typeof next === \"function\"\r\n ? (next as (prev: T) => T)(prev)\r\n : next;\r\n const helpers = sessionStorageHelpers();\r\n if (helpers) {\r\n try {\r\n helpers.set(key, serializer.serialize(resolved));\r\n } catch {\r\n // Ignore storage write failures.\r\n }\r\n }\r\n return resolved;\r\n }),\r\n [key, serializer],\r\n );\r\n\r\n const remove = useCallback(() => {\r\n setValue(initialValue);\r\n const helpers = sessionStorageHelpers();\r\n if (helpers) {\r\n try {\r\n helpers.remove(key);\r\n } catch {\r\n // Ignore storage removal failures.\r\n }\r\n }\r\n }, [key, initialValue]);\r\n\r\n return [value, set, remove];\r\n}\r\n","import { useEffect, useState } from \"react\";\r\n\r\n/**\r\n * Track whether a media query matches.\r\n *\r\n * SSR-safe: returns `false` on the server and before mount, then reflects the\r\n * real match status after mount. Listens for `change` events and cleans up on\r\n * unmount.\r\n *\r\n * @param query - A CSS media query string\r\n */\r\nexport function useMediaQuery(query: string): boolean {\r\n const [matches, setMatches] = useState(false);\r\n\r\n useEffect(() => {\r\n if (typeof window === \"undefined\") return;\r\n const media = window.matchMedia(query);\r\n setMatches(media.matches);\r\n const handler = (event: MediaQueryListEvent) => setMatches(event.matches);\r\n media.addEventListener(\"change\", handler);\r\n return () => {\r\n media.removeEventListener(\"change\", handler);\r\n };\r\n }, [query]);\r\n\r\n return matches;\r\n}\r\n","import { useEffect, useState } from \"react\";\r\n\r\n/**\r\n * Track the window size (innerWidth / innerHeight).\r\n *\r\n * SSR-safe: returns { width: 0, height: 0 } on the server and first client\r\n * render, then updates on resize. Cleans up the listener on unmount.\r\n */\r\nexport function useWindowSize(): { width: number; height: number } {\r\n const [size, setSize] = useState<{ width: number; height: number }>(\r\n () => (typeof window !== \"undefined\"\r\n ? { width: window.innerWidth, height: window.innerHeight }\r\n : { width: 0, height: 0 }),\r\n );\r\n\r\n useEffect(() => {\r\n if (typeof window === \"undefined\") return;\r\n const handler = () =>\r\n setSize({ width: window.innerWidth, height: window.innerHeight });\r\n window.addEventListener(\"resize\", handler);\r\n return () => window.removeEventListener(\"resize\", handler);\r\n }, []);\r\n\r\n return size;\r\n}\r\n","import { useEffect, useRef } from \"react\";\r\n\r\n/**\r\n * Fire a handler when a click occurs outside a ref'd element.\r\n *\r\n * Uses useLatest internally so the handler is always current without\r\n * re-subscribing the document listeners every render.\r\n *\r\n * @param ref - A ref to the element to ignore clicks for\r\n * @param handler - Callback fired on outside click\r\n */\r\nexport function useClickOutside(\r\n ref: { current: HTMLElement | null | undefined },\r\n handler: (event: MouseEvent | TouchEvent) => void,\r\n): void {\r\n const latest = useRef(handler);\r\n latest.current = handler;\r\n\r\n useEffect(() => {\r\n const handle = (event: MouseEvent | TouchEvent) => {\r\n if (ref.current && !ref.current.contains(event.target as Node)) {\r\n latest.current(event);\r\n }\r\n };\r\n if (typeof document !== \"undefined\") {\r\n document.addEventListener(\"mousedown\", handle);\r\n document.addEventListener(\"touchstart\", handle);\r\n return () => {\r\n document.removeEventListener(\"mousedown\", handle);\r\n document.removeEventListener(\"touchstart\", handle);\r\n };\r\n }\r\n return undefined;\r\n }, [ref]);\r\n}\r\n","import { useEffect, useRef } from \"react\";\r\n\r\n/**\r\n * Attach an event listener with automatic cleanup on unmount.\r\n *\r\n * Supports window, document, element, or Document/Window targets. The listener\r\n * is captured via a ref so it stays current without re-attaching.\r\n *\r\n * @param target - EventTarget (window, document, element) or null/undefined\r\n * @param type - Event type\r\n * @param listener - Event listener\r\n * @param options - AddEventListenerOptions or capture boolean\r\n */\r\nexport function useEventListener(\r\n target: EventTarget | null | undefined,\r\n type: string,\r\n listener: EventListener,\r\n options?: boolean | AddEventListenerOptions,\r\n): void {\r\n const latest = useRef(listener);\r\n latest.current = listener;\r\n\r\n useEffect(() => {\r\n if (!target) return undefined;\r\n const handle = (event: Event) => latest.current(event);\r\n target.addEventListener(type, handle, options);\r\n return () => {\r\n target.removeEventListener(type, handle, options);\r\n };\r\n }, [target, type, options]);\r\n}\r\n","import { useCallback } from \"react\";\r\n\r\n/**\r\n * Copy text to the clipboard.\r\n *\r\n * Uses the Clipboard API when available, with a textarea fallback for older\r\n * browsers. Never throws; returns false on failure.\r\n */\r\nexport function useClipboard(): {\r\n copy: (text: string) => Promise<boolean>;\r\n isSupported: boolean;\r\n} {\r\n const isSupported =\r\n typeof navigator !== \"undefined\" && !!navigator.clipboard && !!navigator.clipboard.writeText;\r\n\r\n const copy = useCallback(async (text: string): Promise<boolean> => {\r\n try {\r\n if (isSupported && typeof navigator !== \"undefined\") {\r\n await navigator.clipboard.writeText(text);\r\n return true;\r\n }\r\n // Fallback for environments without the Clipboard API.\r\n if (typeof document !== \"undefined\") {\r\n const textarea = document.createElement(\"textarea\");\r\n textarea.value = text;\r\n textarea.setAttribute(\"readonly\", \"\");\r\n textarea.style.position = \"absolute\";\r\n textarea.style.position = \"fixed\";\r\n textarea.style.opacity = \"0\";\r\n document.body.appendChild(textarea);\r\n textarea.select();\r\n try {\r\n document.execCommand(\"copy\");\r\n } finally {\r\n document.body.removeChild(textarea);\r\n }\r\n return true;\r\n }\r\n return false;\r\n } catch {\r\n return false;\r\n }\r\n }, [isSupported]);\r\n\r\n return { copy, isSupported };\r\n}\r\n","import { useEffect, useState } from \"react\";\r\n\r\n/**\r\n * Track online/offline status.\r\n *\r\n * SSR-safe: assumes `true` on the server, then reads `navigator.onLine` after\r\n * mount and listens for `online`/`offline` events.\r\n */\r\nexport function useOnlineStatus(): boolean {\r\n const [online, setOnline] = useState<boolean>(\r\n () => (typeof navigator !== \"undefined\" ? navigator.onLine : true),\r\n );\r\n\r\n useEffect(() => {\r\n if (typeof window === \"undefined\") return;\r\n setOnline(navigator.onLine);\r\n const onOnline = () => setOnline(true);\r\n const onOffline = () => setOnline(false);\r\n window.addEventListener(\"online\", onOnline);\r\n window.addEventListener(\"offline\", onOffline);\r\n return () => {\r\n window.removeEventListener(\"online\", onOnline);\r\n window.removeEventListener(\"offline\", onOffline);\r\n };\r\n }, []);\r\n\r\n return online;\r\n}\r\n","import { useCallback, useEffect, useRef, useState } from \"react\";\r\nimport { useLatest } from \"./useLatest\";\r\n\r\n/**\r\n * A controllable timeout hook.\r\n *\r\n * Provides start/stop/reset and clears the timer on unmount. The callback is\r\n * captured via useLatest so it never goes stale. `active` reflects whether a\r\n * timeout is currently scheduled.\r\n *\r\n * @param callback - Function to invoke after the delay\r\n * @param delay - Delay in milliseconds, or null to disable\r\n */\r\nexport function useTimeout(\r\n callback: () => void,\r\n delay: number | null,\r\n): {\r\n start: () => void;\r\n stop: () => void;\r\n reset: () => void;\r\n active: boolean;\r\n} {\r\n const latest = useLatest(callback);\r\n const timerRef = useRef<ReturnType<typeof setTimeout> | null>(null);\r\n const [active, setActive] = useState(false);\r\n\r\n const stop = useCallback(() => {\r\n if (timerRef.current !== null) {\r\n clearTimeout(timerRef.current);\r\n timerRef.current = null;\r\n }\r\n setActive(false);\r\n }, []);\r\n\r\n const start = useCallback(() => {\r\n stop();\r\n if (delay !== null && delay >= 0) {\r\n timerRef.current = setTimeout(() => {\r\n timerRef.current = null;\r\n setActive(false);\r\n latest.current();\r\n }, delay);\r\n setActive(true);\r\n }\r\n }, [delay]);\r\n\r\n const reset = useCallback(() => {\r\n start();\r\n }, [start]);\r\n\r\n useEffect(() => {\r\n start();\r\n return () => stop();\r\n }, [delay, start, stop]);\r\n\r\n return { start, stop, reset, active };\r\n}\r\n","import { useCallback, useEffect, useRef, useState } from \"react\";\r\nimport { useLatest } from \"./useLatest\";\r\n\r\n/**\r\n * A controllable interval hook.\r\n *\r\n * Provides start/stop and clears the interval on unmount. The callback is\r\n * captured via useLatest so it never goes stale. `active` reflects whether an\r\n * interval is currently scheduled.\r\n *\r\n * @param callback - Function to invoke every `delay` milliseconds\r\n * @param delay - Delay in milliseconds, or null to disable\r\n */\r\nexport function useInterval(\r\n callback: () => void,\r\n delay: number | null,\r\n): {\r\n start: () => void;\r\n stop: () => void;\r\n active: boolean;\r\n} {\r\n const latest = useLatest(callback);\r\n const timerRef = useRef<ReturnType<typeof setInterval> | null>(null);\r\n const [active, setActive] = useState(false);\r\n\r\n const stop = useCallback(() => {\r\n if (timerRef.current !== null) {\r\n clearInterval(timerRef.current);\r\n timerRef.current = null;\r\n }\r\n setActive(false);\r\n }, []);\r\n\r\n const start = useCallback(() => {\r\n stop();\r\n if (delay !== null && delay >= 0) {\r\n timerRef.current = setInterval(() => latest.current(), delay);\r\n setActive(true);\r\n }\r\n }, [delay]);\r\n\r\n useEffect(() => {\r\n start();\r\n return () => stop();\r\n }, [delay, start, stop]);\r\n\r\n return { start, stop, active };\r\n}\r\n","import { useCallback, useEffect, useRef, useState } from \"react\";\r\nimport { useLatest } from \"./useLatest\";\r\nimport type { AsyncState } from \"../types\";\r\n\r\n/**\r\n * Manage an asynchronous operation with loading, success and error states.\r\n *\r\n * Supports cancellation via AbortController, race-condition protection (only\r\n * the latest invocation updates state), and manual execute / reset.\r\n *\r\n * @param asyncFn - Function returning a Promise\r\n * @param immediate - Whether to invoke immediately on mount (default true)\r\n */\r\nexport function useAsync<T>(\r\n asyncFn: () => Promise<T>,\r\n immediate: boolean = true,\r\n): AsyncState<T> & {\r\n execute: () => Promise<void>;\r\n setData: (data: T) => void;\r\n setError: (error: Error) => void;\r\n reset: () => void;\r\n cancel: () => void;\r\n} {\r\n const [state, setState] = useState<AsyncState<T>>({\r\n data: null,\r\n error: null,\r\n isLoading: false,\r\n isSuccess: false,\r\n isError: false,\r\n });\r\n const latest = useLatest(asyncFn);\r\n const abortRef = useRef<AbortController | null>(null);\r\n const seqRef = useRef(0);\r\n\r\n const cancel = useCallback(() => {\r\n if (abortRef.current) {\r\n abortRef.current.abort();\r\n abortRef.current = null;\r\n setState({ data: null, error: null, isLoading: false, isSuccess: false, isError: false });\r\n }\r\n }, []);\r\n\r\n const setData = useCallback((data: T) => {\r\n setState({ data, error: null, isLoading: false, isSuccess: true, isError: false });\r\n }, []);\r\n\r\n const setError = useCallback((error: Error) => {\r\n setState({ data: null, error, isLoading: false, isSuccess: false, isError: true });\r\n }, []);\r\n\r\n const reset = useCallback(() => {\r\n cancel();\r\n setState({ data: null, error: null, isLoading: false, isSuccess: false, isError: false });\r\n }, [cancel]);\r\n\r\n const execute = useCallback(async () => {\r\n cancel();\r\n const controller = new AbortController();\r\n abortRef.current = controller;\r\n const seq = ++seqRef.current;\r\n setState({ data: null, error: null, isLoading: true, isSuccess: false, isError: false });\r\n try {\r\n const data = await latest.current();\r\n if (controller.signal.aborted || seq !== seqRef.current) return;\r\n setState({ data, error: null, isLoading: false, isSuccess: true, isError: false });\r\n } catch (err) {\r\n if (controller.signal.aborted || seq !== seqRef.current) return;\r\n const error = err instanceof Error ? err : new Error(String(err));\r\n setState({ data: null, error, isLoading: false, isSuccess: false, isError: true });\r\n } finally {\r\n if (abortRef.current === controller) abortRef.current = null;\r\n }\r\n }, []);\r\n\r\n useEffect(() => {\r\n if (!immediate) return;\r\n void execute();\r\n return () => cancel();\r\n }, [immediate, execute, cancel]);\r\n\r\n return { ...state, execute, setData, setError, reset, cancel };\r\n}\r\n"]}
@@ -0,0 +1,40 @@
1
+ import { SetValue } from '../../types/index.mjs';
2
+
3
+ interface Serializer<T> {
4
+ serialize(value: T): string;
5
+ deserialize(raw: string | null): T | null;
6
+ }
7
+
8
+ /**
9
+ * State synchronized with localStorage.
10
+ *
11
+ * Uses @mwakidenis/logx `localStorageHelpers` / `safeStorage` under the hood,
12
+ * so storage access is exception-guarded and returns gracefully when
13
+ * localStorage is unavailable (e.g. private browsing, SSR).
14
+ *
15
+ * Hydration-safe: the initial render returns `initialValue` on both server
16
+ * and client; storage is read in an effect after mount.
17
+ *
18
+ * @param key - Storage key
19
+ * @param initialValue - Fallback value when nothing is stored or on SSR
20
+ * @param options - Optional custom serializer
21
+ */
22
+ declare function useLocalStorage<T>(key: string, initialValue: T, options?: {
23
+ serializer?: Serializer<T>;
24
+ }): [T, (value: SetValue<T>) => void, () => void];
25
+
26
+ /**
27
+ * State synchronized with sessionStorage.
28
+ *
29
+ * Same contract as useLocalStorage but backed by sessionStorage (tab-scoped,
30
+ * cleared when the tab/session ends).
31
+ *
32
+ * @param key - Storage key
33
+ * @param initialValue - Fallback value when nothing is stored or on SSR
34
+ * @param options - Optional custom serializer
35
+ */
36
+ declare function useSessionStorage<T>(key: string, initialValue: T, options?: {
37
+ serializer?: Serializer<T>;
38
+ }): [T, (value: SetValue<T>) => void, () => void];
39
+
40
+ export { useLocalStorage, useSessionStorage };
@@ -0,0 +1,40 @@
1
+ import { SetValue } from '../../types/index.js';
2
+
3
+ interface Serializer<T> {
4
+ serialize(value: T): string;
5
+ deserialize(raw: string | null): T | null;
6
+ }
7
+
8
+ /**
9
+ * State synchronized with localStorage.
10
+ *
11
+ * Uses @mwakidenis/logx `localStorageHelpers` / `safeStorage` under the hood,
12
+ * so storage access is exception-guarded and returns gracefully when
13
+ * localStorage is unavailable (e.g. private browsing, SSR).
14
+ *
15
+ * Hydration-safe: the initial render returns `initialValue` on both server
16
+ * and client; storage is read in an effect after mount.
17
+ *
18
+ * @param key - Storage key
19
+ * @param initialValue - Fallback value when nothing is stored or on SSR
20
+ * @param options - Optional custom serializer
21
+ */
22
+ declare function useLocalStorage<T>(key: string, initialValue: T, options?: {
23
+ serializer?: Serializer<T>;
24
+ }): [T, (value: SetValue<T>) => void, () => void];
25
+
26
+ /**
27
+ * State synchronized with sessionStorage.
28
+ *
29
+ * Same contract as useLocalStorage but backed by sessionStorage (tab-scoped,
30
+ * cleared when the tab/session ends).
31
+ *
32
+ * @param key - Storage key
33
+ * @param initialValue - Fallback value when nothing is stored or on SSR
34
+ * @param options - Optional custom serializer
35
+ */
36
+ declare function useSessionStorage<T>(key: string, initialValue: T, options?: {
37
+ serializer?: Serializer<T>;
38
+ }): [T, (value: SetValue<T>) => void, () => void];
39
+
40
+ export { useLocalStorage, useSessionStorage };
@@ -0,0 +1,119 @@
1
+ 'use strict';
2
+
3
+ var react = require('react');
4
+ require('@mwakidenis/logx/function');
5
+ var browser = require('@mwakidenis/logx/browser');
6
+ require('@mwakidenis/logx/validation');
7
+ require('@mwakidenis/logx/object');
8
+ require('@mwakidenis/logx/number');
9
+ require('@mwakidenis/logx/array');
10
+ require('@mwakidenis/logx/async');
11
+ require('@mwakidenis/logx/date');
12
+ require('@mwakidenis/logx/string');
13
+
14
+ // src/hooks/storage/useLocalStorage.ts
15
+
16
+ // src/internal/storage.ts
17
+ var jsonSerializer = {
18
+ serialize: (value) => JSON.stringify(value),
19
+ deserialize: (raw) => {
20
+ if (raw === null) return null;
21
+ try {
22
+ return JSON.parse(raw);
23
+ } catch {
24
+ return null;
25
+ }
26
+ }
27
+ };
28
+
29
+ // src/hooks/storage/useLocalStorage.ts
30
+ function useLocalStorage(key, initialValue, options) {
31
+ const serializer = options?.serializer ?? jsonSerializer;
32
+ const [value, setValue] = react.useState(initialValue);
33
+ react.useEffect(() => {
34
+ const helpers = browser.localStorageHelpers();
35
+ if (!helpers) return;
36
+ const raw = helpers.get(key);
37
+ if (raw === null) return;
38
+ const parsed = serializer.deserialize(raw);
39
+ if (parsed !== null) setValue(parsed);
40
+ }, [key, serializer]);
41
+ const set2 = react.useCallback(
42
+ (next) => setValue((prev) => {
43
+ const resolved = typeof next === "function" ? next(prev) : next;
44
+ const helpers = browser.localStorageHelpers();
45
+ if (helpers) {
46
+ try {
47
+ helpers.set(key, serializer.serialize(resolved));
48
+ } catch {
49
+ }
50
+ }
51
+ return resolved;
52
+ }),
53
+ [key, serializer]
54
+ );
55
+ const remove = react.useCallback(() => {
56
+ setValue(initialValue);
57
+ const helpers = browser.localStorageHelpers();
58
+ if (helpers) {
59
+ try {
60
+ helpers.remove(key);
61
+ } catch {
62
+ }
63
+ }
64
+ }, [key, initialValue]);
65
+ react.useEffect(() => {
66
+ if (typeof window === "undefined") return;
67
+ const handle = (event) => {
68
+ if (event.key === key && event.storageArea === localStorage) {
69
+ const parsed = event.newValue === null ? null : serializer.deserialize(event.newValue);
70
+ if (parsed !== null) setValue(parsed);
71
+ }
72
+ };
73
+ window.addEventListener("storage", handle);
74
+ return () => window.removeEventListener("storage", handle);
75
+ }, [key, serializer]);
76
+ return [value, set2, remove];
77
+ }
78
+ function useSessionStorage(key, initialValue, options) {
79
+ const serializer = options?.serializer ?? jsonSerializer;
80
+ const [value, setValue] = react.useState(initialValue);
81
+ react.useEffect(() => {
82
+ const helpers = browser.sessionStorageHelpers();
83
+ if (!helpers) return;
84
+ const raw = helpers.get(key);
85
+ if (raw === null) return;
86
+ const parsed = serializer.deserialize(raw);
87
+ if (parsed !== null) setValue(parsed);
88
+ }, [key, serializer]);
89
+ const set2 = react.useCallback(
90
+ (next) => setValue((prev) => {
91
+ const resolved = typeof next === "function" ? next(prev) : next;
92
+ const helpers = browser.sessionStorageHelpers();
93
+ if (helpers) {
94
+ try {
95
+ helpers.set(key, serializer.serialize(resolved));
96
+ } catch {
97
+ }
98
+ }
99
+ return resolved;
100
+ }),
101
+ [key, serializer]
102
+ );
103
+ const remove = react.useCallback(() => {
104
+ setValue(initialValue);
105
+ const helpers = browser.sessionStorageHelpers();
106
+ if (helpers) {
107
+ try {
108
+ helpers.remove(key);
109
+ } catch {
110
+ }
111
+ }
112
+ }, [key, initialValue]);
113
+ return [value, set2, remove];
114
+ }
115
+
116
+ exports.useLocalStorage = useLocalStorage;
117
+ exports.useSessionStorage = useSessionStorage;
118
+ //# sourceMappingURL=index.js.map
119
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../../src/internal/storage.ts","../../../src/hooks/storage/useLocalStorage.ts","../../../src/hooks/storage/useSessionStorage.ts"],"names":["useState","useEffect","logxLocalStorageHelpers","set","useCallback","logxSessionStorageHelpers"],"mappings":"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","file":"index.js","sourcesContent":["/**\r\n * Storage utilities.\r\n *\r\n * React-specific storage logic lives here. The underlying safe, exception-guarded\r\n * storage operations come from @mwakidenis/logx (safeStorage, localStorageHelpers,\r\n * sessionStorageHelpers) and are re-exported through the LOGX integration layer\r\n * so the consumer sees a single integration boundary.\r\n */\r\n\r\nexport interface StorageValue<T> {\r\n value: T | null;\r\n error: Error | null;\r\n}\r\n\r\nexport interface Serializer<T> {\r\n serialize(value: T): string;\r\n deserialize(raw: string | null): T | null;\r\n}\r\n\r\nexport const jsonSerializer: Serializer<unknown> = {\r\n serialize: (value) => JSON.stringify(value),\r\n deserialize: (raw) => {\r\n if (raw === null) return null;\r\n try {\r\n return JSON.parse(raw);\r\n } catch {\r\n return null;\r\n }\r\n },\r\n};\r\n\r\nexport function createSerializer<T>(): Serializer<T> {\r\n return {\r\n serialize: (value) => JSON.stringify(value) as unknown as string,\r\n deserialize: (raw) => {\r\n if (raw === null) return null;\r\n try {\r\n return JSON.parse(raw) as T;\r\n } catch {\r\n return null;\r\n }\r\n },\r\n };\r\n}\r\n","import { useCallback, useEffect, useState } from \"react\";\r\nimport { localStorageHelpers } from \"../../internal/logx\";\r\nimport { jsonSerializer } from \"../../internal/storage\";\r\nimport type { Serializer } from \"../../internal/storage\";\r\nimport type { SetValue } from \"../../types\";\r\n\r\n/**\r\n * State synchronized with localStorage.\r\n *\r\n * Uses @mwakidenis/logx `localStorageHelpers` / `safeStorage` under the hood,\r\n * so storage access is exception-guarded and returns gracefully when\r\n * localStorage is unavailable (e.g. private browsing, SSR).\r\n *\r\n * Hydration-safe: the initial render returns `initialValue` on both server\r\n * and client; storage is read in an effect after mount.\r\n *\r\n * @param key - Storage key\r\n * @param initialValue - Fallback value when nothing is stored or on SSR\r\n * @param options - Optional custom serializer\r\n */\r\nexport function useLocalStorage<T>(\r\n key: string,\r\n initialValue: T,\r\n options?: { serializer?: Serializer<T> },\r\n): [T, (value: SetValue<T>) => void, () => void] {\r\n const serializer = options?.serializer ?? (jsonSerializer as Serializer<T>);\r\n const [value, setValue] = useState<T>(initialValue);\r\n\r\n useEffect(() => {\r\n const helpers = localStorageHelpers();\r\n if (!helpers) return;\r\n const raw = helpers.get(key);\r\n if (raw === null) return;\r\n const parsed = serializer.deserialize(raw);\r\n if (parsed !== null) setValue(parsed as T);\r\n }, [key, serializer]);\r\n\r\n const set = useCallback(\r\n (next: T | ((prev: T) => T)) =>\r\n setValue((prev) => {\r\n const resolved = typeof next === \"function\"\r\n ? (next as (prev: T) => T)(prev)\r\n : next;\r\n const helpers = localStorageHelpers();\r\n if (helpers) {\r\n try {\r\n helpers.set(key, serializer.serialize(resolved));\r\n } catch {\r\n // Storage write failed; state is still updated locally.\r\n }\r\n }\r\n return resolved;\r\n }),\r\n [key, serializer],\r\n );\r\n\r\n const remove = useCallback(() => {\r\n setValue(initialValue);\r\n const helpers = localStorageHelpers();\r\n if (helpers) {\r\n try {\r\n helpers.remove(key);\r\n } catch {\r\n // Ignore storage removal failures.\r\n }\r\n }\r\n }, [key, initialValue]);\r\n\r\n useEffect(() => {\r\n if (typeof window === \"undefined\") return;\r\n const handle = (event: StorageEvent) => {\r\n if (event.key === key && event.storageArea === localStorage) {\r\n const parsed =\r\n event.newValue === null\r\n ? null\r\n : serializer.deserialize(event.newValue);\r\n if (parsed !== null) setValue(parsed as T);\r\n }\r\n };\r\n window.addEventListener(\"storage\", handle);\r\n return () => window.removeEventListener(\"storage\", handle);\r\n }, [key, serializer]);\r\n\r\n return [value, set, remove];\r\n}\r\n","import { useCallback, useEffect, useState } from \"react\";\r\nimport { sessionStorageHelpers } from \"../../internal/logx\";\r\nimport { jsonSerializer } from \"../../internal/storage\";\r\nimport type { Serializer } from \"../../internal/storage\";\r\nimport type { SetValue } from \"../../types\";\r\n\r\n/**\r\n * State synchronized with sessionStorage.\r\n *\r\n * Same contract as useLocalStorage but backed by sessionStorage (tab-scoped,\r\n * cleared when the tab/session ends).\r\n *\r\n * @param key - Storage key\r\n * @param initialValue - Fallback value when nothing is stored or on SSR\r\n * @param options - Optional custom serializer\r\n */\r\nexport function useSessionStorage<T>(\r\n key: string,\r\n initialValue: T,\r\n options?: { serializer?: Serializer<T> },\r\n): [T, (value: SetValue<T>) => void, () => void] {\r\n const serializer = options?.serializer ?? (jsonSerializer as Serializer<T>);\r\n const [value, setValue] = useState<T>(initialValue);\r\n\r\n useEffect(() => {\r\n const helpers = sessionStorageHelpers();\r\n if (!helpers) return;\r\n const raw = helpers.get(key);\r\n if (raw === null) return;\r\n const parsed = serializer.deserialize(raw);\r\n if (parsed !== null) setValue(parsed as T);\r\n }, [key, serializer]);\r\n\r\n const set = useCallback(\r\n (next: T | ((prev: T) => T)) =>\r\n setValue((prev) => {\r\n const resolved = typeof next === \"function\"\r\n ? (next as (prev: T) => T)(prev)\r\n : next;\r\n const helpers = sessionStorageHelpers();\r\n if (helpers) {\r\n try {\r\n helpers.set(key, serializer.serialize(resolved));\r\n } catch {\r\n // Ignore storage write failures.\r\n }\r\n }\r\n return resolved;\r\n }),\r\n [key, serializer],\r\n );\r\n\r\n const remove = useCallback(() => {\r\n setValue(initialValue);\r\n const helpers = sessionStorageHelpers();\r\n if (helpers) {\r\n try {\r\n helpers.remove(key);\r\n } catch {\r\n // Ignore storage removal failures.\r\n }\r\n }\r\n }, [key, initialValue]);\r\n\r\n return [value, set, remove];\r\n}\r\n"]}
@@ -0,0 +1,116 @@
1
+ import { useState, useEffect, useCallback } from 'react';
2
+ import '@mwakidenis/logx/function';
3
+ import { localStorageHelpers, sessionStorageHelpers } from '@mwakidenis/logx/browser';
4
+ import '@mwakidenis/logx/validation';
5
+ import '@mwakidenis/logx/object';
6
+ import '@mwakidenis/logx/number';
7
+ import '@mwakidenis/logx/array';
8
+ import '@mwakidenis/logx/async';
9
+ import '@mwakidenis/logx/date';
10
+ import '@mwakidenis/logx/string';
11
+
12
+ // src/hooks/storage/useLocalStorage.ts
13
+
14
+ // src/internal/storage.ts
15
+ var jsonSerializer = {
16
+ serialize: (value) => JSON.stringify(value),
17
+ deserialize: (raw) => {
18
+ if (raw === null) return null;
19
+ try {
20
+ return JSON.parse(raw);
21
+ } catch {
22
+ return null;
23
+ }
24
+ }
25
+ };
26
+
27
+ // src/hooks/storage/useLocalStorage.ts
28
+ function useLocalStorage(key, initialValue, options) {
29
+ const serializer = options?.serializer ?? jsonSerializer;
30
+ const [value, setValue] = useState(initialValue);
31
+ useEffect(() => {
32
+ const helpers = localStorageHelpers();
33
+ if (!helpers) return;
34
+ const raw = helpers.get(key);
35
+ if (raw === null) return;
36
+ const parsed = serializer.deserialize(raw);
37
+ if (parsed !== null) setValue(parsed);
38
+ }, [key, serializer]);
39
+ const set2 = useCallback(
40
+ (next) => setValue((prev) => {
41
+ const resolved = typeof next === "function" ? next(prev) : next;
42
+ const helpers = localStorageHelpers();
43
+ if (helpers) {
44
+ try {
45
+ helpers.set(key, serializer.serialize(resolved));
46
+ } catch {
47
+ }
48
+ }
49
+ return resolved;
50
+ }),
51
+ [key, serializer]
52
+ );
53
+ const remove = useCallback(() => {
54
+ setValue(initialValue);
55
+ const helpers = localStorageHelpers();
56
+ if (helpers) {
57
+ try {
58
+ helpers.remove(key);
59
+ } catch {
60
+ }
61
+ }
62
+ }, [key, initialValue]);
63
+ useEffect(() => {
64
+ if (typeof window === "undefined") return;
65
+ const handle = (event) => {
66
+ if (event.key === key && event.storageArea === localStorage) {
67
+ const parsed = event.newValue === null ? null : serializer.deserialize(event.newValue);
68
+ if (parsed !== null) setValue(parsed);
69
+ }
70
+ };
71
+ window.addEventListener("storage", handle);
72
+ return () => window.removeEventListener("storage", handle);
73
+ }, [key, serializer]);
74
+ return [value, set2, remove];
75
+ }
76
+ function useSessionStorage(key, initialValue, options) {
77
+ const serializer = options?.serializer ?? jsonSerializer;
78
+ const [value, setValue] = useState(initialValue);
79
+ useEffect(() => {
80
+ const helpers = sessionStorageHelpers();
81
+ if (!helpers) return;
82
+ const raw = helpers.get(key);
83
+ if (raw === null) return;
84
+ const parsed = serializer.deserialize(raw);
85
+ if (parsed !== null) setValue(parsed);
86
+ }, [key, serializer]);
87
+ const set2 = useCallback(
88
+ (next) => setValue((prev) => {
89
+ const resolved = typeof next === "function" ? next(prev) : next;
90
+ const helpers = sessionStorageHelpers();
91
+ if (helpers) {
92
+ try {
93
+ helpers.set(key, serializer.serialize(resolved));
94
+ } catch {
95
+ }
96
+ }
97
+ return resolved;
98
+ }),
99
+ [key, serializer]
100
+ );
101
+ const remove = useCallback(() => {
102
+ setValue(initialValue);
103
+ const helpers = sessionStorageHelpers();
104
+ if (helpers) {
105
+ try {
106
+ helpers.remove(key);
107
+ } catch {
108
+ }
109
+ }
110
+ }, [key, initialValue]);
111
+ return [value, set2, remove];
112
+ }
113
+
114
+ export { useLocalStorage, useSessionStorage };
115
+ //# sourceMappingURL=index.mjs.map
116
+ //# sourceMappingURL=index.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../../src/internal/storage.ts","../../../src/hooks/storage/useLocalStorage.ts","../../../src/hooks/storage/useSessionStorage.ts"],"names":["logxLocalStorageHelpers","set","useState","useEffect","logxSessionStorageHelpers","useCallback"],"mappings":"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","file":"index.mjs","sourcesContent":["/**\r\n * Storage utilities.\r\n *\r\n * React-specific storage logic lives here. The underlying safe, exception-guarded\r\n * storage operations come from @mwakidenis/logx (safeStorage, localStorageHelpers,\r\n * sessionStorageHelpers) and are re-exported through the LOGX integration layer\r\n * so the consumer sees a single integration boundary.\r\n */\r\n\r\nexport interface StorageValue<T> {\r\n value: T | null;\r\n error: Error | null;\r\n}\r\n\r\nexport interface Serializer<T> {\r\n serialize(value: T): string;\r\n deserialize(raw: string | null): T | null;\r\n}\r\n\r\nexport const jsonSerializer: Serializer<unknown> = {\r\n serialize: (value) => JSON.stringify(value),\r\n deserialize: (raw) => {\r\n if (raw === null) return null;\r\n try {\r\n return JSON.parse(raw);\r\n } catch {\r\n return null;\r\n }\r\n },\r\n};\r\n\r\nexport function createSerializer<T>(): Serializer<T> {\r\n return {\r\n serialize: (value) => JSON.stringify(value) as unknown as string,\r\n deserialize: (raw) => {\r\n if (raw === null) return null;\r\n try {\r\n return JSON.parse(raw) as T;\r\n } catch {\r\n return null;\r\n }\r\n },\r\n };\r\n}\r\n","import { useCallback, useEffect, useState } from \"react\";\r\nimport { localStorageHelpers } from \"../../internal/logx\";\r\nimport { jsonSerializer } from \"../../internal/storage\";\r\nimport type { Serializer } from \"../../internal/storage\";\r\nimport type { SetValue } from \"../../types\";\r\n\r\n/**\r\n * State synchronized with localStorage.\r\n *\r\n * Uses @mwakidenis/logx `localStorageHelpers` / `safeStorage` under the hood,\r\n * so storage access is exception-guarded and returns gracefully when\r\n * localStorage is unavailable (e.g. private browsing, SSR).\r\n *\r\n * Hydration-safe: the initial render returns `initialValue` on both server\r\n * and client; storage is read in an effect after mount.\r\n *\r\n * @param key - Storage key\r\n * @param initialValue - Fallback value when nothing is stored or on SSR\r\n * @param options - Optional custom serializer\r\n */\r\nexport function useLocalStorage<T>(\r\n key: string,\r\n initialValue: T,\r\n options?: { serializer?: Serializer<T> },\r\n): [T, (value: SetValue<T>) => void, () => void] {\r\n const serializer = options?.serializer ?? (jsonSerializer as Serializer<T>);\r\n const [value, setValue] = useState<T>(initialValue);\r\n\r\n useEffect(() => {\r\n const helpers = localStorageHelpers();\r\n if (!helpers) return;\r\n const raw = helpers.get(key);\r\n if (raw === null) return;\r\n const parsed = serializer.deserialize(raw);\r\n if (parsed !== null) setValue(parsed as T);\r\n }, [key, serializer]);\r\n\r\n const set = useCallback(\r\n (next: T | ((prev: T) => T)) =>\r\n setValue((prev) => {\r\n const resolved = typeof next === \"function\"\r\n ? (next as (prev: T) => T)(prev)\r\n : next;\r\n const helpers = localStorageHelpers();\r\n if (helpers) {\r\n try {\r\n helpers.set(key, serializer.serialize(resolved));\r\n } catch {\r\n // Storage write failed; state is still updated locally.\r\n }\r\n }\r\n return resolved;\r\n }),\r\n [key, serializer],\r\n );\r\n\r\n const remove = useCallback(() => {\r\n setValue(initialValue);\r\n const helpers = localStorageHelpers();\r\n if (helpers) {\r\n try {\r\n helpers.remove(key);\r\n } catch {\r\n // Ignore storage removal failures.\r\n }\r\n }\r\n }, [key, initialValue]);\r\n\r\n useEffect(() => {\r\n if (typeof window === \"undefined\") return;\r\n const handle = (event: StorageEvent) => {\r\n if (event.key === key && event.storageArea === localStorage) {\r\n const parsed =\r\n event.newValue === null\r\n ? null\r\n : serializer.deserialize(event.newValue);\r\n if (parsed !== null) setValue(parsed as T);\r\n }\r\n };\r\n window.addEventListener(\"storage\", handle);\r\n return () => window.removeEventListener(\"storage\", handle);\r\n }, [key, serializer]);\r\n\r\n return [value, set, remove];\r\n}\r\n","import { useCallback, useEffect, useState } from \"react\";\r\nimport { sessionStorageHelpers } from \"../../internal/logx\";\r\nimport { jsonSerializer } from \"../../internal/storage\";\r\nimport type { Serializer } from \"../../internal/storage\";\r\nimport type { SetValue } from \"../../types\";\r\n\r\n/**\r\n * State synchronized with sessionStorage.\r\n *\r\n * Same contract as useLocalStorage but backed by sessionStorage (tab-scoped,\r\n * cleared when the tab/session ends).\r\n *\r\n * @param key - Storage key\r\n * @param initialValue - Fallback value when nothing is stored or on SSR\r\n * @param options - Optional custom serializer\r\n */\r\nexport function useSessionStorage<T>(\r\n key: string,\r\n initialValue: T,\r\n options?: { serializer?: Serializer<T> },\r\n): [T, (value: SetValue<T>) => void, () => void] {\r\n const serializer = options?.serializer ?? (jsonSerializer as Serializer<T>);\r\n const [value, setValue] = useState<T>(initialValue);\r\n\r\n useEffect(() => {\r\n const helpers = sessionStorageHelpers();\r\n if (!helpers) return;\r\n const raw = helpers.get(key);\r\n if (raw === null) return;\r\n const parsed = serializer.deserialize(raw);\r\n if (parsed !== null) setValue(parsed as T);\r\n }, [key, serializer]);\r\n\r\n const set = useCallback(\r\n (next: T | ((prev: T) => T)) =>\r\n setValue((prev) => {\r\n const resolved = typeof next === \"function\"\r\n ? (next as (prev: T) => T)(prev)\r\n : next;\r\n const helpers = sessionStorageHelpers();\r\n if (helpers) {\r\n try {\r\n helpers.set(key, serializer.serialize(resolved));\r\n } catch {\r\n // Ignore storage write failures.\r\n }\r\n }\r\n return resolved;\r\n }),\r\n [key, serializer],\r\n );\r\n\r\n const remove = useCallback(() => {\r\n setValue(initialValue);\r\n const helpers = sessionStorageHelpers();\r\n if (helpers) {\r\n try {\r\n helpers.remove(key);\r\n } catch {\r\n // Ignore storage removal failures.\r\n }\r\n }\r\n }, [key, initialValue]);\r\n\r\n return [value, set, remove];\r\n}\r\n"]}
@@ -0,0 +1,16 @@
1
+ export { useArray, useAsync, useBoolean, useClickOutside, useClipboard, useCounter, useDebouncedCallback, useDebouncedValue, useEventListener, useInterval, useLatest, useMediaQuery, useMounted, useObject, useOnlineStatus, usePrevious, useThrottle, useTimeout, useToggle, useWindowSize } from './hooks/index.mjs';
2
+ export { useLocalStorage, useSessionStorage } from './hooks/storage/index.mjs';
3
+ export { CopyButton, DebouncedInput, ErrorBoundary, PasswordInput, Responsive } from './components/index.mjs';
4
+ export { addDays, camelCase, capitalize, chunk, clamp, clone, compact, deepClone, difference, distinct, drop, entries, escapeHtml, first, flatten, flattenDeep, get, has, hasLocalStorage, hasSessionStorage, htmlEscape, inRange, intersection, isArray, isBoolean, isBrowser, isEmail, isEmpty, isFunction, isNil, isNode, isNull, isNumber, isObject, isString, isURL, isValidDate, kebabCase, keys, last, mapKeys, mapValues, merge, omit, partition, pascalCase, percentage, pick, randomInt, required, round, safeGet, sample, set, shuffle, snakeCase, take, trim, truncate, union, unique, values } from './utilities/index.mjs';
5
+ export { LogxContextValue, LogxProvider, useLogx } from './providers/LogxProvider.mjs';
6
+ export { AsyncState, CopyButtonProps, DebouncedInputProps, DebouncedValueOptions, ErrorBoundaryProps, ErrorBoundaryState, PasswordInputProps, ResponsiveProps, SetValue, ThrottleOptions, Unsubscribe, UseLocalStorageOptions } from './types/index.mjs';
7
+ import 'react';
8
+ import '@mwakidenis/logx/array';
9
+ import '@mwakidenis/logx/object';
10
+ import '@mwakidenis/logx/string';
11
+ import '@mwakidenis/logx/number';
12
+ import '@mwakidenis/logx/validation';
13
+ import '@mwakidenis/logx/date';
14
+ import '@mwakidenis/logx/function';
15
+ import '@mwakidenis/logx/browser';
16
+ import '@mwakidenis/logx/async';
@@ -0,0 +1,16 @@
1
+ export { useArray, useAsync, useBoolean, useClickOutside, useClipboard, useCounter, useDebouncedCallback, useDebouncedValue, useEventListener, useInterval, useLatest, useMediaQuery, useMounted, useObject, useOnlineStatus, usePrevious, useThrottle, useTimeout, useToggle, useWindowSize } from './hooks/index.js';
2
+ export { useLocalStorage, useSessionStorage } from './hooks/storage/index.js';
3
+ export { CopyButton, DebouncedInput, ErrorBoundary, PasswordInput, Responsive } from './components/index.js';
4
+ export { addDays, camelCase, capitalize, chunk, clamp, clone, compact, deepClone, difference, distinct, drop, entries, escapeHtml, first, flatten, flattenDeep, get, has, hasLocalStorage, hasSessionStorage, htmlEscape, inRange, intersection, isArray, isBoolean, isBrowser, isEmail, isEmpty, isFunction, isNil, isNode, isNull, isNumber, isObject, isString, isURL, isValidDate, kebabCase, keys, last, mapKeys, mapValues, merge, omit, partition, pascalCase, percentage, pick, randomInt, required, round, safeGet, sample, set, shuffle, snakeCase, take, trim, truncate, union, unique, values } from './utilities/index.js';
5
+ export { LogxContextValue, LogxProvider, useLogx } from './providers/LogxProvider.js';
6
+ export { AsyncState, CopyButtonProps, DebouncedInputProps, DebouncedValueOptions, ErrorBoundaryProps, ErrorBoundaryState, PasswordInputProps, ResponsiveProps, SetValue, ThrottleOptions, Unsubscribe, UseLocalStorageOptions } from './types/index.js';
7
+ import 'react';
8
+ import '@mwakidenis/logx/array';
9
+ import '@mwakidenis/logx/object';
10
+ import '@mwakidenis/logx/string';
11
+ import '@mwakidenis/logx/number';
12
+ import '@mwakidenis/logx/validation';
13
+ import '@mwakidenis/logx/date';
14
+ import '@mwakidenis/logx/function';
15
+ import '@mwakidenis/logx/browser';
16
+ import '@mwakidenis/logx/async';