@reactuses/core 2.2.2 → 2.2.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.
- package/dist/index.cjs +97 -44
- package/dist/index.d.ts +19 -8
- package/dist/index.mjs +96 -45
- package/package.json +1 -1
package/dist/index.cjs
CHANGED
|
@@ -163,7 +163,7 @@ function useStorage(key, defaults, getStorage, options = {}) {
|
|
|
163
163
|
console.error(e);
|
|
164
164
|
}, []);
|
|
165
165
|
let storage;
|
|
166
|
-
const { onError = defaultOnError,
|
|
166
|
+
const { onError = defaultOnError, csrData } = options;
|
|
167
167
|
try {
|
|
168
168
|
storage = getStorage();
|
|
169
169
|
} catch (err) {
|
|
@@ -176,21 +176,22 @@ function useStorage(key, defaults, getStorage, options = {}) {
|
|
|
176
176
|
}, [options.serializer, type]);
|
|
177
177
|
const [state, setState] = React.useState(defaults);
|
|
178
178
|
useDeepCompareEffect(() => {
|
|
179
|
+
const data = csrData ? isFunction(csrData) ? csrData() : csrData : defaults;
|
|
179
180
|
const getStoredValue = () => {
|
|
180
181
|
try {
|
|
181
182
|
const raw = storage == null ? void 0 : storage.getItem(key);
|
|
182
|
-
if (raw !== void 0 && raw !== null
|
|
183
|
+
if (raw !== void 0 && raw !== null) {
|
|
183
184
|
return serializer.read(raw);
|
|
184
185
|
} else {
|
|
185
|
-
storage == null ? void 0 : storage.setItem(key, serializer.write(
|
|
186
|
-
return
|
|
186
|
+
storage == null ? void 0 : storage.setItem(key, serializer.write(data));
|
|
187
|
+
return data;
|
|
187
188
|
}
|
|
188
189
|
} catch (e) {
|
|
189
190
|
onError(e);
|
|
190
191
|
}
|
|
191
192
|
};
|
|
192
193
|
setState(getStoredValue());
|
|
193
|
-
}, [key,
|
|
194
|
+
}, [key, defaults, serializer, storage, onError]);
|
|
194
195
|
const updateState = useEvent(
|
|
195
196
|
(valOrFunc) => {
|
|
196
197
|
const currentState = isFunction(valOrFunc) ? valOrFunc(state) : valOrFunc;
|
|
@@ -247,6 +248,55 @@ function useInterval(callback, delay, options) {
|
|
|
247
248
|
}, [delay, immediate]);
|
|
248
249
|
}
|
|
249
250
|
|
|
251
|
+
function useDarkMode(options) {
|
|
252
|
+
const {
|
|
253
|
+
selector = "html",
|
|
254
|
+
attribute = "class",
|
|
255
|
+
classNameDark = "",
|
|
256
|
+
classNameLight = "",
|
|
257
|
+
storageKey = "reactuses-color-scheme",
|
|
258
|
+
storage = () => isBrowser ? localStorage : void 0,
|
|
259
|
+
defaultValue = false
|
|
260
|
+
} = options;
|
|
261
|
+
const value = () => {
|
|
262
|
+
return window.matchMedia("(prefers-color-scheme: dark)").matches;
|
|
263
|
+
};
|
|
264
|
+
const [dark, setDark] = useStorage(
|
|
265
|
+
storageKey,
|
|
266
|
+
defaultValue,
|
|
267
|
+
storage,
|
|
268
|
+
{
|
|
269
|
+
csrData: value
|
|
270
|
+
}
|
|
271
|
+
);
|
|
272
|
+
React.useEffect(() => {
|
|
273
|
+
const element = window == null ? void 0 : window.document.querySelector(selector);
|
|
274
|
+
if (!element) {
|
|
275
|
+
return;
|
|
276
|
+
}
|
|
277
|
+
if (attribute === "class") {
|
|
278
|
+
dark && classNameDark && element.classList.add(classNameDark);
|
|
279
|
+
!dark && classNameLight && element.classList.add(classNameLight);
|
|
280
|
+
} else {
|
|
281
|
+
dark && classNameDark && element.setAttribute(attribute, classNameDark);
|
|
282
|
+
!dark && classNameLight && element.setAttribute(attribute, classNameLight);
|
|
283
|
+
}
|
|
284
|
+
return () => {
|
|
285
|
+
if (!element) {
|
|
286
|
+
return;
|
|
287
|
+
}
|
|
288
|
+
if (attribute === "class") {
|
|
289
|
+
dark && classNameDark && element.classList.remove(classNameDark);
|
|
290
|
+
!dark && classNameLight && element.classList.remove(classNameLight);
|
|
291
|
+
} else {
|
|
292
|
+
dark && classNameDark && element.removeAttribute(attribute);
|
|
293
|
+
!dark && classNameLight && element.removeAttribute(attribute);
|
|
294
|
+
}
|
|
295
|
+
};
|
|
296
|
+
}, [attribute, classNameDark, classNameLight, dark, selector]);
|
|
297
|
+
return [dark, () => setDark((dark2) => !dark2), setDark];
|
|
298
|
+
}
|
|
299
|
+
|
|
250
300
|
const getInitialState = (query, defaultState) => {
|
|
251
301
|
if (defaultState !== void 0) {
|
|
252
302
|
return defaultState;
|
|
@@ -294,39 +344,6 @@ function usePreferredDark(defaultState) {
|
|
|
294
344
|
return useMediaQuery("(prefers-color-scheme: dark)", defaultState);
|
|
295
345
|
}
|
|
296
346
|
|
|
297
|
-
function useDarkMode(options = {}) {
|
|
298
|
-
const {
|
|
299
|
-
selector = "html",
|
|
300
|
-
attribute = "class",
|
|
301
|
-
initialValue,
|
|
302
|
-
storageKey = "reactuses-color-scheme",
|
|
303
|
-
storage = () => isBrowser ? localStorage : void 0
|
|
304
|
-
} = options;
|
|
305
|
-
const prefersDarkMode = usePreferredDark(false);
|
|
306
|
-
const value = initialValue ? initialValue : prefersDarkMode ? "dark" : "light";
|
|
307
|
-
const [dark, setDark] = useStorage(storageKey, value, storage, {
|
|
308
|
-
ignoreDefaults: false
|
|
309
|
-
});
|
|
310
|
-
const wrappedSetDark = React.useCallback(
|
|
311
|
-
(latestDark) => {
|
|
312
|
-
const element = window == null ? void 0 : window.document.querySelector(selector);
|
|
313
|
-
if (!element) {
|
|
314
|
-
return;
|
|
315
|
-
}
|
|
316
|
-
if (attribute === "class") {
|
|
317
|
-
latestDark && element.classList.add(latestDark);
|
|
318
|
-
dark && element.classList.remove(dark);
|
|
319
|
-
} else {
|
|
320
|
-
latestDark && element.setAttribute(attribute, latestDark);
|
|
321
|
-
dark && element.removeAttribute(attribute);
|
|
322
|
-
}
|
|
323
|
-
setDark(latestDark);
|
|
324
|
-
},
|
|
325
|
-
[attribute, dark, selector, setDark]
|
|
326
|
-
);
|
|
327
|
-
return [dark, wrappedSetDark];
|
|
328
|
-
}
|
|
329
|
-
|
|
330
347
|
function useMount(fn) {
|
|
331
348
|
if (isDev) {
|
|
332
349
|
if (!isFunction(fn)) {
|
|
@@ -550,7 +567,7 @@ function useLatestElement(target, defaultElement) {
|
|
|
550
567
|
const ref = React.useRef(getTargetElement(target, defaultElement));
|
|
551
568
|
React.useEffect(() => {
|
|
552
569
|
ref.current = getTargetElement(target, defaultElement);
|
|
553
|
-
}
|
|
570
|
+
});
|
|
554
571
|
return ref;
|
|
555
572
|
}
|
|
556
573
|
|
|
@@ -2395,21 +2412,21 @@ function useClipBorad() {
|
|
|
2395
2412
|
|
|
2396
2413
|
function useClickOutSide(target, handler) {
|
|
2397
2414
|
const savedHandler = useLatest(handler);
|
|
2415
|
+
const element = useLatestElement(target);
|
|
2398
2416
|
const listener = (event) => {
|
|
2399
|
-
|
|
2400
|
-
if (!element) {
|
|
2417
|
+
if (!element.current) {
|
|
2401
2418
|
return;
|
|
2402
2419
|
}
|
|
2403
2420
|
const elements = event.composedPath();
|
|
2404
|
-
if (element === event.target || elements.includes(element)) {
|
|
2421
|
+
if (element.current === event.target || elements.includes(element.current)) {
|
|
2405
2422
|
return;
|
|
2406
2423
|
}
|
|
2407
2424
|
savedHandler.current(event);
|
|
2408
2425
|
};
|
|
2409
|
-
useEventListener("mousedown", listener,
|
|
2426
|
+
useEventListener("mousedown", listener, defaultWindow, {
|
|
2410
2427
|
passive: true
|
|
2411
2428
|
});
|
|
2412
|
-
useEventListener("touchstart", listener,
|
|
2429
|
+
useEventListener("touchstart", listener, defaultWindow, {
|
|
2413
2430
|
passive: true
|
|
2414
2431
|
});
|
|
2415
2432
|
}
|
|
@@ -2767,11 +2784,47 @@ function useAsyncEffect(effect, cleanup = noop, deps) {
|
|
|
2767
2784
|
}, deps);
|
|
2768
2785
|
}
|
|
2769
2786
|
|
|
2787
|
+
const padZero = (time) => {
|
|
2788
|
+
return `${time}`.length < 2 ? `0${time}` : `${time}`;
|
|
2789
|
+
};
|
|
2790
|
+
const getHMSTime = (timeDiff) => {
|
|
2791
|
+
if (timeDiff <= 0) {
|
|
2792
|
+
return ["00", "00", "00"];
|
|
2793
|
+
}
|
|
2794
|
+
if (timeDiff > 100 * 3600) {
|
|
2795
|
+
return ["99", "59", "59"];
|
|
2796
|
+
}
|
|
2797
|
+
const hour = Math.floor(timeDiff / 3600);
|
|
2798
|
+
const minute = Math.floor((timeDiff - hour * 3600) / 60);
|
|
2799
|
+
const second = timeDiff - hour * 3600 - minute * 60;
|
|
2800
|
+
return [padZero(hour), padZero(minute), padZero(second)];
|
|
2801
|
+
};
|
|
2802
|
+
const useCountDown = (time, format = getHMSTime, callback) => {
|
|
2803
|
+
const [remainTime, setRemainTime] = React.useState(time);
|
|
2804
|
+
const [delay, setDelay] = React.useState(1e3);
|
|
2805
|
+
useInterval(() => {
|
|
2806
|
+
if (remainTime <= 0) {
|
|
2807
|
+
setDelay(null);
|
|
2808
|
+
return;
|
|
2809
|
+
}
|
|
2810
|
+
setRemainTime(remainTime - 1);
|
|
2811
|
+
}, delay);
|
|
2812
|
+
React.useEffect(() => {
|
|
2813
|
+
if (time > 0 && remainTime <= 0) {
|
|
2814
|
+
callback && callback();
|
|
2815
|
+
}
|
|
2816
|
+
}, [callback, remainTime, time]);
|
|
2817
|
+
const [hour, minute, secoud] = format(remainTime);
|
|
2818
|
+
return [hour, minute, secoud];
|
|
2819
|
+
};
|
|
2820
|
+
|
|
2821
|
+
exports.getHMSTime = getHMSTime;
|
|
2770
2822
|
exports.useActiveElement = useActiveElement;
|
|
2771
2823
|
exports.useAsyncEffect = useAsyncEffect;
|
|
2772
2824
|
exports.useClickOutside = useClickOutSide;
|
|
2773
2825
|
exports.useClipboard = useClipBorad;
|
|
2774
2826
|
exports.useControlled = useControlled;
|
|
2827
|
+
exports.useCountDown = useCountDown;
|
|
2775
2828
|
exports.useCounter = useCounter;
|
|
2776
2829
|
exports.useCustomCompareEffect = useCustomCompareEffect;
|
|
2777
2830
|
exports.useCycleList = useCycleList;
|
package/dist/index.d.ts
CHANGED
|
@@ -28,9 +28,9 @@ interface UseStorageOptions<T> {
|
|
|
28
28
|
*/
|
|
29
29
|
onError?: (error: unknown) => void;
|
|
30
30
|
/**
|
|
31
|
-
*
|
|
31
|
+
* set to storage when nodata in effect, fallback to defaults
|
|
32
32
|
*/
|
|
33
|
-
|
|
33
|
+
csrData?: T | (() => T);
|
|
34
34
|
}
|
|
35
35
|
|
|
36
36
|
declare function useLocalStorage(key: string, defaults: string, options?: UseStorageOptions<string>): readonly [string | null, Dispatch<SetStateAction<string | null>>];
|
|
@@ -64,7 +64,7 @@ declare function useInterval(callback: () => void, delay?: number | null, option
|
|
|
64
64
|
immediate?: boolean;
|
|
65
65
|
}): void;
|
|
66
66
|
|
|
67
|
-
interface UseDarkOptions
|
|
67
|
+
interface UseDarkOptions {
|
|
68
68
|
/**
|
|
69
69
|
* CSS Selector for the target element applying to
|
|
70
70
|
*
|
|
@@ -78,10 +78,10 @@ interface UseDarkOptions<T> {
|
|
|
78
78
|
*/
|
|
79
79
|
attribute?: string;
|
|
80
80
|
/**
|
|
81
|
-
*
|
|
82
|
-
* @default
|
|
81
|
+
* isomorphic default value
|
|
82
|
+
* @default false
|
|
83
83
|
*/
|
|
84
|
-
|
|
84
|
+
defaultValue?: boolean;
|
|
85
85
|
/**
|
|
86
86
|
* Key to persist the data into localStorage/sessionStorage.
|
|
87
87
|
*
|
|
@@ -94,8 +94,16 @@ interface UseDarkOptions<T> {
|
|
|
94
94
|
* @default localStorage
|
|
95
95
|
*/
|
|
96
96
|
storage?: () => Storage;
|
|
97
|
+
/**
|
|
98
|
+
* name dark apply to element
|
|
99
|
+
*/
|
|
100
|
+
classNameDark: string;
|
|
101
|
+
/**
|
|
102
|
+
* name light apply to element
|
|
103
|
+
*/
|
|
104
|
+
classNameLight: string;
|
|
97
105
|
}
|
|
98
|
-
declare function useDarkMode
|
|
106
|
+
declare function useDarkMode(options: UseDarkOptions): readonly [boolean | null, () => void, react.Dispatch<react.SetStateAction<boolean | null>>];
|
|
99
107
|
|
|
100
108
|
declare function useMediaQuery(query: string, defaultState?: boolean): boolean;
|
|
101
109
|
|
|
@@ -805,4 +813,7 @@ declare const useSticky: ({ targetElement, scrollElement, axis, nav, }: UseStick
|
|
|
805
813
|
|
|
806
814
|
declare function useAsyncEffect<T extends void>(effect: () => Promise<T> | T, cleanup?: typeof effect, deps?: DependencyList): void;
|
|
807
815
|
|
|
808
|
-
|
|
816
|
+
declare const getHMSTime: (timeDiff: number) => [string, string, string];
|
|
817
|
+
declare const useCountDown: (time: number, format?: (number: any) => [string, string, string], callback?: () => void) => readonly [string, string, string];
|
|
818
|
+
|
|
819
|
+
export { ColorScheme, Contrast, CursorState, GeneralPermissionDescriptor, IDisposable, IEvent, IEventOnce, IListener, INetworkInformation, IState, IUseNetworkState, KeyModifier, MousePressedOptions, MouseSourceType, OrientationState, RafLoopReturns, ScrollIntoViewAnimation, ScrollIntoViewParams, State, Status, Target, UseDarkOptions, UseDraggableOptions, UseElementBoundingOptions, UseEventEmitterReturn, UseFileDialogOptions, UseFpsOptions, UseFullScreenOptions, UseInfiniteScrollOptions, UseLongPressOptions, UseModifierOptions, UseScriptTagOptions, UseScrollOptions, UseStickyParams, UseTextDirectionOptions, UseTextDirectionValue, UseTimeoutFnOptions, UseVirtualListItem, UseVirtualListOptions, UseVirtualListReturn, WindowSize, getHMSTime, useActiveElement, useAsyncEffect, useClickOutSide as useClickOutside, useClipBorad as useClipboard, useControlled, useCountDown, useCounter, useCustomCompareEffect, useCycleList, useDarkMode, useDebounce, useDebounceFn, useDeepCompareEffect, useDocumentVisibility, useDraggable, useDropZone, useElementBounding, useElementSize, useElementVisibility, useEvent, useEventEmitter, useEventListener, useFavicon, useFileDialog, useFirstMountState, useFocus, _default$2 as useFps, useFullscreen, useGeolocation, useIdle, useInfiniteScroll, useIntersectionObserver, useInterval, useIsomorphicLayoutEffect, useKeyModifier, useLatest, useLocalStorage, useLongPress, _default$3 as useMediaDevices, useMediaQuery, useMount, useMountedState, useMouse, useMousePressed, useMutationObserver, useNetwork, useObjectUrl, _default$1 as useOnceEffect, _default as useOnceLayoutEffect, useOnline, useOrientation, usePageLeave, usePermission, usePreferredColorScheme, usePreferredContrast, usePreferredDark, usePrevious, useRafFn, useRafState, useReducedMotion, useResizeObserver, useScriptTag, useScroll, useScrollIntoView, useScrollLock, useSessionStorage, useSticky, useTextDirection, useThrottle, useThrottleFn, useTimeout, useTimeoutFn, useTitle, useToggle, useUnmount, useUpdate, _default$5 as useUpdateEffect, _default$4 as useUpdateLayoutEffect, useVirtualList, useWindowScroll, useWindowSize, useWindowsFocus };
|
package/dist/index.mjs
CHANGED
|
@@ -155,7 +155,7 @@ function useStorage(key, defaults, getStorage, options = {}) {
|
|
|
155
155
|
console.error(e);
|
|
156
156
|
}, []);
|
|
157
157
|
let storage;
|
|
158
|
-
const { onError = defaultOnError,
|
|
158
|
+
const { onError = defaultOnError, csrData } = options;
|
|
159
159
|
try {
|
|
160
160
|
storage = getStorage();
|
|
161
161
|
} catch (err) {
|
|
@@ -168,21 +168,22 @@ function useStorage(key, defaults, getStorage, options = {}) {
|
|
|
168
168
|
}, [options.serializer, type]);
|
|
169
169
|
const [state, setState] = useState(defaults);
|
|
170
170
|
useDeepCompareEffect(() => {
|
|
171
|
+
const data = csrData ? isFunction(csrData) ? csrData() : csrData : defaults;
|
|
171
172
|
const getStoredValue = () => {
|
|
172
173
|
try {
|
|
173
174
|
const raw = storage == null ? void 0 : storage.getItem(key);
|
|
174
|
-
if (raw !== void 0 && raw !== null
|
|
175
|
+
if (raw !== void 0 && raw !== null) {
|
|
175
176
|
return serializer.read(raw);
|
|
176
177
|
} else {
|
|
177
|
-
storage == null ? void 0 : storage.setItem(key, serializer.write(
|
|
178
|
-
return
|
|
178
|
+
storage == null ? void 0 : storage.setItem(key, serializer.write(data));
|
|
179
|
+
return data;
|
|
179
180
|
}
|
|
180
181
|
} catch (e) {
|
|
181
182
|
onError(e);
|
|
182
183
|
}
|
|
183
184
|
};
|
|
184
185
|
setState(getStoredValue());
|
|
185
|
-
}, [key,
|
|
186
|
+
}, [key, defaults, serializer, storage, onError]);
|
|
186
187
|
const updateState = useEvent(
|
|
187
188
|
(valOrFunc) => {
|
|
188
189
|
const currentState = isFunction(valOrFunc) ? valOrFunc(state) : valOrFunc;
|
|
@@ -239,6 +240,55 @@ function useInterval(callback, delay, options) {
|
|
|
239
240
|
}, [delay, immediate]);
|
|
240
241
|
}
|
|
241
242
|
|
|
243
|
+
function useDarkMode(options) {
|
|
244
|
+
const {
|
|
245
|
+
selector = "html",
|
|
246
|
+
attribute = "class",
|
|
247
|
+
classNameDark = "",
|
|
248
|
+
classNameLight = "",
|
|
249
|
+
storageKey = "reactuses-color-scheme",
|
|
250
|
+
storage = () => isBrowser ? localStorage : void 0,
|
|
251
|
+
defaultValue = false
|
|
252
|
+
} = options;
|
|
253
|
+
const value = () => {
|
|
254
|
+
return window.matchMedia("(prefers-color-scheme: dark)").matches;
|
|
255
|
+
};
|
|
256
|
+
const [dark, setDark] = useStorage(
|
|
257
|
+
storageKey,
|
|
258
|
+
defaultValue,
|
|
259
|
+
storage,
|
|
260
|
+
{
|
|
261
|
+
csrData: value
|
|
262
|
+
}
|
|
263
|
+
);
|
|
264
|
+
useEffect(() => {
|
|
265
|
+
const element = window == null ? void 0 : window.document.querySelector(selector);
|
|
266
|
+
if (!element) {
|
|
267
|
+
return;
|
|
268
|
+
}
|
|
269
|
+
if (attribute === "class") {
|
|
270
|
+
dark && classNameDark && element.classList.add(classNameDark);
|
|
271
|
+
!dark && classNameLight && element.classList.add(classNameLight);
|
|
272
|
+
} else {
|
|
273
|
+
dark && classNameDark && element.setAttribute(attribute, classNameDark);
|
|
274
|
+
!dark && classNameLight && element.setAttribute(attribute, classNameLight);
|
|
275
|
+
}
|
|
276
|
+
return () => {
|
|
277
|
+
if (!element) {
|
|
278
|
+
return;
|
|
279
|
+
}
|
|
280
|
+
if (attribute === "class") {
|
|
281
|
+
dark && classNameDark && element.classList.remove(classNameDark);
|
|
282
|
+
!dark && classNameLight && element.classList.remove(classNameLight);
|
|
283
|
+
} else {
|
|
284
|
+
dark && classNameDark && element.removeAttribute(attribute);
|
|
285
|
+
!dark && classNameLight && element.removeAttribute(attribute);
|
|
286
|
+
}
|
|
287
|
+
};
|
|
288
|
+
}, [attribute, classNameDark, classNameLight, dark, selector]);
|
|
289
|
+
return [dark, () => setDark((dark2) => !dark2), setDark];
|
|
290
|
+
}
|
|
291
|
+
|
|
242
292
|
const getInitialState = (query, defaultState) => {
|
|
243
293
|
if (defaultState !== void 0) {
|
|
244
294
|
return defaultState;
|
|
@@ -286,39 +336,6 @@ function usePreferredDark(defaultState) {
|
|
|
286
336
|
return useMediaQuery("(prefers-color-scheme: dark)", defaultState);
|
|
287
337
|
}
|
|
288
338
|
|
|
289
|
-
function useDarkMode(options = {}) {
|
|
290
|
-
const {
|
|
291
|
-
selector = "html",
|
|
292
|
-
attribute = "class",
|
|
293
|
-
initialValue,
|
|
294
|
-
storageKey = "reactuses-color-scheme",
|
|
295
|
-
storage = () => isBrowser ? localStorage : void 0
|
|
296
|
-
} = options;
|
|
297
|
-
const prefersDarkMode = usePreferredDark(false);
|
|
298
|
-
const value = initialValue ? initialValue : prefersDarkMode ? "dark" : "light";
|
|
299
|
-
const [dark, setDark] = useStorage(storageKey, value, storage, {
|
|
300
|
-
ignoreDefaults: false
|
|
301
|
-
});
|
|
302
|
-
const wrappedSetDark = useCallback(
|
|
303
|
-
(latestDark) => {
|
|
304
|
-
const element = window == null ? void 0 : window.document.querySelector(selector);
|
|
305
|
-
if (!element) {
|
|
306
|
-
return;
|
|
307
|
-
}
|
|
308
|
-
if (attribute === "class") {
|
|
309
|
-
latestDark && element.classList.add(latestDark);
|
|
310
|
-
dark && element.classList.remove(dark);
|
|
311
|
-
} else {
|
|
312
|
-
latestDark && element.setAttribute(attribute, latestDark);
|
|
313
|
-
dark && element.removeAttribute(attribute);
|
|
314
|
-
}
|
|
315
|
-
setDark(latestDark);
|
|
316
|
-
},
|
|
317
|
-
[attribute, dark, selector, setDark]
|
|
318
|
-
);
|
|
319
|
-
return [dark, wrappedSetDark];
|
|
320
|
-
}
|
|
321
|
-
|
|
322
339
|
function useMount(fn) {
|
|
323
340
|
if (isDev) {
|
|
324
341
|
if (!isFunction(fn)) {
|
|
@@ -542,7 +559,7 @@ function useLatestElement(target, defaultElement) {
|
|
|
542
559
|
const ref = useRef(getTargetElement(target, defaultElement));
|
|
543
560
|
useEffect(() => {
|
|
544
561
|
ref.current = getTargetElement(target, defaultElement);
|
|
545
|
-
}
|
|
562
|
+
});
|
|
546
563
|
return ref;
|
|
547
564
|
}
|
|
548
565
|
|
|
@@ -2387,21 +2404,21 @@ function useClipBorad() {
|
|
|
2387
2404
|
|
|
2388
2405
|
function useClickOutSide(target, handler) {
|
|
2389
2406
|
const savedHandler = useLatest(handler);
|
|
2407
|
+
const element = useLatestElement(target);
|
|
2390
2408
|
const listener = (event) => {
|
|
2391
|
-
|
|
2392
|
-
if (!element) {
|
|
2409
|
+
if (!element.current) {
|
|
2393
2410
|
return;
|
|
2394
2411
|
}
|
|
2395
2412
|
const elements = event.composedPath();
|
|
2396
|
-
if (element === event.target || elements.includes(element)) {
|
|
2413
|
+
if (element.current === event.target || elements.includes(element.current)) {
|
|
2397
2414
|
return;
|
|
2398
2415
|
}
|
|
2399
2416
|
savedHandler.current(event);
|
|
2400
2417
|
};
|
|
2401
|
-
useEventListener("mousedown", listener,
|
|
2418
|
+
useEventListener("mousedown", listener, defaultWindow, {
|
|
2402
2419
|
passive: true
|
|
2403
2420
|
});
|
|
2404
|
-
useEventListener("touchstart", listener,
|
|
2421
|
+
useEventListener("touchstart", listener, defaultWindow, {
|
|
2405
2422
|
passive: true
|
|
2406
2423
|
});
|
|
2407
2424
|
}
|
|
@@ -2759,4 +2776,38 @@ function useAsyncEffect(effect, cleanup = noop, deps) {
|
|
|
2759
2776
|
}, deps);
|
|
2760
2777
|
}
|
|
2761
2778
|
|
|
2762
|
-
|
|
2779
|
+
const padZero = (time) => {
|
|
2780
|
+
return `${time}`.length < 2 ? `0${time}` : `${time}`;
|
|
2781
|
+
};
|
|
2782
|
+
const getHMSTime = (timeDiff) => {
|
|
2783
|
+
if (timeDiff <= 0) {
|
|
2784
|
+
return ["00", "00", "00"];
|
|
2785
|
+
}
|
|
2786
|
+
if (timeDiff > 100 * 3600) {
|
|
2787
|
+
return ["99", "59", "59"];
|
|
2788
|
+
}
|
|
2789
|
+
const hour = Math.floor(timeDiff / 3600);
|
|
2790
|
+
const minute = Math.floor((timeDiff - hour * 3600) / 60);
|
|
2791
|
+
const second = timeDiff - hour * 3600 - minute * 60;
|
|
2792
|
+
return [padZero(hour), padZero(minute), padZero(second)];
|
|
2793
|
+
};
|
|
2794
|
+
const useCountDown = (time, format = getHMSTime, callback) => {
|
|
2795
|
+
const [remainTime, setRemainTime] = useState(time);
|
|
2796
|
+
const [delay, setDelay] = useState(1e3);
|
|
2797
|
+
useInterval(() => {
|
|
2798
|
+
if (remainTime <= 0) {
|
|
2799
|
+
setDelay(null);
|
|
2800
|
+
return;
|
|
2801
|
+
}
|
|
2802
|
+
setRemainTime(remainTime - 1);
|
|
2803
|
+
}, delay);
|
|
2804
|
+
useEffect(() => {
|
|
2805
|
+
if (time > 0 && remainTime <= 0) {
|
|
2806
|
+
callback && callback();
|
|
2807
|
+
}
|
|
2808
|
+
}, [callback, remainTime, time]);
|
|
2809
|
+
const [hour, minute, secoud] = format(remainTime);
|
|
2810
|
+
return [hour, minute, secoud];
|
|
2811
|
+
};
|
|
2812
|
+
|
|
2813
|
+
export { getHMSTime, useActiveElement, useAsyncEffect, useClickOutSide as useClickOutside, useClipBorad as useClipboard, useControlled, useCountDown, useCounter, useCustomCompareEffect, useCycleList, useDarkMode, useDebounce, useDebounceFn, useDeepCompareEffect, useDocumentVisibility, useDraggable, useDropZone, useElementBounding, useElementSize, useElementVisibility, useEvent, useEventEmitter, useEventListener, useFavicon, useFileDialog, useFirstMountState, useFocus, useFps$1 as useFps, useFullscreen, useGeolocation, useIdle, useInfiniteScroll, useIntersectionObserver, useInterval, useIsomorphicLayoutEffect, useKeyModifier, useLatest, useLocalStorage, useLongPress, useMediaDevices$1 as useMediaDevices, useMediaQuery, useMount, useMountedState, useMouse, useMousePressed, useMutationObserver, useNetwork, useObjectUrl, useOnceEffect, useOnceLayoutEffect, useOnline, useOrientation, usePageLeave, usePermission, usePreferredColorScheme, usePreferredContrast, usePreferredDark, usePrevious, useRafFn, useRafState, useReducedMotion, useResizeObserver, useScriptTag, useScroll, useScrollIntoView, useScrollLock, useSessionStorage, useSticky, useTextDirection, useThrottle, useThrottleFn, useTimeout, useTimeoutFn, useTitle, useToggle, useUnmount, useUpdate, useUpdateEffect, useUpdateLayoutEffect, useVirtualList, useWindowScroll, useWindowSize, useWindowsFocus };
|