react-hook-toolkit 1.1.8 → 1.2.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.
@@ -0,0 +1,817 @@
1
+ var __assign = (this && this.__assign) || function () {
2
+ __assign = Object.assign || function(t) {
3
+ for (var s, i = 1, n = arguments.length; i < n; i++) {
4
+ s = arguments[i];
5
+ for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p))
6
+ t[p] = s[p];
7
+ }
8
+ return t;
9
+ };
10
+ return __assign.apply(this, arguments);
11
+ };
12
+ var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
13
+ function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
14
+ return new (P || (P = Promise))(function (resolve, reject) {
15
+ function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
16
+ function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
17
+ function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
18
+ step((generator = generator.apply(thisArg, _arguments || [])).next());
19
+ });
20
+ };
21
+ var __generator = (this && this.__generator) || function (thisArg, body) {
22
+ var _ = { label: 0, sent: function() { if (t[0] & 1) throw t[1]; return t[1]; }, trys: [], ops: [] }, f, y, t, g = Object.create((typeof Iterator === "function" ? Iterator : Object).prototype);
23
+ return g.next = verb(0), g["throw"] = verb(1), g["return"] = verb(2), typeof Symbol === "function" && (g[Symbol.iterator] = function() { return this; }), g;
24
+ function verb(n) { return function (v) { return step([n, v]); }; }
25
+ function step(op) {
26
+ if (f) throw new TypeError("Generator is already executing.");
27
+ while (g && (g = 0, op[0] && (_ = 0)), _) try {
28
+ if (f = 1, y && (t = op[0] & 2 ? y["return"] : op[0] ? y["throw"] || ((t = y["return"]) && t.call(y), 0) : y.next) && !(t = t.call(y, op[1])).done) return t;
29
+ if (y = 0, t) op = [op[0] & 2, t.value];
30
+ switch (op[0]) {
31
+ case 0: case 1: t = op; break;
32
+ case 4: _.label++; return { value: op[1], done: false };
33
+ case 5: _.label++; y = op[1]; op = [0]; continue;
34
+ case 7: op = _.ops.pop(); _.trys.pop(); continue;
35
+ default:
36
+ if (!(t = _.trys, t = t.length > 0 && t[t.length - 1]) && (op[0] === 6 || op[0] === 2)) { _ = 0; continue; }
37
+ if (op[0] === 3 && (!t || (op[1] > t[0] && op[1] < t[3]))) { _.label = op[1]; break; }
38
+ if (op[0] === 6 && _.label < t[1]) { _.label = t[1]; t = op; break; }
39
+ if (t && _.label < t[2]) { _.label = t[2]; _.ops.push(op); break; }
40
+ if (t[2]) _.ops.pop();
41
+ _.trys.pop(); continue;
42
+ }
43
+ op = body.call(thisArg, _);
44
+ } catch (e) { op = [6, e]; y = 0; } finally { f = t = 0; }
45
+ if (op[0] & 5) throw op[1]; return { value: op[0] ? op[1] : void 0, done: true };
46
+ }
47
+ };
48
+ var __spreadArray = (this && this.__spreadArray) || function (to, from, pack) {
49
+ if (pack || arguments.length === 2) for (var i = 0, l = from.length, ar; i < l; i++) {
50
+ if (ar || !(i in from)) {
51
+ if (!ar) ar = Array.prototype.slice.call(from, 0, i);
52
+ ar[i] = from[i];
53
+ }
54
+ }
55
+ return to.concat(ar || Array.prototype.slice.call(from));
56
+ };
57
+ import { useState, useEffect, useCallback, useRef, useContext } from 'react';
58
+ import axios, { AxiosError } from 'axios';
59
+ import DrawerContext from '../chunk1213/chunk158261';
60
+ export var isReady = function () {
61
+ return typeof window !== "undefined" && typeof window.document !== "undefined"
62
+ ? true
63
+ : false;
64
+ };
65
+ export var useAxios = function (config) {
66
+ if (config === void 0) { config = {}; }
67
+ var _a = useState(null), data = _a[0], setData = _a[1];
68
+ var _b = useState(false), loading = _b[0], setLoading = _b[1];
69
+ var _c = useState(null), error = _c[0], setError = _c[1];
70
+ var _d = useState(false), cancelled = _d[0], setCancelled = _d[1];
71
+ var axiosInstance = axios.create({
72
+ baseURL: config.baseURL || '',
73
+ headers: config.headers || {},
74
+ });
75
+ var cancelRequest = function () { return setCancelled(true); };
76
+ var makeRequest = useCallback(function (url_1) {
77
+ var args_1 = [];
78
+ for (var _i = 1; _i < arguments.length; _i++) {
79
+ args_1[_i - 1] = arguments[_i];
80
+ }
81
+ return __awaiter(void 0, __spreadArray([url_1], args_1, true), void 0, function (url, method, requestData) {
82
+ var response, err_1;
83
+ if (method === void 0) { method = 'GET'; }
84
+ if (requestData === void 0) { requestData = {}; }
85
+ return __generator(this, function (_a) {
86
+ switch (_a.label) {
87
+ case 0:
88
+ if (cancelled)
89
+ return [2 /*return*/];
90
+ setLoading(true);
91
+ setError(null);
92
+ _a.label = 1;
93
+ case 1:
94
+ _a.trys.push([1, 3, 4, 5]);
95
+ return [4 /*yield*/, axiosInstance({
96
+ url: url,
97
+ method: method,
98
+ data: requestData,
99
+ params: method === 'GET' ? requestData : undefined,
100
+ })];
101
+ case 2:
102
+ response = _a.sent();
103
+ if (!cancelled) {
104
+ setData(response.data);
105
+ }
106
+ return [3 /*break*/, 5];
107
+ case 3:
108
+ err_1 = _a.sent();
109
+ if (!cancelled) {
110
+ setError(err_1 instanceof AxiosError ? err_1.message : 'An error occurred');
111
+ }
112
+ return [3 /*break*/, 5];
113
+ case 4:
114
+ if (!cancelled) {
115
+ setLoading(false);
116
+ }
117
+ return [7 /*endfinally*/];
118
+ case 5: return [2 /*return*/];
119
+ }
120
+ });
121
+ });
122
+ }, [cancelled, axiosInstance]);
123
+ useEffect(function () {
124
+ return function () { return cancelRequest(); };
125
+ }, []);
126
+ return {
127
+ data: data,
128
+ loading: loading,
129
+ error: error,
130
+ makeRequest: makeRequest,
131
+ cancelRequest: cancelRequest,
132
+ };
133
+ };
134
+ export var useDrawer = function () {
135
+ var context = useContext(DrawerContext);
136
+ if (context === undefined) {
137
+ throw new Error('useDrawer must be used within a DrawerProvider');
138
+ }
139
+ return context;
140
+ };
141
+ export var useGenericReducer = function (initialState, actions) { return function (state, action) {
142
+ if (state === void 0) { state = initialState; }
143
+ if (actions[action.type]) {
144
+ return actions[action.type](state, action);
145
+ }
146
+ return state;
147
+ }; };
148
+ export function useRequest(url) {
149
+ var _this = this;
150
+ var _a = useState({
151
+ data: null,
152
+ loading: true,
153
+ error: null,
154
+ }), state = _a[0], setState = _a[1];
155
+ useEffect(function () {
156
+ var fetchData = function () { return __awaiter(_this, void 0, void 0, function () {
157
+ var response, data, error_1;
158
+ return __generator(this, function (_a) {
159
+ switch (_a.label) {
160
+ case 0:
161
+ _a.trys.push([0, 3, , 4]);
162
+ return [4 /*yield*/, fetch(url)];
163
+ case 1:
164
+ response = _a.sent();
165
+ if (!response.ok)
166
+ throw new Error("Error: ".concat(response.statusText));
167
+ return [4 /*yield*/, response.json()];
168
+ case 2:
169
+ data = _a.sent();
170
+ setState({ data: data, loading: false, error: null });
171
+ return [3 /*break*/, 4];
172
+ case 3:
173
+ error_1 = _a.sent();
174
+ setState({ data: null, loading: false, error: error_1.message });
175
+ return [3 /*break*/, 4];
176
+ case 4: return [2 /*return*/];
177
+ }
178
+ });
179
+ }); };
180
+ fetchData();
181
+ }, [url]);
182
+ return state;
183
+ }
184
+ export function useLocalStorage(key, initialValue) {
185
+ var _a = useState(function () {
186
+ try {
187
+ var item = localStorage.getItem(key);
188
+ return item ? JSON.parse(item) : initialValue;
189
+ }
190
+ catch (_a) {
191
+ return initialValue;
192
+ }
193
+ }), storedValue = _a[0], setStoredValue = _a[1];
194
+ var setValue = function (value) {
195
+ try {
196
+ setStoredValue(value);
197
+ localStorage.setItem(key, JSON.stringify(value));
198
+ }
199
+ catch (error) {
200
+ console.error('Error saving to localStorage', error);
201
+ }
202
+ };
203
+ return [storedValue, setValue];
204
+ }
205
+ export function useToggle(initialValue) {
206
+ if (initialValue === void 0) { initialValue = false; }
207
+ var _a = useState(initialValue), value = _a[0], setValue = _a[1];
208
+ var toggle = function () { return setValue(function (prev) { return !prev; }); };
209
+ return [value, toggle];
210
+ }
211
+ export function useDebounce(value, delay) {
212
+ var _a = useState(value), debouncedValue = _a[0], setDebouncedValue = _a[1];
213
+ useEffect(function () {
214
+ var handler = setTimeout(function () { return setDebouncedValue(value); }, delay);
215
+ return function () { return clearTimeout(handler); };
216
+ }, [value, delay]);
217
+ return debouncedValue;
218
+ }
219
+ export function useThrottle(value, limit) {
220
+ var _a = useState(value), throttledValue = _a[0], setThrottledValue = _a[1];
221
+ useEffect(function () {
222
+ var handler = setTimeout(function () { return setThrottledValue(value); }, limit);
223
+ return function () { return clearTimeout(handler); };
224
+ }, [value, limit]);
225
+ return throttledValue;
226
+ }
227
+ export function usePrevious(value) {
228
+ var ref = useRef();
229
+ useEffect(function () {
230
+ ref.current = value;
231
+ });
232
+ return ref.current;
233
+ }
234
+ export function useMediaQuery(query) {
235
+ var _a = useState(false), matches = _a[0], setMatches = _a[1];
236
+ useEffect(function () {
237
+ var mediaQueryList = window.matchMedia(query);
238
+ var updateMatch = function () { return setMatches(mediaQueryList.matches); };
239
+ updateMatch();
240
+ mediaQueryList.addEventListener('change', updateMatch);
241
+ return function () { return mediaQueryList.removeEventListener('change', updateMatch); };
242
+ }, [query]);
243
+ return matches;
244
+ }
245
+ export function useClipboard() {
246
+ var _this = this;
247
+ var _a = useState(false), copied = _a[0], setCopied = _a[1];
248
+ var copyToClipboard = function (text) { return __awaiter(_this, void 0, void 0, function () {
249
+ var error_2;
250
+ return __generator(this, function (_a) {
251
+ switch (_a.label) {
252
+ case 0:
253
+ _a.trys.push([0, 2, , 3]);
254
+ return [4 /*yield*/, navigator.clipboard.writeText(text)];
255
+ case 1:
256
+ _a.sent();
257
+ setCopied(true);
258
+ setTimeout(function () { return setCopied(false); }, 2000); // Reset after 2 seconds
259
+ return [3 /*break*/, 3];
260
+ case 2:
261
+ error_2 = _a.sent();
262
+ console.error('Failed to copy text to clipboard', error_2);
263
+ return [3 /*break*/, 3];
264
+ case 3: return [2 /*return*/];
265
+ }
266
+ });
267
+ }); };
268
+ return [copied, copyToClipboard];
269
+ }
270
+ export function useInterval(callback, delay) {
271
+ var savedCallback = useRef();
272
+ useEffect(function () {
273
+ savedCallback.current = callback;
274
+ }, [callback]);
275
+ useEffect(function () {
276
+ if (delay === null)
277
+ return;
278
+ var tick = function () { var _a; return (_a = savedCallback.current) === null || _a === void 0 ? void 0 : _a.call(savedCallback); };
279
+ var id = setInterval(tick, delay);
280
+ return function () { return clearInterval(id); };
281
+ }, [delay]);
282
+ }
283
+ export function useWindowSize() {
284
+ var _a = useState({
285
+ width: typeof window !== 'undefined' ? window.innerWidth : 0,
286
+ height: typeof window !== 'undefined' ? window.innerHeight : 0,
287
+ }), windowSize = _a[0], setWindowSize = _a[1];
288
+ useEffect(function () {
289
+ if (typeof window === 'undefined')
290
+ return;
291
+ var handleResize = function () {
292
+ setWindowSize({
293
+ width: window.innerWidth,
294
+ height: window.innerHeight,
295
+ });
296
+ };
297
+ window.addEventListener('resize', handleResize);
298
+ return function () { return window.removeEventListener('resize', handleResize); };
299
+ }, []);
300
+ return windowSize;
301
+ }
302
+ export function useKeyPress(targetKey) {
303
+ var _a = useState(false), isKeyPressed = _a[0], setIsKeyPressed = _a[1];
304
+ var handleKeyDown = function (_a) {
305
+ var key = _a.key;
306
+ if (key === targetKey)
307
+ setIsKeyPressed(true);
308
+ };
309
+ var handleKeyUp = function (_a) {
310
+ var key = _a.key;
311
+ if (key === targetKey)
312
+ setIsKeyPressed(false);
313
+ };
314
+ useEffect(function () {
315
+ window.addEventListener('keydown', handleKeyDown);
316
+ window.addEventListener('keyup', handleKeyUp);
317
+ return function () {
318
+ window.removeEventListener('keydown', handleKeyDown);
319
+ window.removeEventListener('keyup', handleKeyUp);
320
+ };
321
+ }, [targetKey]);
322
+ return isKeyPressed;
323
+ }
324
+ export function useOnlineStatus() {
325
+ var _a = useState(navigator.onLine), isOnline = _a[0], setIsOnline = _a[1];
326
+ useEffect(function () {
327
+ var handleOnline = function () { return setIsOnline(true); };
328
+ var handleOffline = function () { return setIsOnline(false); };
329
+ window.addEventListener('online', handleOnline);
330
+ window.addEventListener('offline', handleOffline);
331
+ return function () {
332
+ window.removeEventListener('online', handleOnline);
333
+ window.removeEventListener('offline', handleOffline);
334
+ };
335
+ }, []);
336
+ return isOnline;
337
+ }
338
+ export function useScrollPosition() {
339
+ var _a = useState({
340
+ x: window.scrollX,
341
+ y: window.scrollY,
342
+ }), scrollPosition = _a[0], setScrollPosition = _a[1];
343
+ useEffect(function () {
344
+ var handleScroll = function () {
345
+ setScrollPosition({
346
+ x: window.scrollX,
347
+ y: window.scrollY,
348
+ });
349
+ };
350
+ window.addEventListener('scroll', handleScroll);
351
+ return function () { return window.removeEventListener('scroll', handleScroll); };
352
+ }, []);
353
+ return scrollPosition;
354
+ }
355
+ export function useTimeout(callback, delay) {
356
+ var savedCallback = useRef();
357
+ useEffect(function () {
358
+ savedCallback.current = callback;
359
+ }, [callback]);
360
+ useEffect(function () {
361
+ if (delay === null)
362
+ return;
363
+ var timer = setTimeout(function () { var _a; return (_a = savedCallback.current) === null || _a === void 0 ? void 0 : _a.call(savedCallback); }, delay);
364
+ return function () { return clearTimeout(timer); };
365
+ }, [delay]);
366
+ }
367
+ export function useDarkMode() {
368
+ var _a = useState(function () {
369
+ return window.matchMedia('(prefers-color-scheme: dark)').matches;
370
+ }), isDarkMode = _a[0], setIsDarkMode = _a[1];
371
+ var toggleDarkMode = function () {
372
+ setIsDarkMode(function (prevMode) { return !prevMode; });
373
+ document.body.classList.toggle('dark-mode', !isDarkMode);
374
+ };
375
+ useEffect(function () {
376
+ var mediaQuery = window.matchMedia('(prefers-color-scheme: dark)');
377
+ var handleChange = function (e) { return setIsDarkMode(e.matches); };
378
+ mediaQuery.addEventListener('change', handleChange);
379
+ return function () { return mediaQuery.removeEventListener('change', handleChange); };
380
+ }, []);
381
+ return [isDarkMode, toggleDarkMode];
382
+ }
383
+ export function useForm(initialValues) {
384
+ var _a = useState({
385
+ values: initialValues,
386
+ errors: {},
387
+ }), formState = _a[0], setFormState = _a[1];
388
+ var handleChange = function (name, value) {
389
+ setFormState(function (prev) {
390
+ var _a;
391
+ return (__assign(__assign({}, prev), { values: __assign(__assign({}, prev.values), (_a = {}, _a[name] = value, _a)) }));
392
+ });
393
+ };
394
+ var validate = function (validators) {
395
+ var errors = {};
396
+ Object.entries(validators).forEach(function (_a) {
397
+ var key = _a[0], validator = _a[1];
398
+ var error = validator === null || validator === void 0 ? void 0 : validator(formState.values[key]);
399
+ if (error)
400
+ errors[key] = error;
401
+ });
402
+ setFormState(function (prev) { return (__assign(__assign({}, prev), { errors: errors })); });
403
+ return Object.keys(errors).length === 0;
404
+ };
405
+ return {
406
+ values: formState.values,
407
+ errors: formState.errors,
408
+ handleChange: handleChange,
409
+ validate: validate,
410
+ };
411
+ }
412
+ export function useArray(initialArray) {
413
+ var _a = useState(initialArray), array = _a[0], setArray = _a[1];
414
+ return {
415
+ array: array,
416
+ set: setArray,
417
+ push: function (item) { return setArray(function (prev) { return __spreadArray(__spreadArray([], prev, true), [item], false); }); },
418
+ removeByIndex: function (index) { return setArray(function (prev) { return prev.filter(function (_, i) { return i !== index; }); }); },
419
+ clear: function () { return setArray([]); },
420
+ };
421
+ }
422
+ export var useStepper = function (totalSteps) {
423
+ var _a = useState(0), activeStep = _a[0], setActiveStep = _a[1];
424
+ var _b = useState(false), isProccesing = _b[0], setIsProccesing = _b[1];
425
+ var handleNext = function () {
426
+ setActiveStep(function (prev) { return prev + 1; });
427
+ };
428
+ var handleBack = function () {
429
+ setActiveStep(function (prev) { return prev - 1; });
430
+ };
431
+ var handleReset = function () {
432
+ setActiveStep(0);
433
+ };
434
+ var goto = function (step) {
435
+ if (step >= 0 && step < totalSteps) {
436
+ setActiveStep(step);
437
+ }
438
+ else {
439
+ console.warn("Step ".concat(step, " is out of bounds (0-").concat(totalSteps - 1, ")"));
440
+ }
441
+ };
442
+ return {
443
+ activeStep: activeStep,
444
+ handleNext: handleNext,
445
+ handleBack: handleBack,
446
+ handleReset: handleReset,
447
+ totalSteps: totalSteps,
448
+ isFirstStep: activeStep === 0,
449
+ isLastStep: activeStep === totalSteps - 1,
450
+ isProccesing: isProccesing,
451
+ setIsProccesing: setIsProccesing,
452
+ goto: goto
453
+ };
454
+ };
455
+ export var useSteps = function (totalSteps) {
456
+ var _a = useState(0), activeStep = _a[0], setActiveStep = _a[1];
457
+ var _b = useState(false), isProcessing = _b[0], setIsProcessing = _b[1];
458
+ var handleNext = function () {
459
+ if (activeStep < totalSteps - 1) {
460
+ setActiveStep(function (prev) { return prev + 1; });
461
+ }
462
+ };
463
+ var handleBack = function () {
464
+ if (activeStep > 0) {
465
+ setActiveStep(function (prev) { return prev - 1; });
466
+ }
467
+ };
468
+ var handleReset = function () {
469
+ setActiveStep(0);
470
+ };
471
+ var goto = function (step) {
472
+ if (step >= 0 && step < totalSteps) {
473
+ setActiveStep(step);
474
+ }
475
+ else {
476
+ console.warn("Step ".concat(step, " is out of bounds (0-").concat(totalSteps - 1, ")"));
477
+ }
478
+ };
479
+ return {
480
+ activeStep: activeStep,
481
+ handleNext: handleNext,
482
+ handleBack: handleBack,
483
+ handleReset: handleReset,
484
+ goto: goto,
485
+ totalSteps: totalSteps,
486
+ isFirstStep: activeStep === 0,
487
+ isLastStep: activeStep === totalSteps - 1,
488
+ isProcessing: isProcessing,
489
+ setIsProcessing: setIsProcessing,
490
+ };
491
+ };
492
+ export function useTimeoutFn(callback, delay) {
493
+ var timeoutRef = useRef();
494
+ var reset = function () {
495
+ if (timeoutRef.current)
496
+ clearTimeout(timeoutRef.current);
497
+ if (delay !== null)
498
+ timeoutRef.current = setTimeout(callback, delay);
499
+ };
500
+ var clear = function () {
501
+ if (timeoutRef.current)
502
+ clearTimeout(timeoutRef.current);
503
+ };
504
+ useEffect(function () {
505
+ reset();
506
+ return clear;
507
+ }, [callback, delay]);
508
+ return { reset: reset, clear: clear };
509
+ }
510
+ export function useDebouncedCallback(callback, delay) {
511
+ var _a = useTimeoutFn(callback, delay), reset = _a.reset, clear = _a.clear;
512
+ var debouncedCallback = useCallback(function () {
513
+ clear();
514
+ reset();
515
+ }, [clear, reset]);
516
+ return debouncedCallback;
517
+ }
518
+ export function useScrollLock(lock) {
519
+ useEffect(function () {
520
+ if (lock) {
521
+ var originalOverflow_1 = document.body.style.overflow;
522
+ document.body.style.overflow = 'hidden';
523
+ return function () {
524
+ document.body.style.overflow = originalOverflow_1;
525
+ };
526
+ }
527
+ }, [lock]);
528
+ }
529
+ export function useResizeObserver(ref) {
530
+ var _a = useState(null), size = _a[0], setSize = _a[1];
531
+ useEffect(function () {
532
+ var handleResize = function (entries) {
533
+ var entry = entries[0];
534
+ if (entry) {
535
+ setSize({
536
+ width: entry.contentRect.width,
537
+ height: entry.contentRect.height,
538
+ });
539
+ }
540
+ };
541
+ var observer = new ResizeObserver(handleResize);
542
+ if (ref.current)
543
+ observer.observe(ref.current);
544
+ return function () {
545
+ if (ref.current)
546
+ observer.unobserve(ref.current);
547
+ };
548
+ }, [ref]);
549
+ return size;
550
+ }
551
+ export function useMousePosition() {
552
+ var _a = useState({ x: 0, y: 0 }), position = _a[0], setPosition = _a[1];
553
+ useEffect(function () {
554
+ var handleMouseMove = function (event) {
555
+ setPosition({ x: event.clientX, y: event.clientY });
556
+ };
557
+ document.addEventListener('mousemove', handleMouseMove);
558
+ return function () { return document.removeEventListener('mousemove', handleMouseMove); };
559
+ }, []);
560
+ return position;
561
+ }
562
+ export function useScrollDirection() {
563
+ var _a = useState('up'), scrollDirection = _a[0], setScrollDirection = _a[1];
564
+ var _b = useState(0), lastScrollY = _b[0], setLastScrollY = _b[1];
565
+ useEffect(function () {
566
+ var handleScroll = function () {
567
+ var currentScrollY = window.scrollY;
568
+ setScrollDirection(currentScrollY > lastScrollY ? 'down' : 'up');
569
+ setLastScrollY(currentScrollY);
570
+ };
571
+ window.addEventListener('scroll', handleScroll);
572
+ return function () { return window.removeEventListener('scroll', handleScroll); };
573
+ }, [lastScrollY]);
574
+ return scrollDirection;
575
+ }
576
+ export function useImageLoader(src) {
577
+ var _a = useState(false), loaded = _a[0], setLoaded = _a[1];
578
+ var _b = useState(false), error = _b[0], setError = _b[1];
579
+ useEffect(function () {
580
+ var img = new Image();
581
+ img.src = src;
582
+ var handleLoad = function () { return setLoaded(true); };
583
+ var handleError = function () { return setError(true); };
584
+ img.addEventListener('load', handleLoad);
585
+ img.addEventListener('error', handleError);
586
+ return function () {
587
+ img.removeEventListener('load', handleLoad);
588
+ img.removeEventListener('error', handleError);
589
+ };
590
+ }, [src]);
591
+ return { loaded: loaded, error: error };
592
+ }
593
+ export function usePersistedState(key, initialValue) {
594
+ var _a = useState(function () {
595
+ var saved = localStorage.getItem(key);
596
+ return saved ? JSON.parse(saved) : initialValue;
597
+ }), state = _a[0], setState = _a[1];
598
+ useEffect(function () {
599
+ localStorage.setItem(key, JSON.stringify(state));
600
+ }, [key, state]);
601
+ return [state, setState];
602
+ }
603
+ export function useReducedMotion() {
604
+ var _a = useState(false), reducedMotion = _a[0], setReducedMotion = _a[1];
605
+ useEffect(function () {
606
+ var mediaQuery = window.matchMedia('(prefers-reduced-motion: reduce)');
607
+ setReducedMotion(mediaQuery.matches);
608
+ var handleChange = function (e) { return setReducedMotion(e.matches); };
609
+ mediaQuery.addEventListener('change', handleChange);
610
+ return function () {
611
+ mediaQuery.removeEventListener('change', handleChange);
612
+ };
613
+ }, []);
614
+ return reducedMotion;
615
+ }
616
+ export function useCookie(key) {
617
+ var _a = useState(function () { var _a; return ((_a = document.cookie.split('; ').find(function (row) { return row.startsWith(key); })) === null || _a === void 0 ? void 0 : _a.split('=')[1]) || null; }), cookie = _a[0], setCookieState = _a[1];
618
+ var setCookie = function (value, options) {
619
+ if (options === void 0) { options = {}; }
620
+ var optionsString = Object.entries(options)
621
+ .map(function (_a) {
622
+ var k = _a[0], v = _a[1];
623
+ return "".concat(k, "=").concat(v);
624
+ })
625
+ .join('; ');
626
+ document.cookie = "".concat(key, "=").concat(value, "; ").concat(optionsString);
627
+ setCookieState(value);
628
+ };
629
+ var deleteCookie = function () {
630
+ document.cookie = "".concat(key, "=; Max-Age=0");
631
+ setCookieState(null);
632
+ };
633
+ return [cookie, setCookie, deleteCookie];
634
+ }
635
+ export function useRequestRetry(url, options, retries) {
636
+ var _this = this;
637
+ if (retries === void 0) { retries = 3; }
638
+ var _a = useState({
639
+ data: null,
640
+ error: null,
641
+ loading: true,
642
+ }), state = _a[0], setState = _a[1];
643
+ useEffect(function () {
644
+ var fetchData = function () { return __awaiter(_this, void 0, void 0, function () {
645
+ var attempts, response, data, error_3;
646
+ return __generator(this, function (_a) {
647
+ switch (_a.label) {
648
+ case 0:
649
+ attempts = 0;
650
+ _a.label = 1;
651
+ case 1:
652
+ if (!(attempts < retries)) return [3 /*break*/, 7];
653
+ _a.label = 2;
654
+ case 2:
655
+ _a.trys.push([2, 5, , 6]);
656
+ return [4 /*yield*/, fetch(url, options)];
657
+ case 3:
658
+ response = _a.sent();
659
+ if (!response.ok)
660
+ throw new Error("HTTP error! status: ".concat(response.status));
661
+ return [4 /*yield*/, response.json()];
662
+ case 4:
663
+ data = _a.sent();
664
+ setState({ data: data, error: null, loading: false });
665
+ return [2 /*return*/];
666
+ case 5:
667
+ error_3 = _a.sent();
668
+ attempts++;
669
+ if (attempts >= retries) {
670
+ setState({ data: null, error: error_3.message, loading: false });
671
+ }
672
+ return [3 /*break*/, 6];
673
+ case 6: return [3 /*break*/, 1];
674
+ case 7: return [2 /*return*/];
675
+ }
676
+ });
677
+ }); };
678
+ fetchData();
679
+ }, [url, options, retries]);
680
+ return state;
681
+ }
682
+ export function useDelay(value, delay) {
683
+ var _a = useState(value), delayedValue = _a[0], setDelayedValue = _a[1];
684
+ useEffect(function () {
685
+ var timeout = setTimeout(function () { return setDelayedValue(value); }, delay);
686
+ return function () { return clearTimeout(timeout); };
687
+ }, [value, delay]);
688
+ return delayedValue;
689
+ }
690
+ export function useVisibilityChange() {
691
+ var _a = useState(document.visibilityState === 'visible'), isVisible = _a[0], setIsVisible = _a[1];
692
+ useEffect(function () {
693
+ var handleVisibilityChange = function () {
694
+ setIsVisible(document.visibilityState === 'visible');
695
+ };
696
+ document.addEventListener('visibilitychange', handleVisibilityChange);
697
+ return function () { return document.removeEventListener('visibilitychange', handleVisibilityChange); };
698
+ }, []);
699
+ return isVisible;
700
+ }
701
+ export function useDebouncedValue(value, delay) {
702
+ var _a = useState(value), debouncedValue = _a[0], setDebouncedValue = _a[1];
703
+ useEffect(function () {
704
+ var timer = setTimeout(function () { return setDebouncedValue(value); }, delay);
705
+ return function () { return clearTimeout(timer); };
706
+ }, [value, delay]);
707
+ return debouncedValue;
708
+ }
709
+ export function useAsync(asyncFunction, immediate) {
710
+ var _this = this;
711
+ if (immediate === void 0) { immediate = true; }
712
+ var _a = useState('idle'), status = _a[0], setStatus = _a[1];
713
+ var _b = useState(null), value = _b[0], setValue = _b[1];
714
+ var _c = useState(null), error = _c[0], setError = _c[1];
715
+ var execute = useCallback(function () { return __awaiter(_this, void 0, void 0, function () {
716
+ var response, err_2;
717
+ return __generator(this, function (_a) {
718
+ switch (_a.label) {
719
+ case 0:
720
+ setStatus('pending');
721
+ setValue(null);
722
+ setError(null);
723
+ _a.label = 1;
724
+ case 1:
725
+ _a.trys.push([1, 3, , 4]);
726
+ return [4 /*yield*/, asyncFunction()];
727
+ case 2:
728
+ response = _a.sent();
729
+ setValue(response);
730
+ setStatus('success');
731
+ return [3 /*break*/, 4];
732
+ case 3:
733
+ err_2 = _a.sent();
734
+ setError(err_2 instanceof Error ? err_2 : new Error('Unknown error'));
735
+ setStatus('error');
736
+ return [3 /*break*/, 4];
737
+ case 4: return [2 /*return*/];
738
+ }
739
+ });
740
+ }); }, [asyncFunction]);
741
+ useEffect(function () {
742
+ if (immediate) {
743
+ execute();
744
+ }
745
+ }, [execute, immediate]);
746
+ return { execute: execute, status: status, value: value, error: error };
747
+ }
748
+ var cachedScriptStatuses = {};
749
+ export function useScript(src, removeOnUnmount) {
750
+ if (removeOnUnmount === void 0) { removeOnUnmount = false; }
751
+ var isScriptExisting = document.querySelector("script[src=\"".concat(src, "\"]"));
752
+ var cachedStatus = cachedScriptStatuses[src];
753
+ var _a = useState(cachedStatus || (isScriptExisting ? 'ready' : 'loading')), status = _a[0], setStatus = _a[1];
754
+ useEffect(function () {
755
+ if (typeof window === 'undefined' || isScriptExisting) {
756
+ return;
757
+ }
758
+ var script = document.createElement('script');
759
+ script.src = src;
760
+ script.async = true;
761
+ var handleLoad = function () {
762
+ setStatus('ready');
763
+ cachedScriptStatuses[src] = 'ready';
764
+ };
765
+ var handleError = function () {
766
+ setStatus('error');
767
+ cachedScriptStatuses[src] = 'error';
768
+ };
769
+ script.addEventListener('load', handleLoad);
770
+ script.addEventListener('error', handleError);
771
+ document.body.appendChild(script);
772
+ return function () {
773
+ script.removeEventListener('load', handleLoad);
774
+ script.removeEventListener('error', handleError);
775
+ if (removeOnUnmount) {
776
+ document.body.removeChild(script);
777
+ }
778
+ };
779
+ }, [src, removeOnUnmount]);
780
+ return status;
781
+ }
782
+ export function useIndexedDB(dbName, storeName) {
783
+ var _this = this;
784
+ var _a = useState(null), data = _a[0], setData = _a[1];
785
+ var _b = useState(null), error = _b[0], setError = _b[1];
786
+ useEffect(function () {
787
+ var fetchData = function () { return __awaiter(_this, void 0, void 0, function () {
788
+ var request_1;
789
+ return __generator(this, function (_a) {
790
+ try {
791
+ request_1 = indexedDB.open(dbName, 1);
792
+ request_1.onsuccess = function () {
793
+ var db = request_1.result;
794
+ var transaction = db.transaction(storeName, 'readonly');
795
+ var store = transaction.objectStore(storeName);
796
+ var getRequest = store.getAll();
797
+ getRequest.onsuccess = function () {
798
+ setData(getRequest.result);
799
+ };
800
+ getRequest.onerror = function () {
801
+ setError(new Error('Failed to fetch data from IndexedDB'));
802
+ };
803
+ };
804
+ request_1.onerror = function () {
805
+ setError(new Error('Failed to open IndexedDB'));
806
+ };
807
+ }
808
+ catch (err) {
809
+ setError(err instanceof Error ? err : new Error('Unknown error'));
810
+ }
811
+ return [2 /*return*/];
812
+ });
813
+ }); };
814
+ fetchData();
815
+ }, [dbName, storeName]);
816
+ return { data: data, error: error };
817
+ }