react-hook-toolkit 3.0.2 → 3.0.4

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