@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,615 @@
1
+ import { useState, useCallback, useRef, useEffect } from 'react';
2
+ import { debounce, throttle } from '@mwakidenis/logx/function';
3
+ import { localStorageHelpers, sessionStorageHelpers } from '@mwakidenis/logx/browser';
4
+ import '@mwakidenis/logx/validation';
5
+ import { pick, omit, merge, get, keys, values, entries, clone, deepClone, mapValues } from '@mwakidenis/logx/object';
6
+ import '@mwakidenis/logx/number';
7
+ import { unique, compact, shuffle, first, last, take, drop, flatten, partition, union, intersection, difference } from '@mwakidenis/logx/array';
8
+ import '@mwakidenis/logx/async';
9
+ import '@mwakidenis/logx/date';
10
+ import '@mwakidenis/logx/string';
11
+
12
+ // src/hooks/useToggle.ts
13
+ function useToggle(initialValue = false) {
14
+ const [value, setValue] = useState(!!initialValue);
15
+ const toggle = useCallback(() => setValue((current) => !current), []);
16
+ const setTrue = useCallback(() => setValue(true), []);
17
+ const setFalse = useCallback(() => setValue(false), []);
18
+ const set2 = useCallback(
19
+ (next) => setValue((current) => typeof next === "boolean" ? next : !current),
20
+ []
21
+ );
22
+ return [value, { toggle, set: set2, setTrue, setFalse }];
23
+ }
24
+ function useBoolean(initialValue = false) {
25
+ const [value, setValue] = useState(!!initialValue);
26
+ const setTrue = useCallback(() => setValue(true), []);
27
+ const setFalse = useCallback(() => setValue(false), []);
28
+ const toggle = useCallback(() => setValue((current) => !current), []);
29
+ const set2 = useCallback(
30
+ (next) => setValue((current) => typeof next === "boolean" ? next : !current),
31
+ []
32
+ );
33
+ return [value, { setTrue, setFalse, toggle, set: set2 }];
34
+ }
35
+ function useCounter(initialValue = 0) {
36
+ const [count, setCount] = useState(initialValue);
37
+ const increment = useCallback(
38
+ (step = 1) => setCount((current) => current + step),
39
+ []
40
+ );
41
+ const decrement = useCallback(
42
+ (step = 1) => setCount((current) => current - step),
43
+ []
44
+ );
45
+ const reset = useCallback(() => setCount(initialValue), [initialValue]);
46
+ const set2 = useCallback((value) => setCount(value), []);
47
+ return { count, increment, decrement, reset, set: set2 };
48
+ }
49
+ function usePrevious(value) {
50
+ const ref = useRef(void 0);
51
+ useEffect(() => {
52
+ ref.current = value;
53
+ });
54
+ return ref.current;
55
+ }
56
+ function useLatest(value) {
57
+ const ref = useRef(value);
58
+ ref.current = value;
59
+ return ref;
60
+ }
61
+ function useMounted() {
62
+ const [mounted, setMounted] = useState(false);
63
+ useEffect(() => {
64
+ setMounted(true);
65
+ return () => setMounted(false);
66
+ }, []);
67
+ return mounted;
68
+ }
69
+
70
+ // src/hooks/useArray.ts
71
+ function useArray(initialValue = []) {
72
+ const [array, setArray] = useState(initialValue);
73
+ const set2 = useCallback(
74
+ (value) => setArray(
75
+ (prev) => typeof value === "function" ? value(prev) : value
76
+ ),
77
+ []
78
+ );
79
+ const push = useCallback((...items) => setArray((prev) => [...prev, ...items]), []);
80
+ const unshift = useCallback((...items) => setArray((prev) => [...items, ...prev]), []);
81
+ const remove = useCallback(
82
+ (index) => setArray((prev) => prev.filter((_, i) => i !== index)),
83
+ []
84
+ );
85
+ const removeBy = useCallback(
86
+ (predicate) => setArray((prev) => prev.filter((v, i) => !predicate(v, i))),
87
+ []
88
+ );
89
+ const update = useCallback(
90
+ (index, value) => setArray((prev) => prev.map((v, i) => i === index ? value : v)),
91
+ []
92
+ );
93
+ const clear = useCallback(() => setArray([]), []);
94
+ const reset = useCallback(() => setArray(initialValue), [initialValue]);
95
+ const unique2 = useCallback(() => setArray((prev) => unique(prev)), []);
96
+ const compact2 = useCallback(() => setArray((prev) => compact(prev)), []);
97
+ const shuffle2 = useCallback(() => setArray((prev) => shuffle(prev)), []);
98
+ const firstValue = useCallback(() => first(array), [array]);
99
+ const lastValue = useCallback(() => last(array), [array]);
100
+ const takeValue = useCallback(
101
+ (count) => take(array, count),
102
+ [array]
103
+ );
104
+ const dropValue = useCallback(
105
+ (count) => drop(array, count),
106
+ [array]
107
+ );
108
+ return {
109
+ array,
110
+ set: set2,
111
+ push,
112
+ unshift,
113
+ remove,
114
+ removeBy,
115
+ update,
116
+ clear,
117
+ reset,
118
+ unique: unique2,
119
+ compact: compact2,
120
+ shuffle: shuffle2,
121
+ first: firstValue,
122
+ last: lastValue,
123
+ take: takeValue,
124
+ drop: dropValue,
125
+ // Expose LOGX-derived pure helpers for consumers who need them.
126
+ difference: useCallback(
127
+ (...others) => difference(array, ...others),
128
+ [array]
129
+ ),
130
+ intersection: useCallback(
131
+ (...others) => intersection(array, ...others),
132
+ [array]
133
+ ),
134
+ union: useCallback(
135
+ (...others) => union(array, ...others),
136
+ [array]
137
+ ),
138
+ partition: useCallback(
139
+ (predicate) => partition(array, predicate),
140
+ [array]
141
+ ),
142
+ flatten: useCallback(() => flatten(array), [array])
143
+ };
144
+ }
145
+ function useObject(initialValue = {}) {
146
+ const [object, setObject] = useState(initialValue);
147
+ const set2 = useCallback(
148
+ (value) => setObject(
149
+ (prev) => typeof value === "function" ? value(prev) : value
150
+ ),
151
+ []
152
+ );
153
+ const setKey = useCallback(
154
+ (key, value) => setObject((prev) => ({ ...prev, [key]: value })),
155
+ []
156
+ );
157
+ const removeKey = useCallback(
158
+ (key) => setObject((prev) => {
159
+ const next = { ...prev };
160
+ delete next[key];
161
+ return next;
162
+ }),
163
+ []
164
+ );
165
+ const clear = useCallback(() => setObject({}), []);
166
+ const reset = useCallback(() => setObject(initialValue), [initialValue]);
167
+ const pickValue = useCallback(
168
+ (pickedKeys) => pick(object, pickedKeys),
169
+ [object]
170
+ );
171
+ const omitValue = useCallback(
172
+ (omittedKeys) => omit(object, omittedKeys),
173
+ [object]
174
+ );
175
+ const mergeValue = useCallback(
176
+ (sources) => merge(object, ...sources),
177
+ [object]
178
+ );
179
+ const getValue = useCallback(
180
+ (path) => get(object, path),
181
+ [object]
182
+ );
183
+ const keysValue = useCallback(() => keys(object), [object]);
184
+ const valuesValue = useCallback(() => values(object), [object]);
185
+ const entriesValue = useCallback(() => entries(object), [object]);
186
+ const cloneValue = useCallback(() => clone(object), [object]);
187
+ const deepCloneValue = useCallback(() => deepClone(object), [object]);
188
+ const mapValuesValue = useCallback(
189
+ (iteratee) => mapValues(object, iteratee),
190
+ [object]
191
+ );
192
+ return {
193
+ object,
194
+ set: set2,
195
+ setKey,
196
+ removeKey,
197
+ clear,
198
+ reset,
199
+ pick: pickValue,
200
+ omit: omitValue,
201
+ merge: mergeValue,
202
+ get: getValue,
203
+ keys: keysValue,
204
+ values: valuesValue,
205
+ entries: entriesValue,
206
+ clone: cloneValue,
207
+ deepClone: deepCloneValue,
208
+ mapValues: mapValuesValue
209
+ };
210
+ }
211
+ function useDebouncedValue(value, options = {}) {
212
+ const { delay = 300, leading = false } = options;
213
+ const [debounced, setDebounced] = useState(value);
214
+ const latest = useLatest(value);
215
+ const timerRef = useRef(null);
216
+ const lastLeadingRef = useRef(void 0);
217
+ useEffect(() => {
218
+ if (timerRef.current !== null) {
219
+ clearTimeout(timerRef.current);
220
+ timerRef.current = null;
221
+ }
222
+ timerRef.current = setTimeout(() => {
223
+ setDebounced(latest.current);
224
+ timerRef.current = null;
225
+ }, delay);
226
+ return () => {
227
+ if (timerRef.current !== null) {
228
+ clearTimeout(timerRef.current);
229
+ timerRef.current = null;
230
+ }
231
+ };
232
+ }, [value, delay]);
233
+ useEffect(() => {
234
+ if (!leading) return;
235
+ const current = latest.current;
236
+ if (lastLeadingRef.current !== current) {
237
+ lastLeadingRef.current = current;
238
+ setDebounced(current);
239
+ }
240
+ }, [value, leading]);
241
+ return debounced;
242
+ }
243
+ function useDebouncedCallback(callback, delay) {
244
+ const latest = useLatest(callback);
245
+ const debouncedRef = useRef(null);
246
+ useEffect(() => {
247
+ const debounced = debounce(
248
+ (...args) => {
249
+ latest.current(...args);
250
+ },
251
+ delay
252
+ );
253
+ debouncedRef.current = debounced;
254
+ return () => {
255
+ debounced.cancel();
256
+ };
257
+ }, [delay]);
258
+ const invoke = useCallback((...args) => {
259
+ debouncedRef.current?.(...args);
260
+ }, []);
261
+ const cancel = useCallback(() => {
262
+ debouncedRef.current?.cancel();
263
+ }, []);
264
+ const flush = useCallback(() => {
265
+ debouncedRef.current?.flush();
266
+ }, []);
267
+ const pending = useCallback(() => debouncedRef.current?.pending() ?? false, []);
268
+ return Object.assign(invoke, { cancel, flush, pending });
269
+ }
270
+ function useThrottle(callback, wait) {
271
+ const latest = useLatest(callback);
272
+ const throttledRef = useRef(null);
273
+ useEffect(() => {
274
+ const throttled = throttle(
275
+ (...args) => {
276
+ latest.current(...args);
277
+ },
278
+ wait
279
+ );
280
+ throttledRef.current = throttled;
281
+ return () => {
282
+ throttled.cancel();
283
+ };
284
+ }, [wait]);
285
+ const invoke = useCallback((...args) => {
286
+ throttledRef.current?.(...args);
287
+ }, []);
288
+ const cancel = useCallback(() => {
289
+ throttledRef.current?.cancel();
290
+ }, []);
291
+ const flush = useCallback(() => {
292
+ throttledRef.current?.flush();
293
+ }, []);
294
+ const pending = useCallback(() => throttledRef.current?.pending() ?? false, []);
295
+ return Object.assign(invoke, { cancel, flush, pending });
296
+ }
297
+
298
+ // src/internal/storage.ts
299
+ var jsonSerializer = {
300
+ serialize: (value) => JSON.stringify(value),
301
+ deserialize: (raw) => {
302
+ if (raw === null) return null;
303
+ try {
304
+ return JSON.parse(raw);
305
+ } catch {
306
+ return null;
307
+ }
308
+ }
309
+ };
310
+
311
+ // src/hooks/storage/useLocalStorage.ts
312
+ function useLocalStorage(key, initialValue, options) {
313
+ const serializer = options?.serializer ?? jsonSerializer;
314
+ const [value, setValue] = useState(initialValue);
315
+ useEffect(() => {
316
+ const helpers = localStorageHelpers();
317
+ if (!helpers) return;
318
+ const raw = helpers.get(key);
319
+ if (raw === null) return;
320
+ const parsed = serializer.deserialize(raw);
321
+ if (parsed !== null) setValue(parsed);
322
+ }, [key, serializer]);
323
+ const set2 = useCallback(
324
+ (next) => setValue((prev) => {
325
+ const resolved = typeof next === "function" ? next(prev) : next;
326
+ const helpers = localStorageHelpers();
327
+ if (helpers) {
328
+ try {
329
+ helpers.set(key, serializer.serialize(resolved));
330
+ } catch {
331
+ }
332
+ }
333
+ return resolved;
334
+ }),
335
+ [key, serializer]
336
+ );
337
+ const remove = useCallback(() => {
338
+ setValue(initialValue);
339
+ const helpers = localStorageHelpers();
340
+ if (helpers) {
341
+ try {
342
+ helpers.remove(key);
343
+ } catch {
344
+ }
345
+ }
346
+ }, [key, initialValue]);
347
+ useEffect(() => {
348
+ if (typeof window === "undefined") return;
349
+ const handle = (event) => {
350
+ if (event.key === key && event.storageArea === localStorage) {
351
+ const parsed = event.newValue === null ? null : serializer.deserialize(event.newValue);
352
+ if (parsed !== null) setValue(parsed);
353
+ }
354
+ };
355
+ window.addEventListener("storage", handle);
356
+ return () => window.removeEventListener("storage", handle);
357
+ }, [key, serializer]);
358
+ return [value, set2, remove];
359
+ }
360
+ function useSessionStorage(key, initialValue, options) {
361
+ const serializer = options?.serializer ?? jsonSerializer;
362
+ const [value, setValue] = useState(initialValue);
363
+ useEffect(() => {
364
+ const helpers = sessionStorageHelpers();
365
+ if (!helpers) return;
366
+ const raw = helpers.get(key);
367
+ if (raw === null) return;
368
+ const parsed = serializer.deserialize(raw);
369
+ if (parsed !== null) setValue(parsed);
370
+ }, [key, serializer]);
371
+ const set2 = useCallback(
372
+ (next) => setValue((prev) => {
373
+ const resolved = typeof next === "function" ? next(prev) : next;
374
+ const helpers = sessionStorageHelpers();
375
+ if (helpers) {
376
+ try {
377
+ helpers.set(key, serializer.serialize(resolved));
378
+ } catch {
379
+ }
380
+ }
381
+ return resolved;
382
+ }),
383
+ [key, serializer]
384
+ );
385
+ const remove = useCallback(() => {
386
+ setValue(initialValue);
387
+ const helpers = sessionStorageHelpers();
388
+ if (helpers) {
389
+ try {
390
+ helpers.remove(key);
391
+ } catch {
392
+ }
393
+ }
394
+ }, [key, initialValue]);
395
+ return [value, set2, remove];
396
+ }
397
+ function useMediaQuery(query) {
398
+ const [matches, setMatches] = useState(false);
399
+ useEffect(() => {
400
+ if (typeof window === "undefined") return;
401
+ const media = window.matchMedia(query);
402
+ setMatches(media.matches);
403
+ const handler = (event) => setMatches(event.matches);
404
+ media.addEventListener("change", handler);
405
+ return () => {
406
+ media.removeEventListener("change", handler);
407
+ };
408
+ }, [query]);
409
+ return matches;
410
+ }
411
+ function useWindowSize() {
412
+ const [size, setSize] = useState(
413
+ () => typeof window !== "undefined" ? { width: window.innerWidth, height: window.innerHeight } : { width: 0, height: 0 }
414
+ );
415
+ useEffect(() => {
416
+ if (typeof window === "undefined") return;
417
+ const handler = () => setSize({ width: window.innerWidth, height: window.innerHeight });
418
+ window.addEventListener("resize", handler);
419
+ return () => window.removeEventListener("resize", handler);
420
+ }, []);
421
+ return size;
422
+ }
423
+ function useClickOutside(ref, handler) {
424
+ const latest = useRef(handler);
425
+ latest.current = handler;
426
+ useEffect(() => {
427
+ const handle = (event) => {
428
+ if (ref.current && !ref.current.contains(event.target)) {
429
+ latest.current(event);
430
+ }
431
+ };
432
+ if (typeof document !== "undefined") {
433
+ document.addEventListener("mousedown", handle);
434
+ document.addEventListener("touchstart", handle);
435
+ return () => {
436
+ document.removeEventListener("mousedown", handle);
437
+ document.removeEventListener("touchstart", handle);
438
+ };
439
+ }
440
+ return void 0;
441
+ }, [ref]);
442
+ }
443
+ function useEventListener(target, type, listener, options) {
444
+ const latest = useRef(listener);
445
+ latest.current = listener;
446
+ useEffect(() => {
447
+ if (!target) return void 0;
448
+ const handle = (event) => latest.current(event);
449
+ target.addEventListener(type, handle, options);
450
+ return () => {
451
+ target.removeEventListener(type, handle, options);
452
+ };
453
+ }, [target, type, options]);
454
+ }
455
+ function useClipboard() {
456
+ const isSupported = typeof navigator !== "undefined" && !!navigator.clipboard && !!navigator.clipboard.writeText;
457
+ const copy = useCallback(async (text) => {
458
+ try {
459
+ if (isSupported && typeof navigator !== "undefined") {
460
+ await navigator.clipboard.writeText(text);
461
+ return true;
462
+ }
463
+ if (typeof document !== "undefined") {
464
+ const textarea = document.createElement("textarea");
465
+ textarea.value = text;
466
+ textarea.setAttribute("readonly", "");
467
+ textarea.style.position = "absolute";
468
+ textarea.style.position = "fixed";
469
+ textarea.style.opacity = "0";
470
+ document.body.appendChild(textarea);
471
+ textarea.select();
472
+ try {
473
+ document.execCommand("copy");
474
+ } finally {
475
+ document.body.removeChild(textarea);
476
+ }
477
+ return true;
478
+ }
479
+ return false;
480
+ } catch {
481
+ return false;
482
+ }
483
+ }, [isSupported]);
484
+ return { copy, isSupported };
485
+ }
486
+ function useOnlineStatus() {
487
+ const [online, setOnline] = useState(
488
+ () => typeof navigator !== "undefined" ? navigator.onLine : true
489
+ );
490
+ useEffect(() => {
491
+ if (typeof window === "undefined") return;
492
+ setOnline(navigator.onLine);
493
+ const onOnline = () => setOnline(true);
494
+ const onOffline = () => setOnline(false);
495
+ window.addEventListener("online", onOnline);
496
+ window.addEventListener("offline", onOffline);
497
+ return () => {
498
+ window.removeEventListener("online", onOnline);
499
+ window.removeEventListener("offline", onOffline);
500
+ };
501
+ }, []);
502
+ return online;
503
+ }
504
+ function useTimeout(callback, delay) {
505
+ const latest = useLatest(callback);
506
+ const timerRef = useRef(null);
507
+ const [active, setActive] = useState(false);
508
+ const stop = useCallback(() => {
509
+ if (timerRef.current !== null) {
510
+ clearTimeout(timerRef.current);
511
+ timerRef.current = null;
512
+ }
513
+ setActive(false);
514
+ }, []);
515
+ const start = useCallback(() => {
516
+ stop();
517
+ if (delay !== null && delay >= 0) {
518
+ timerRef.current = setTimeout(() => {
519
+ timerRef.current = null;
520
+ setActive(false);
521
+ latest.current();
522
+ }, delay);
523
+ setActive(true);
524
+ }
525
+ }, [delay]);
526
+ const reset = useCallback(() => {
527
+ start();
528
+ }, [start]);
529
+ useEffect(() => {
530
+ start();
531
+ return () => stop();
532
+ }, [delay, start, stop]);
533
+ return { start, stop, reset, active };
534
+ }
535
+ function useInterval(callback, delay) {
536
+ const latest = useLatest(callback);
537
+ const timerRef = useRef(null);
538
+ const [active, setActive] = useState(false);
539
+ const stop = useCallback(() => {
540
+ if (timerRef.current !== null) {
541
+ clearInterval(timerRef.current);
542
+ timerRef.current = null;
543
+ }
544
+ setActive(false);
545
+ }, []);
546
+ const start = useCallback(() => {
547
+ stop();
548
+ if (delay !== null && delay >= 0) {
549
+ timerRef.current = setInterval(() => latest.current(), delay);
550
+ setActive(true);
551
+ }
552
+ }, [delay]);
553
+ useEffect(() => {
554
+ start();
555
+ return () => stop();
556
+ }, [delay, start, stop]);
557
+ return { start, stop, active };
558
+ }
559
+ function useAsync(asyncFn, immediate = true) {
560
+ const [state, setState] = useState({
561
+ data: null,
562
+ error: null,
563
+ isLoading: false,
564
+ isSuccess: false,
565
+ isError: false
566
+ });
567
+ const latest = useLatest(asyncFn);
568
+ const abortRef = useRef(null);
569
+ const seqRef = useRef(0);
570
+ const cancel = useCallback(() => {
571
+ if (abortRef.current) {
572
+ abortRef.current.abort();
573
+ abortRef.current = null;
574
+ setState({ data: null, error: null, isLoading: false, isSuccess: false, isError: false });
575
+ }
576
+ }, []);
577
+ const setData = useCallback((data) => {
578
+ setState({ data, error: null, isLoading: false, isSuccess: true, isError: false });
579
+ }, []);
580
+ const setError = useCallback((error) => {
581
+ setState({ data: null, error, isLoading: false, isSuccess: false, isError: true });
582
+ }, []);
583
+ const reset = useCallback(() => {
584
+ cancel();
585
+ setState({ data: null, error: null, isLoading: false, isSuccess: false, isError: false });
586
+ }, [cancel]);
587
+ const execute = useCallback(async () => {
588
+ cancel();
589
+ const controller = new AbortController();
590
+ abortRef.current = controller;
591
+ const seq = ++seqRef.current;
592
+ setState({ data: null, error: null, isLoading: true, isSuccess: false, isError: false });
593
+ try {
594
+ const data = await latest.current();
595
+ if (controller.signal.aborted || seq !== seqRef.current) return;
596
+ setState({ data, error: null, isLoading: false, isSuccess: true, isError: false });
597
+ } catch (err) {
598
+ if (controller.signal.aborted || seq !== seqRef.current) return;
599
+ const error = err instanceof Error ? err : new Error(String(err));
600
+ setState({ data: null, error, isLoading: false, isSuccess: false, isError: true });
601
+ } finally {
602
+ if (abortRef.current === controller) abortRef.current = null;
603
+ }
604
+ }, []);
605
+ useEffect(() => {
606
+ if (!immediate) return;
607
+ void execute();
608
+ return () => cancel();
609
+ }, [immediate, execute, cancel]);
610
+ return { ...state, execute, setData, setError, reset, cancel };
611
+ }
612
+
613
+ export { useArray, useAsync, useBoolean, useClickOutside, useClipboard, useCounter, useDebouncedCallback, useDebouncedValue, useEventListener, useInterval, useLatest, useLocalStorage, useMediaQuery, useMounted, useObject, useOnlineStatus, usePrevious, useSessionStorage, useThrottle, useTimeout, useToggle, useWindowSize };
614
+ //# sourceMappingURL=index.mjs.map
615
+ //# sourceMappingURL=index.mjs.map