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