react-hook-toolkit 1.2.0 → 1.2.1

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.
@@ -1,700 +0,0 @@
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, createContext, useMemo } from 'react';
58
- import { isReady } from './chunk940514';
59
- export function useGeoLocation() {
60
- var _a = useState(null), position = _a[0], setPosition = _a[1];
61
- var _b = useState(null), error = _b[0], setError = _b[1];
62
- useEffect(function () {
63
- var success = function (pos) {
64
- setPosition(pos);
65
- };
66
- var failure = function (err) {
67
- setError(new Error("Geolocation error: ".concat(err.message)));
68
- };
69
- if (navigator.geolocation) {
70
- navigator.geolocation.getCurrentPosition(success, failure);
71
- }
72
- else {
73
- setError(new Error('Geolocation not supported'));
74
- }
75
- }, []);
76
- return { position: position, error: error };
77
- }
78
- export function useTimer(initialTime) {
79
- var _a = useState(initialTime), time = _a[0], setTime = _a[1];
80
- var _b = useState(null), error = _b[0], setError = _b[1];
81
- useEffect(function () {
82
- try {
83
- var intervalId_1 = setInterval(function () {
84
- setTime(function (prevTime) { return prevTime - 1; });
85
- }, 1000);
86
- return function () { return clearInterval(intervalId_1); };
87
- }
88
- catch (err) {
89
- setError(err instanceof Error ? err : new Error('Failed to start timer'));
90
- }
91
- }, []);
92
- return { time: time, error: error };
93
- }
94
- export function useIsMounted() {
95
- var _a = useState(false), isMounted = _a[0], setIsMounted = _a[1];
96
- useEffect(function () {
97
- setIsMounted(true);
98
- return function () { return setIsMounted(false); };
99
- }, []);
100
- return isMounted;
101
- }
102
- export function useCss(css) {
103
- var _a = useState(null), error = _a[0], setError = _a[1];
104
- useEffect(function () {
105
- try {
106
- var style_1 = document.createElement('style');
107
- style_1.textContent = css;
108
- document.head.appendChild(style_1);
109
- return function () {
110
- document.head.removeChild(style_1);
111
- };
112
- }
113
- catch (err) {
114
- setError(err instanceof Error ? err : new Error('Failed to apply CSS'));
115
- }
116
- }, [css]);
117
- return { error: error };
118
- }
119
- export function useSpeak(text) {
120
- var _a = useState(null), error = _a[0], setError = _a[1];
121
- var speak = function () {
122
- try {
123
- var utterance = new SpeechSynthesisUtterance(text);
124
- speechSynthesis.speak(utterance);
125
- }
126
- catch (err) {
127
- setError(err instanceof Error ? err : new Error('Failed to speak'));
128
- }
129
- };
130
- return { speak: speak, error: error };
131
- }
132
- export function useCountUp(target, duration) {
133
- var _a = useState(0), count = _a[0], setCount = _a[1];
134
- var _b = useState(null), error = _b[0], setError = _b[1];
135
- useEffect(function () {
136
- try {
137
- var startTime_1 = Date.now();
138
- var intervalId_2 = setInterval(function () {
139
- var elapsed = Date.now() - startTime_1;
140
- setCount(Math.min(target, (elapsed / duration) * target));
141
- if (count >= target)
142
- clearInterval(intervalId_2);
143
- }, 1000);
144
- return function () { return clearInterval(intervalId_2); };
145
- }
146
- catch (err) {
147
- setError(err instanceof Error ? err : new Error('Failed to count up'));
148
- }
149
- }, [target, duration]);
150
- return { count: count, error: error };
151
- }
152
- export function useCountDown(start) {
153
- var _a = useState(start), count = _a[0], setCount = _a[1];
154
- var _b = useState(null), error = _b[0], setError = _b[1];
155
- useEffect(function () {
156
- try {
157
- if (count <= 0)
158
- return;
159
- var intervalId_3 = setInterval(function () {
160
- setCount(function (prevCount) { return Math.max(0, prevCount - 1); });
161
- }, 1000);
162
- return function () { return clearInterval(intervalId_3); };
163
- }
164
- catch (err) {
165
- setError(err instanceof Error ? err : new Error('Failed to start countdown'));
166
- }
167
- }, [count]);
168
- return { count: count, error: error };
169
- }
170
- export var useBattery = function () {
171
- var _a = useState({
172
- supported: true,
173
- loading: true,
174
- level: null,
175
- charging: null,
176
- chargingTime: null,
177
- dischargingTime: null,
178
- }), batteryState = _a[0], setBatteryState = _a[1];
179
- useEffect(function () {
180
- if (!isReady()) {
181
- setBatteryState(function (prevState) { return (__assign(__assign({}, prevState), { supported: false, loading: false })); });
182
- return;
183
- }
184
- var _navigator = navigator;
185
- var battery = null;
186
- var handleBatteryChange = function () {
187
- if (battery) {
188
- setBatteryState({
189
- supported: true,
190
- loading: false,
191
- level: battery.level,
192
- charging: battery.charging,
193
- chargingTime: battery.chargingTime,
194
- dischargingTime: battery.dischargingTime,
195
- });
196
- }
197
- };
198
- _navigator.getBattery().then(function (_battery) {
199
- battery = _battery;
200
- handleBatteryChange();
201
- _battery.addEventListener('levelchange', handleBatteryChange);
202
- _battery.addEventListener('chargingchange', handleBatteryChange);
203
- _battery.addEventListener('chargingtimechange', handleBatteryChange);
204
- _battery.addEventListener('dischargingtimechange', handleBatteryChange);
205
- });
206
- return function () {
207
- if (battery) {
208
- battery.removeEventListener('levelchange', handleBatteryChange);
209
- battery.removeEventListener('chargingchange', handleBatteryChange);
210
- battery.removeEventListener('chargingtimechange', handleBatteryChange);
211
- battery.removeEventListener('dischargingtimechange', handleBatteryChange);
212
- }
213
- };
214
- }, []);
215
- return batteryState;
216
- };
217
- export var useEventListener = function (eventName, handler, elementRef, options) {
218
- var savedHandler = useRef();
219
- useEffect(function () {
220
- savedHandler.current = handler;
221
- }, [handler]);
222
- useEffect(function () {
223
- var element = (elementRef && elementRef.current) || window;
224
- if (!isReady() || !element)
225
- return;
226
- var eventListener = function (event) {
227
- if (savedHandler.current) {
228
- savedHandler.current(event);
229
- }
230
- };
231
- element.addEventListener(eventName, eventListener, options);
232
- return function () {
233
- element.removeEventListener(eventName, eventListener, options);
234
- };
235
- }, [eventName, elementRef, options]);
236
- };
237
- export var useHistory = function () {
238
- var _a = useState(window.history), history = _a[0], setHistory = _a[1];
239
- var _b = useState(null), state = _b[0], setState = _b[1];
240
- var push = useCallback(function (path, state) {
241
- if (isReady()) {
242
- window.history.pushState(state, "", path);
243
- setState(state || null);
244
- }
245
- }, []);
246
- var replace = useCallback(function (path, state) {
247
- if (isReady()) {
248
- window.history.replaceState(state, "", path);
249
- setState(state || null);
250
- }
251
- }, []);
252
- var goBack = useCallback(function () {
253
- if (isReady()) {
254
- window.history.back();
255
- }
256
- }, []);
257
- var goForward = useCallback(function () {
258
- if (isReady()) {
259
- window.history.forward();
260
- }
261
- }, []);
262
- useEffect(function () {
263
- var handlePopState = function (event) {
264
- setState(event.state || null);
265
- };
266
- if (isReady()) {
267
- window.addEventListener("popstate", handlePopState);
268
- return function () {
269
- window.removeEventListener("popstate", handlePopState);
270
- };
271
- }
272
- }, []);
273
- return {
274
- history: history,
275
- state: state,
276
- push: push,
277
- replace: replace,
278
- goBack: goBack,
279
- goForward: goForward,
280
- };
281
- };
282
- export var usePreferredLanguage = function () {
283
- var _a = useState(isReady() ? navigator.language : ""), language = _a[0], setLanguage = _a[1];
284
- var _b = useState(isReady() ? Array.from(navigator.languages) : []), languages = _b[0], setLanguages = _b[1];
285
- var _c = useState(isReady() && !!navigator.language), isSupported = _c[0], setIsSupported = _c[1];
286
- useEffect(function () {
287
- if (isReady()) {
288
- if (navigator.language) {
289
- setLanguage(navigator.language);
290
- setIsSupported(true);
291
- }
292
- if (navigator.languages && navigator.languages.length > 0) {
293
- setLanguages(Array.from(navigator.languages));
294
- setIsSupported(true);
295
- }
296
- else {
297
- setIsSupported(false);
298
- }
299
- }
300
- else {
301
- setIsSupported(false);
302
- }
303
- }, []);
304
- return {
305
- language: language,
306
- languages: languages,
307
- isSupported: isSupported,
308
- };
309
- };
310
- export var useSessionStorage = function (key, initialValue) {
311
- var _a = useState(function () {
312
- if (!isReady()) {
313
- return initialValue;
314
- }
315
- try {
316
- var item = window.sessionStorage.getItem(key);
317
- return item ? JSON.parse(item) : initialValue;
318
- }
319
- catch (error) {
320
- console.warn("Error reading sessionStorage key \"".concat(key, "\":"), error);
321
- return initialValue;
322
- }
323
- }), storedValue = _a[0], setStoredValue = _a[1];
324
- var setValue = function (value) {
325
- try {
326
- var valueToStore = value instanceof Function ? value(storedValue) : value;
327
- setStoredValue(valueToStore);
328
- if (isReady()) {
329
- window.sessionStorage.setItem(key, JSON.stringify(valueToStore));
330
- }
331
- }
332
- catch (error) {
333
- console.warn("Error setting sessionStorage key \"".concat(key, "\":"), error);
334
- }
335
- };
336
- return [storedValue, setValue];
337
- };
338
- export var useSound = function (url) {
339
- var _a = useState(null), audio = _a[0], setAudio = _a[1];
340
- var _b = useState(false), isPlaying = _b[0], setIsPlaying = _b[1];
341
- var _c = useState(null), error = _c[0], setError = _c[1];
342
- useEffect(function () {
343
- if (!isReady() || !window.Audio) {
344
- setError(new Error("Sound is not supported in this environment."));
345
- return;
346
- }
347
- var audioElement = new Audio(url);
348
- setAudio(audioElement);
349
- var handlePlay = function () { return setIsPlaying(true); };
350
- var handlePause = function () { return setIsPlaying(false); };
351
- var handleError = function (e) { return setError(e); };
352
- audioElement.addEventListener("play", handlePlay);
353
- audioElement.addEventListener("pause", handlePause);
354
- audioElement.addEventListener("error", handleError);
355
- return function () {
356
- audioElement.removeEventListener("play", handlePlay);
357
- audioElement.removeEventListener("pause", handlePause);
358
- audioElement.removeEventListener("error", handleError);
359
- audioElement.pause();
360
- audioElement.currentTime = 0;
361
- };
362
- }, [url]);
363
- var play = useCallback(function () {
364
- if (audio) {
365
- audio.play().catch(function (e) { return setError(e); });
366
- }
367
- }, [audio]);
368
- var pause = useCallback(function () {
369
- if (audio) {
370
- audio.pause();
371
- }
372
- }, [audio]);
373
- var stop = useCallback(function () {
374
- if (audio) {
375
- audio.pause();
376
- audio.currentTime = 0;
377
- }
378
- }, [audio]);
379
- var setVolume = useCallback(function (volume) {
380
- if (audio) {
381
- audio.volume = volume;
382
- }
383
- }, [audio]);
384
- return {
385
- play: play,
386
- pause: pause,
387
- stop: stop,
388
- setVolume: setVolume,
389
- isPlaying: isPlaying,
390
- error: error,
391
- };
392
- };
393
- export var useTouch = function (elementRef) {
394
- var _a = useState({
395
- x: null,
396
- y: null,
397
- }), touchStart = _a[0], setTouchStart = _a[1];
398
- var _b = useState({
399
- x: null,
400
- y: null,
401
- }), touchMove = _b[0], setTouchMove = _b[1];
402
- var _c = useState({ x: null, y: null }), touchEnd = _c[0], setTouchEnd = _c[1];
403
- var handleTouchStart = useCallback(function (event) {
404
- var touch = event.touches[0];
405
- setTouchStart({ x: touch.clientX, y: touch.clientY });
406
- }, []);
407
- var handleTouchMove = useCallback(function (event) {
408
- var touch = event.touches[0];
409
- setTouchMove({ x: touch.clientX, y: touch.clientY });
410
- }, []);
411
- var handleTouchEnd = useCallback(function () {
412
- setTouchEnd(touchMove);
413
- setTouchMove({ x: null, y: null });
414
- setTouchStart({ x: null, y: null });
415
- }, [touchMove]);
416
- useEffect(function () {
417
- if (!isReady() || !elementRef.current) {
418
- return;
419
- }
420
- var element = elementRef.current;
421
- element.addEventListener("touchstart", handleTouchStart);
422
- element.addEventListener("touchmove", handleTouchMove);
423
- element.addEventListener("touchend", handleTouchEnd);
424
- return function () {
425
- element.removeEventListener("touchstart", handleTouchStart);
426
- element.removeEventListener("touchmove", handleTouchMove);
427
- element.removeEventListener("touchend", handleTouchEnd);
428
- };
429
- }, [elementRef, handleTouchStart, handleTouchMove, handleTouchEnd]);
430
- return { touchStart: touchStart, touchMove: touchMove, touchEnd: touchEnd };
431
- };
432
- export var useUpdateEffect = function (effect, deps) {
433
- var isFirstMount = useRef(true);
434
- useEffect(function () {
435
- if (!isReady()) {
436
- return;
437
- }
438
- if (isFirstMount.current) {
439
- isFirstMount.current = false;
440
- return;
441
- }
442
- return effect();
443
- }, deps);
444
- };
445
- export var usePersistedForm = function (key, initialValue) {
446
- var _a = useState(function () {
447
- try {
448
- var stored = localStorage.getItem(key);
449
- return stored ? JSON.parse(stored) : initialValue;
450
- }
451
- catch (_a) {
452
- return initialValue;
453
- }
454
- }), state = _a[0], setState = _a[1];
455
- useEffect(function () {
456
- localStorage.setItem(key, JSON.stringify(state));
457
- }, [key, state]);
458
- return [state, setState];
459
- };
460
- export var useCrossFieldValidation = function (validate) {
461
- var _a = useState({}), errors = _a[0], setErrors = _a[1];
462
- var validateFields = function (values) {
463
- var newErrors = validate(values);
464
- setErrors(newErrors);
465
- return Object.values(newErrors).every(function (e) { return !e; });
466
- };
467
- return { errors: errors, validateFields: validateFields };
468
- };
469
- export var useFieldArray = function (initialValue) {
470
- var _a = useState(initialValue), fields = _a[0], setFields = _a[1];
471
- var append = function (item) { return setFields(__spreadArray(__spreadArray([], fields, true), [item], false)); };
472
- var remove = function (index) { return setFields(fields.filter(function (_, i) { return i !== index; })); };
473
- var update = function (index, item) {
474
- return setFields(fields.map(function (f, i) { return (i === index ? item : f); }));
475
- };
476
- return { fields: fields, append: append, remove: remove, update: update };
477
- };
478
- export var useFormSubmit = function (handler) {
479
- var _a = useState(false), isSubmitting = _a[0], setIsSubmitting = _a[1];
480
- var _b = useState(null), submitError = _b[0], setSubmitError = _b[1];
481
- var handleSubmit = function (data) { return __awaiter(void 0, void 0, void 0, function () {
482
- var err_1;
483
- return __generator(this, function (_a) {
484
- switch (_a.label) {
485
- case 0:
486
- _a.trys.push([0, 2, 3, 4]);
487
- setIsSubmitting(true);
488
- setSubmitError(null);
489
- return [4 /*yield*/, handler(data)];
490
- case 1:
491
- _a.sent();
492
- return [3 /*break*/, 4];
493
- case 2:
494
- err_1 = _a.sent();
495
- setSubmitError(err_1 instanceof Error ? err_1.message : 'Submission failed');
496
- return [3 /*break*/, 4];
497
- case 3:
498
- setIsSubmitting(false);
499
- return [7 /*endfinally*/];
500
- case 4: return [2 /*return*/];
501
- }
502
- });
503
- }); };
504
- return { handleSubmit: handleSubmit, isSubmitting: isSubmitting, submitError: submitError };
505
- };
506
- export var useSmartForm = function (initialValues, storageKey) {
507
- var _a = useState(function () {
508
- if (!storageKey)
509
- return initialValues;
510
- try {
511
- var saved = localStorage.getItem(storageKey);
512
- return saved ? JSON.parse(saved) : initialValues;
513
- }
514
- catch (_a) {
515
- return initialValues;
516
- }
517
- }), values = _a[0], setValues = _a[1];
518
- var _b = useState(false), dirty = _b[0], setDirty = _b[1];
519
- useEffect(function () {
520
- if (storageKey && dirty) {
521
- var timer_1 = setTimeout(function () {
522
- localStorage.setItem(storageKey, JSON.stringify(values));
523
- }, 500);
524
- return function () { return clearTimeout(timer_1); };
525
- }
526
- }, [values, storageKey, dirty]);
527
- var handleChange = function (e) {
528
- var _a = e.target, name = _a.name, value = _a.value, type = _a.type, checked = _a.checked;
529
- setValues(function (prev) {
530
- var _a;
531
- return (__assign(__assign({}, prev), (_a = {}, _a[name] = type === 'checkbox' ? checked : value, _a)));
532
- });
533
- setDirty(true);
534
- };
535
- return { values: values, handleChange: handleChange, setValues: setValues, dirty: dirty };
536
- };
537
- export var useUndo = function (initialState) {
538
- var _a = useState([initialState]), states = _a[0], setStates = _a[1];
539
- var _b = useState(0), index = _b[0], setIndex = _b[1];
540
- var present = states[index];
541
- var canUndo = index > 0;
542
- var canRedo = index < states.length - 1;
543
- var updateState = function (newState) {
544
- var newStates = states.slice(0, index + 1);
545
- setStates(__spreadArray(__spreadArray([], newStates, true), [newState], false));
546
- setIndex(newStates.length);
547
- };
548
- var undo = function () { return canUndo && setIndex(function (i) { return i - 1; }); };
549
- var redo = function () { return canRedo && setIndex(function (i) { return i + 1; }); };
550
- return { state: present, setState: updateState, undo: undo, redo: redo, canUndo: canUndo, canRedo: canRedo };
551
- };
552
- export var useFormWizard = function (steps, initialValues) {
553
- var _a = useState(0), currentStep = _a[0], setCurrentStep = _a[1];
554
- var _b = useState(initialValues), values = _b[0], setValues = _b[1];
555
- var _c = useState({}), errors = _c[0], setErrors = _c[1];
556
- var next = function () {
557
- var _a, _b;
558
- var validation = ((_b = (_a = steps[currentStep]).validate) === null || _b === void 0 ? void 0 : _b.call(_a, values)) || {};
559
- if (Object.keys(validation).length > 0) {
560
- setErrors(validation);
561
- return;
562
- }
563
- setErrors({});
564
- setCurrentStep(function (prev) { return Math.min(prev + 1, steps.length - 1); });
565
- };
566
- var prev = function () {
567
- setCurrentStep(function (prev) { return Math.max(prev - 1, 0); });
568
- };
569
- return {
570
- currentStep: currentStep,
571
- CurrentStep: steps[currentStep].component,
572
- values: values,
573
- setValues: setValues,
574
- next: next,
575
- prev: prev,
576
- errors: errors,
577
- isFirstStep: currentStep === 0,
578
- isLastStep: currentStep === steps.length - 1,
579
- };
580
- };
581
- export var createOptimizedContext = function () {
582
- var Context = createContext(undefined);
583
- var useOptimizedContext = function (selector) {
584
- var value = useContext(Context);
585
- if (value === undefined)
586
- throw new Error('Missing provider');
587
- return useMemo(function () { return selector(value); }, [value, selector]);
588
- };
589
- return [Context.Provider, useOptimizedContext];
590
- };
591
- export var useWebSocket = function (url, onMessage) {
592
- var _a = useState(null), data = _a[0], setData = _a[1];
593
- var _b = useState(false), isConnected = _b[0], setIsConnected = _b[1];
594
- var _c = useState(null), socket = _c[0], setSocket = _c[1];
595
- var send = useCallback(function (message) {
596
- if ((socket === null || socket === void 0 ? void 0 : socket.readyState) === WebSocket.OPEN) {
597
- socket.send(JSON.stringify(message));
598
- }
599
- }, [socket]);
600
- useEffect(function () {
601
- var ws = new WebSocket(url);
602
- setSocket(ws);
603
- ws.onopen = function () { return setIsConnected(true); };
604
- ws.onclose = function () { return setIsConnected(false); };
605
- ws.onmessage = function (event) {
606
- var newData = JSON.parse(event.data);
607
- setData(newData);
608
- onMessage === null || onMessage === void 0 ? void 0 : onMessage(newData);
609
- };
610
- return function () { return ws.close(); };
611
- }, [url, onMessage]);
612
- return { data: data, send: send, isConnected: isConnected };
613
- };
614
- export var useDragReorder = function (initialItems) {
615
- var _a = useState(initialItems), items = _a[0], setItems = _a[1];
616
- var dragItem = useRef(null);
617
- var dragOverItem = useRef(null);
618
- var handleDragStart = function (index) {
619
- dragItem.current = index;
620
- };
621
- var handleDragEnter = function (index) {
622
- dragOverItem.current = index;
623
- };
624
- var handleDrop = function () {
625
- if (dragItem.current === null || dragOverItem.current === null)
626
- return;
627
- var newItems = __spreadArray([], items, true);
628
- var draggedItem = newItems[dragItem.current];
629
- newItems.splice(dragItem.current, 1);
630
- newItems.splice(dragOverItem.current, 0, draggedItem);
631
- setItems(newItems);
632
- dragItem.current = null;
633
- dragOverItem.current = null;
634
- };
635
- return { items: items, handleDragStart: handleDragStart, handleDragEnter: handleDragEnter, handleDrop: handleDrop };
636
- };
637
- export var useInfiniteScroll = function (fetchData, initialData) {
638
- if (initialData === void 0) { initialData = []; }
639
- var _a = useState(initialData), data = _a[0], setData = _a[1];
640
- var _b = useState(1), page = _b[0], setPage = _b[1];
641
- var _c = useState(false), loading = _c[0], setLoading = _c[1];
642
- var _d = useState(true), hasMore = _d[0], setHasMore = _d[1];
643
- var observer = useRef();
644
- var lastElementRef = useCallback(function (node) {
645
- if (loading)
646
- return;
647
- if (observer.current)
648
- observer.current.disconnect();
649
- observer.current = new IntersectionObserver(function (entries) {
650
- if (entries[0].isIntersecting && hasMore) {
651
- setPage(function (prev) { return prev + 1; });
652
- }
653
- });
654
- if (node)
655
- observer.current.observe(node);
656
- }, [loading, hasMore]);
657
- useEffect(function () {
658
- var loadData = function () { return __awaiter(void 0, void 0, void 0, function () {
659
- var newData_1;
660
- return __generator(this, function (_a) {
661
- switch (_a.label) {
662
- case 0:
663
- setLoading(true);
664
- _a.label = 1;
665
- case 1:
666
- _a.trys.push([1, , 3, 4]);
667
- return [4 /*yield*/, fetchData(page)];
668
- case 2:
669
- newData_1 = _a.sent();
670
- setData(function (prev) { return __spreadArray(__spreadArray([], prev, true), newData_1, true); });
671
- setHasMore(newData_1.length > 0);
672
- return [3 /*break*/, 4];
673
- case 3:
674
- setLoading(false);
675
- return [7 /*endfinally*/];
676
- case 4: return [2 /*return*/];
677
- }
678
- });
679
- }); };
680
- loadData();
681
- }, [page, fetchData]);
682
- return { data: data, loading: loading, hasMore: hasMore, lastElementRef: lastElementRef };
683
- };
684
- export var useEventListeners = function (eventType, handler, element, options) {
685
- if (element === void 0) { element = window; }
686
- var savedHandler = useRef(handler);
687
- useEffect(function () {
688
- savedHandler.current = handler;
689
- }, [handler]);
690
- useEffect(function () {
691
- var isSupported = element && element.addEventListener;
692
- if (!isSupported)
693
- return;
694
- var listener = function (event) { return savedHandler.current(event); };
695
- element.addEventListener(eventType, listener, options);
696
- return function () {
697
- element.removeEventListener(eventType, listener, options);
698
- };
699
- }, [eventType, element, options]);
700
- };