react-simplikit 0.0.50 → 0.0.52
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/components/ImpressionArea/ImpressionArea.cjs +57 -0
- package/{esm/components/ImpressionArea/index.d.ts → dist/components/ImpressionArea/ImpressionArea.d.cts} +9 -8
- package/dist/components/ImpressionArea/ImpressionArea.d.mts +48 -0
- package/dist/components/ImpressionArea/ImpressionArea.mjs +57 -0
- package/dist/components/ImpressionArea/index.d.cts +2 -46
- package/dist/components/ImpressionArea/index.d.mts +3 -0
- package/dist/components/Separated/Separated.cjs +38 -0
- package/{esm/components/Separated/index.d.ts → dist/components/Separated/Separated.d.cts} +7 -7
- package/dist/components/Separated/Separated.d.mts +38 -0
- package/dist/components/Separated/Separated.mjs +38 -0
- package/dist/components/Separated/index.d.cts +2 -37
- package/dist/components/Separated/index.d.mts +3 -0
- package/dist/components/SwitchCase/SwitchCase.cjs +40 -0
- package/{esm/components/SwitchCase/index.d.ts → dist/components/SwitchCase/SwitchCase.d.cts} +7 -8
- package/dist/components/SwitchCase/SwitchCase.d.mts +45 -0
- package/dist/components/SwitchCase/SwitchCase.mjs +40 -0
- package/dist/components/SwitchCase/index.d.cts +2 -45
- package/dist/components/SwitchCase/index.d.mts +3 -0
- package/dist/hooks/useAsyncEffect/index.d.cts +2 -24
- package/dist/hooks/useAsyncEffect/index.d.mts +3 -0
- package/dist/hooks/useAsyncEffect/useAsyncEffect.cjs +39 -0
- package/{esm/hooks/useAsyncEffect/index.d.ts → dist/hooks/useAsyncEffect/useAsyncEffect.d.cts} +4 -3
- package/dist/hooks/useAsyncEffect/useAsyncEffect.d.mts +26 -0
- package/dist/hooks/useAsyncEffect/useAsyncEffect.mjs +39 -0
- package/dist/hooks/useBooleanState/useBooleanState.cjs +36 -0
- package/dist/hooks/useBooleanState/{index.d.cts → useBooleanState.d.cts} +4 -2
- package/{esm/hooks/useBooleanState/index.d.ts → dist/hooks/useBooleanState/useBooleanState.d.mts} +4 -2
- package/dist/hooks/useBooleanState/useBooleanState.mjs +36 -0
- package/dist/hooks/useCallbackOncePerRender/index.d.cts +2 -39
- package/dist/hooks/useCallbackOncePerRender/index.d.mts +3 -0
- package/dist/hooks/useCallbackOncePerRender/useCallbackOncePerRender.cjs +52 -0
- package/{esm/hooks/useCallbackOncePerRender/index.d.ts → dist/hooks/useCallbackOncePerRender/useCallbackOncePerRender.d.cts} +4 -3
- package/dist/hooks/useCallbackOncePerRender/useCallbackOncePerRender.d.mts +41 -0
- package/dist/hooks/useCallbackOncePerRender/useCallbackOncePerRender.mjs +52 -0
- package/dist/hooks/useConditionalEffect/index.d.cts +2 -42
- package/dist/hooks/useConditionalEffect/index.d.mts +3 -0
- package/dist/hooks/useConditionalEffect/useConditionalEffect.cjs +57 -0
- package/{esm/hooks/useConditionalEffect/index.d.ts → dist/hooks/useConditionalEffect/useConditionalEffect.d.cts} +4 -3
- package/dist/hooks/useConditionalEffect/useConditionalEffect.d.mts +44 -0
- package/dist/hooks/useConditionalEffect/useConditionalEffect.mjs +57 -0
- package/dist/hooks/useControlledState/index.d.cts +2 -50
- package/dist/hooks/useControlledState/index.d.mts +3 -0
- package/dist/hooks/useControlledState/useControlledState.cjs +60 -0
- package/{esm/hooks/useControlledState/index.d.ts → dist/hooks/useControlledState/useControlledState.d.cts} +11 -10
- package/dist/hooks/useControlledState/useControlledState.d.mts +52 -0
- package/dist/hooks/useControlledState/useControlledState.mjs +60 -0
- package/dist/hooks/useCounter/useCounter.cjs +75 -0
- package/{esm/hooks/useCounter/index.d.ts → dist/hooks/useCounter/useCounter.d.cts} +12 -10
- package/dist/hooks/useCounter/{index.d.cts → useCounter.d.mts} +12 -10
- package/dist/hooks/useCounter/useCounter.mjs +75 -0
- package/dist/hooks/useDebounce/debounce.cjs +49 -0
- package/dist/hooks/useDebounce/debounce.d.cts +8 -0
- package/dist/hooks/useDebounce/debounce.d.mts +8 -0
- package/dist/hooks/useDebounce/debounce.mjs +49 -0
- package/dist/hooks/useDebounce/useDebounce.cjs +66 -0
- package/{esm/hooks/useDebounce/index.d.ts → dist/hooks/useDebounce/useDebounce.d.cts} +6 -8
- package/dist/hooks/useDebounce/{index.d.cts → useDebounce.d.mts} +6 -8
- package/dist/hooks/useDebounce/useDebounce.mjs +66 -0
- package/dist/hooks/useDebouncedCallback/useDebouncedCallback.cjs +62 -0
- package/{esm/hooks/useDebouncedCallback/index.d.ts → dist/hooks/useDebouncedCallback/useDebouncedCallback.d.cts} +9 -7
- package/dist/hooks/useDebouncedCallback/{index.d.cts → useDebouncedCallback.d.mts} +9 -7
- package/dist/hooks/useDebouncedCallback/useDebouncedCallback.mjs +62 -0
- package/dist/hooks/useDoubleClick/index.d.cts +2 -45
- package/dist/hooks/useDoubleClick/index.d.mts +3 -0
- package/dist/hooks/useDoubleClick/useDoubleClick.cjs +64 -0
- package/{esm/hooks/useDoubleClick/index.d.ts → dist/hooks/useDoubleClick/useDoubleClick.d.cts} +8 -7
- package/dist/hooks/useDoubleClick/useDoubleClick.d.mts +47 -0
- package/dist/hooks/useDoubleClick/useDoubleClick.mjs +64 -0
- package/dist/hooks/useGeolocation/useGeolocation.cjs +210 -0
- package/{esm/hooks/useGeolocation/index.d.ts → dist/hooks/useGeolocation/useGeolocation.d.cts} +26 -24
- package/dist/hooks/useGeolocation/{index.d.cts → useGeolocation.d.mts} +26 -24
- package/dist/hooks/useGeolocation/useGeolocation.mjs +209 -0
- package/dist/hooks/useImpressionRef/useImpressionRef.cjs +67 -0
- package/{esm/hooks/useImpressionRef/index.d.ts → dist/hooks/useImpressionRef/useImpressionRef.d.cts} +10 -8
- package/dist/hooks/useImpressionRef/{index.d.cts → useImpressionRef.d.mts} +10 -8
- package/dist/hooks/useImpressionRef/useImpressionRef.mjs +67 -0
- package/dist/hooks/useInputState/index.d.cts +2 -22
- package/dist/hooks/useInputState/index.d.mts +3 -0
- package/dist/hooks/useInputState/useInputState.cjs +32 -0
- package/{esm/hooks/useInputState/index.d.ts → dist/hooks/useInputState/useInputState.d.cts} +4 -3
- package/dist/hooks/useInputState/useInputState.d.mts +24 -0
- package/dist/hooks/useInputState/useInputState.mjs +32 -0
- package/dist/hooks/useIntersectionObserver/useIntersectionObserver.cjs +58 -0
- package/dist/hooks/useIntersectionObserver/{index.d.cts → useIntersectionObserver.d.cts} +4 -2
- package/{esm/hooks/useIntersectionObserver/index.d.ts → dist/hooks/useIntersectionObserver/useIntersectionObserver.d.mts} +4 -2
- package/dist/hooks/useIntersectionObserver/useIntersectionObserver.mjs +58 -0
- package/dist/hooks/useInterval/useInterval.cjs +65 -0
- package/dist/hooks/useInterval/{index.d.cts → useInterval.d.cts} +7 -5
- package/{esm/hooks/useInterval/index.d.ts → dist/hooks/useInterval/useInterval.d.mts} +7 -5
- package/dist/hooks/useInterval/useInterval.mjs +65 -0
- package/dist/hooks/useIsClient/useIsClient.cjs +49 -0
- package/dist/hooks/useIsClient/{index.d.cts → useIsClient.d.cts} +4 -2
- package/{esm/hooks/useIsClient/index.d.ts → dist/hooks/useIsClient/useIsClient.d.mts} +4 -2
- package/dist/hooks/useIsClient/useIsClient.mjs +49 -0
- package/dist/hooks/useIsomorphicLayoutEffect/index.d.cts +2 -24
- package/dist/hooks/useIsomorphicLayoutEffect/index.d.mts +3 -0
- package/dist/hooks/useIsomorphicLayoutEffect/useIsomorphicLayoutEffect.cjs +25 -0
- package/{esm/hooks/useIsomorphicLayoutEffect/index.d.ts → dist/hooks/useIsomorphicLayoutEffect/useIsomorphicLayoutEffect.d.cts} +4 -3
- package/dist/hooks/useIsomorphicLayoutEffect/useIsomorphicLayoutEffect.d.mts +26 -0
- package/dist/hooks/useIsomorphicLayoutEffect/useIsomorphicLayoutEffect.mjs +25 -0
- package/dist/hooks/useList/useList.cjs +94 -0
- package/{esm/hooks/useList/index.d.ts → dist/hooks/useList/useList.d.cts} +10 -8
- package/dist/hooks/useList/{index.d.cts → useList.d.mts} +10 -8
- package/dist/hooks/useList/useList.mjs +94 -0
- package/dist/hooks/useLoading/useLoading.cjs +61 -0
- package/dist/hooks/useLoading/{index.d.cts → useLoading.d.cts} +4 -2
- package/{esm/hooks/useLoading/index.d.ts → dist/hooks/useLoading/useLoading.d.mts} +4 -2
- package/dist/hooks/useLoading/useLoading.mjs +61 -0
- package/dist/hooks/useLongPress/index.d.cts +2 -73
- package/dist/hooks/useLongPress/index.d.mts +3 -0
- package/dist/hooks/useLongPress/useLongPress.cjs +133 -0
- package/{esm/hooks/useLongPress/index.d.ts → dist/hooks/useLongPress/useLongPress.d.cts} +18 -17
- package/dist/hooks/useLongPress/useLongPress.d.mts +75 -0
- package/dist/hooks/useLongPress/useLongPress.mjs +133 -0
- package/dist/hooks/useMap/useMap.cjs +64 -0
- package/dist/hooks/useMap/{index.d.cts → useMap.d.cts} +12 -10
- package/{esm/hooks/useMap/index.d.ts → dist/hooks/useMap/useMap.d.mts} +12 -10
- package/dist/hooks/useMap/useMap.mjs +64 -0
- package/dist/hooks/useOutsideClickEffect/useOutsideClickEffect.cjs +51 -0
- package/{esm/hooks/useOutsideClickEffect/index.d.ts → dist/hooks/useOutsideClickEffect/useOutsideClickEffect.d.cts} +4 -2
- package/dist/hooks/useOutsideClickEffect/{index.d.cts → useOutsideClickEffect.d.mts} +4 -2
- package/dist/hooks/useOutsideClickEffect/useOutsideClickEffect.mjs +51 -0
- package/dist/hooks/usePreservedCallback/usePreservedCallback.cjs +41 -0
- package/dist/hooks/usePreservedCallback/{index.d.cts → usePreservedCallback.d.cts} +4 -2
- package/{esm/hooks/usePreservedCallback/index.d.ts → dist/hooks/usePreservedCallback/usePreservedCallback.d.mts} +4 -2
- package/dist/hooks/usePreservedCallback/usePreservedCallback.mjs +41 -0
- package/dist/hooks/usePreservedReference/usePreservedReference.cjs +55 -0
- package/dist/hooks/usePreservedReference/{index.d.cts → usePreservedReference.d.cts} +4 -2
- package/{esm/hooks/usePreservedReference/index.d.ts → dist/hooks/usePreservedReference/usePreservedReference.d.mts} +4 -2
- package/dist/hooks/usePreservedReference/usePreservedReference.mjs +55 -0
- package/dist/hooks/usePrevious/usePrevious.cjs +38 -0
- package/{esm/hooks/usePrevious/index.d.ts → dist/hooks/usePrevious/usePrevious.d.cts} +4 -2
- package/dist/hooks/usePrevious/{index.d.cts → usePrevious.d.mts} +4 -2
- package/dist/hooks/usePrevious/usePrevious.mjs +38 -0
- package/dist/hooks/useRefEffect/index.d.cts +2 -30
- package/dist/hooks/useRefEffect/index.d.mts +3 -0
- package/dist/hooks/useRefEffect/useRefEffect.cjs +42 -0
- package/{esm/hooks/useRefEffect/index.d.ts → dist/hooks/useRefEffect/useRefEffect.d.cts} +4 -3
- package/dist/hooks/useRefEffect/useRefEffect.d.mts +32 -0
- package/dist/hooks/useRefEffect/useRefEffect.mjs +42 -0
- package/dist/hooks/useSet/useSet.cjs +79 -0
- package/dist/hooks/useSet/{index.d.cts → useSet.d.cts} +9 -7
- package/{esm/hooks/useSet/index.d.ts → dist/hooks/useSet/useSet.d.mts} +9 -7
- package/dist/hooks/useSet/useSet.mjs +79 -0
- package/dist/hooks/useStorageState/index.d.cts +2 -60
- package/dist/hooks/useStorageState/index.d.mts +3 -0
- package/dist/hooks/useStorageState/storage.cjs +85 -0
- package/dist/hooks/useStorageState/storage.d.cts +10 -0
- package/dist/hooks/useStorageState/storage.d.mts +10 -0
- package/dist/hooks/useStorageState/storage.mjs +80 -0
- package/dist/hooks/useStorageState/useStorageState.cjs +81 -0
- package/{esm/hooks/useStorageState/index.d.ts → dist/hooks/useStorageState/useStorageState.d.cts} +10 -15
- package/dist/hooks/useStorageState/useStorageState.d.mts +56 -0
- package/dist/hooks/useStorageState/useStorageState.mjs +81 -0
- package/dist/hooks/useThrottle/throttle.cjs +19 -0
- package/dist/hooks/useThrottle/throttle.d.cts +19 -0
- package/dist/hooks/useThrottle/throttle.d.mts +19 -0
- package/dist/hooks/useThrottle/throttle.mjs +19 -0
- package/dist/hooks/useThrottle/useThrottle.cjs +49 -0
- package/dist/hooks/useThrottle/{index.d.cts → useThrottle.d.cts} +6 -19
- package/{esm/hooks/useThrottle/index.d.ts → dist/hooks/useThrottle/useThrottle.d.mts} +6 -19
- package/dist/hooks/useThrottle/useThrottle.mjs +49 -0
- package/dist/hooks/useThrottledCallback/useThrottledCallback.cjs +57 -0
- package/{esm/hooks/useThrottledCallback/index.d.ts → dist/hooks/useThrottledCallback/useThrottledCallback.d.cts} +8 -6
- package/dist/hooks/useThrottledCallback/{index.d.cts → useThrottledCallback.d.mts} +8 -6
- package/dist/hooks/useThrottledCallback/useThrottledCallback.mjs +57 -0
- package/dist/hooks/useTimeout/useTimeout.cjs +40 -0
- package/dist/hooks/useTimeout/{index.d.cts → useTimeout.d.cts} +4 -2
- package/{esm/hooks/useTimeout/index.d.ts → dist/hooks/useTimeout/useTimeout.d.mts} +4 -2
- package/dist/hooks/useTimeout/useTimeout.mjs +40 -0
- package/dist/hooks/useToggle/useToggle.cjs +34 -0
- package/dist/hooks/useToggle/{index.d.cts → useToggle.d.cts} +4 -4
- package/{esm/hooks/useToggle/index.d.ts → dist/hooks/useToggle/useToggle.d.mts} +4 -4
- package/dist/hooks/useToggle/useToggle.mjs +34 -0
- package/dist/hooks/useVisibilityEvent/useVisibilityEvent.cjs +42 -0
- package/{esm/hooks/useVisibilityEvent/index.d.ts → dist/hooks/useVisibilityEvent/useVisibilityEvent.d.cts} +5 -3
- package/dist/hooks/useVisibilityEvent/{index.d.cts → useVisibilityEvent.d.mts} +5 -3
- package/dist/hooks/useVisibilityEvent/useVisibilityEvent.mjs +42 -0
- package/dist/index.cjs +77 -1382
- package/dist/index.d.cts +56 -40
- package/dist/index.d.mts +56 -0
- package/dist/index.mjs +40 -0
- package/dist/utils/buildContext/buildContext.cjs +50 -0
- package/{esm/utils/buildContext/index.d.ts → dist/utils/buildContext/buildContext.d.cts} +7 -7
- package/dist/utils/buildContext/buildContext.d.mts +38 -0
- package/dist/utils/buildContext/buildContext.mjs +50 -0
- package/dist/utils/buildContext/index.d.cts +2 -37
- package/dist/utils/buildContext/index.d.mts +3 -0
- package/dist/utils/mergeProps/index.d.cts +2 -25
- package/dist/utils/mergeProps/index.d.mts +3 -0
- package/dist/utils/mergeProps/mergeProps.cjs +53 -0
- package/{esm/utils/mergeProps/index.d.ts → dist/utils/mergeProps/mergeProps.d.cts} +7 -8
- package/dist/utils/mergeProps/mergeProps.d.mts +25 -0
- package/dist/utils/mergeProps/mergeProps.mjs +53 -0
- package/dist/utils/mergeRefs/index.d.cts +2 -38
- package/dist/utils/mergeRefs/index.d.mts +3 -0
- package/dist/utils/mergeRefs/mergeRefs.cjs +50 -0
- package/{esm/utils/mergeRefs/index.d.ts → dist/utils/mergeRefs/mergeRefs.d.cts} +4 -3
- package/dist/utils/mergeRefs/mergeRefs.d.mts +40 -0
- package/dist/utils/mergeRefs/mergeRefs.mjs +50 -0
- package/package.json +9 -11
- package/dist/components/ImpressionArea/index.cjs +0 -295
- package/dist/components/Separated/index.cjs +0 -41
- package/dist/components/SwitchCase/index.cjs +0 -36
- package/dist/hooks/useAsyncEffect/index.cjs +0 -44
- package/dist/hooks/useBooleanState/index.cjs +0 -46
- package/dist/hooks/useCallbackOncePerRender/index.cjs +0 -63
- package/dist/hooks/useConditionalEffect/index.cjs +0 -51
- package/dist/hooks/useControlledState/index.cjs +0 -57
- package/dist/hooks/useCounter/index.cjs +0 -70
- package/dist/hooks/useDebounce/index.cjs +0 -130
- package/dist/hooks/useDebouncedCallback/index.cjs +0 -148
- package/dist/hooks/useDoubleClick/index.cjs +0 -79
- package/dist/hooks/useGeolocation/index.cjs +0 -154
- package/dist/hooks/useImpressionRef/index.cjs +0 -258
- package/dist/hooks/useInputState/index.cjs +0 -46
- package/dist/hooks/useIntersectionObserver/index.cjs +0 -95
- package/dist/hooks/useInterval/index.cjs +0 -74
- package/dist/hooks/useIsClient/index.cjs +0 -40
- package/dist/hooks/useIsomorphicLayoutEffect/index.cjs +0 -35
- package/dist/hooks/useList/index.cjs +0 -104
- package/dist/hooks/useLoading/index.cjs +0 -65
- package/dist/hooks/useLongPress/index.cjs +0 -127
- package/dist/hooks/useMap/index.cjs +0 -78
- package/dist/hooks/useOutsideClickEffect/index.cjs +0 -74
- package/dist/hooks/usePreservedCallback/index.cjs +0 -45
- package/dist/hooks/usePreservedReference/index.cjs +0 -45
- package/dist/hooks/usePrevious/index.cjs +0 -48
- package/dist/hooks/useRefEffect/index.cjs +0 -72
- package/dist/hooks/useSet/index.cjs +0 -105
- package/dist/hooks/useStorageState/index.cjs +0 -196
- package/dist/hooks/useThrottle/index.cjs +0 -151
- package/dist/hooks/useThrottledCallback/index.cjs +0 -172
- package/dist/hooks/useTimeout/index.cjs +0 -57
- package/dist/hooks/useToggle/index.cjs +0 -37
- package/dist/hooks/useVisibilityEvent/index.cjs +0 -47
- package/dist/utils/buildContext/index.cjs +0 -56
- package/dist/utils/mergeProps/index.cjs +0 -71
- package/dist/utils/mergeRefs/index.cjs +0 -46
- package/esm/components/ImpressionArea/index.js +0 -269
- package/esm/components/Separated/index.js +0 -15
- package/esm/components/SwitchCase/index.js +0 -10
- package/esm/hooks/useAsyncEffect/index.js +0 -18
- package/esm/hooks/useBooleanState/index.js +0 -20
- package/esm/hooks/useCallbackOncePerRender/index.js +0 -37
- package/esm/hooks/useConditionalEffect/index.js +0 -25
- package/esm/hooks/useControlledState/index.js +0 -31
- package/esm/hooks/useCounter/index.js +0 -44
- package/esm/hooks/useDebounce/index.js +0 -104
- package/esm/hooks/useDebouncedCallback/index.js +0 -122
- package/esm/hooks/useDoubleClick/index.js +0 -53
- package/esm/hooks/useGeolocation/index.js +0 -128
- package/esm/hooks/useImpressionRef/index.js +0 -232
- package/esm/hooks/useInputState/index.js +0 -20
- package/esm/hooks/useIntersectionObserver/index.js +0 -69
- package/esm/hooks/useInterval/index.js +0 -48
- package/esm/hooks/useIsClient/index.js +0 -14
- package/esm/hooks/useIsomorphicLayoutEffect/index.js +0 -9
- package/esm/hooks/useList/index.js +0 -78
- package/esm/hooks/useLoading/index.js +0 -39
- package/esm/hooks/useLongPress/index.js +0 -101
- package/esm/hooks/useMap/index.js +0 -52
- package/esm/hooks/useOutsideClickEffect/index.js +0 -48
- package/esm/hooks/usePreservedCallback/index.js +0 -19
- package/esm/hooks/usePreservedReference/index.js +0 -19
- package/esm/hooks/usePrevious/index.js +0 -22
- package/esm/hooks/useRefEffect/index.js +0 -46
- package/esm/hooks/useSet/index.js +0 -79
- package/esm/hooks/useStorageState/index.js +0 -170
- package/esm/hooks/useThrottle/index.js +0 -125
- package/esm/hooks/useThrottledCallback/index.js +0 -146
- package/esm/hooks/useTimeout/index.js +0 -31
- package/esm/hooks/useToggle/index.js +0 -11
- package/esm/hooks/useVisibilityEvent/index.js +0 -21
- package/esm/index.d.ts +0 -40
- package/esm/index.js +0 -1320
- package/esm/utils/buildContext/index.js +0 -30
- package/esm/utils/mergeProps/index.js +0 -45
- package/esm/utils/mergeRefs/index.js +0 -20
|
@@ -0,0 +1,66 @@
|
|
|
1
|
+
"use client";
|
|
2
|
+
const require_debounce = require("./debounce.cjs");
|
|
3
|
+
const require_usePreservedCallback = require("../usePreservedCallback/usePreservedCallback.cjs");
|
|
4
|
+
let react = require("react");
|
|
5
|
+
//#region src/hooks/useDebounce/useDebounce.ts
|
|
6
|
+
/**
|
|
7
|
+
* @description
|
|
8
|
+
* `useDebounce` is a React hook that returns a debounced version of the provided callback function.
|
|
9
|
+
* It helps optimize event handling by delaying function execution and grouping multiple calls into one.
|
|
10
|
+
*
|
|
11
|
+
* @template {(...args: any[]) => unknown} F - The type of the callback function.
|
|
12
|
+
* @param {F} callback - The function to debounce.
|
|
13
|
+
* @param {number} wait - The number of milliseconds to delay the function execution.
|
|
14
|
+
* @param {DebounceOptions} [options] - Configuration options for debounce behavior.
|
|
15
|
+
* @param {boolean} [options.leading=false] - If `true`, the function is called at the start of the sequence.
|
|
16
|
+
* @param {boolean} [options.trailing=true] - If `true`, the function is called at the end of the sequence.
|
|
17
|
+
*
|
|
18
|
+
* @returns {F & { cancel: () => void }} A debounced function that delays invoking the callback.
|
|
19
|
+
* It also includes a `cancel` method to cancel any pending debounced execution.
|
|
20
|
+
*
|
|
21
|
+
* @example
|
|
22
|
+
* function SearchInput() {
|
|
23
|
+
* const [query, setQuery] = useState('');
|
|
24
|
+
*
|
|
25
|
+
* const debouncedSearch = useDebounce((value: string) => {
|
|
26
|
+
* // Actual API call
|
|
27
|
+
* searchAPI(value);
|
|
28
|
+
* }, 300);
|
|
29
|
+
*
|
|
30
|
+
* return (
|
|
31
|
+
* <input
|
|
32
|
+
* value={query}
|
|
33
|
+
* onChange={e => {
|
|
34
|
+
* setQuery(e.target.value);
|
|
35
|
+
* debouncedSearch(e.target.value);
|
|
36
|
+
* }}
|
|
37
|
+
* placeholder="Enter search term"
|
|
38
|
+
* />
|
|
39
|
+
* );
|
|
40
|
+
* }
|
|
41
|
+
*/
|
|
42
|
+
function useDebounce(callback, wait, options = {}) {
|
|
43
|
+
const preservedCallback = require_usePreservedCallback.usePreservedCallback(callback);
|
|
44
|
+
const { leading = false, trailing = true } = options;
|
|
45
|
+
const edges = (0, react.useMemo)(() => {
|
|
46
|
+
const _edges = [];
|
|
47
|
+
if (leading) _edges.push("leading");
|
|
48
|
+
if (trailing) _edges.push("trailing");
|
|
49
|
+
return _edges;
|
|
50
|
+
}, [leading, trailing]);
|
|
51
|
+
const debounced = (0, react.useMemo)(() => {
|
|
52
|
+
return require_debounce.debounce(preservedCallback, wait, { edges });
|
|
53
|
+
}, [
|
|
54
|
+
preservedCallback,
|
|
55
|
+
wait,
|
|
56
|
+
edges
|
|
57
|
+
]);
|
|
58
|
+
(0, react.useEffect)(function cancelDebouncedOnUnmount() {
|
|
59
|
+
return () => {
|
|
60
|
+
debounced.cancel();
|
|
61
|
+
};
|
|
62
|
+
}, [debounced]);
|
|
63
|
+
return debounced;
|
|
64
|
+
}
|
|
65
|
+
//#endregion
|
|
66
|
+
exports.useDebounce = useDebounce;
|
|
@@ -1,11 +1,9 @@
|
|
|
1
|
-
type DebouncedFunction<F extends (...args: any[]) => void> = {
|
|
2
|
-
(...args: Parameters<F>): void;
|
|
3
|
-
cancel: () => void;
|
|
4
|
-
};
|
|
5
1
|
|
|
2
|
+
import { DebouncedFunction } from "./debounce.cjs";
|
|
3
|
+
//#region src/hooks/useDebounce/useDebounce.d.ts
|
|
6
4
|
type DebounceOptions = {
|
|
7
|
-
|
|
8
|
-
|
|
5
|
+
leading?: boolean;
|
|
6
|
+
trailing?: boolean;
|
|
9
7
|
};
|
|
10
8
|
/**
|
|
11
9
|
* @description
|
|
@@ -44,5 +42,5 @@ type DebounceOptions = {
|
|
|
44
42
|
* }
|
|
45
43
|
*/
|
|
46
44
|
declare function useDebounce<F extends (...args: any[]) => unknown>(callback: F, wait: number, options?: DebounceOptions): DebouncedFunction<F>;
|
|
47
|
-
|
|
48
|
-
export { useDebounce };
|
|
45
|
+
//#endregion
|
|
46
|
+
export { useDebounce };
|
|
@@ -1,11 +1,9 @@
|
|
|
1
|
-
type DebouncedFunction<F extends (...args: any[]) => void> = {
|
|
2
|
-
(...args: Parameters<F>): void;
|
|
3
|
-
cancel: () => void;
|
|
4
|
-
};
|
|
5
1
|
|
|
2
|
+
import { DebouncedFunction } from "./debounce.mjs";
|
|
3
|
+
//#region src/hooks/useDebounce/useDebounce.d.ts
|
|
6
4
|
type DebounceOptions = {
|
|
7
|
-
|
|
8
|
-
|
|
5
|
+
leading?: boolean;
|
|
6
|
+
trailing?: boolean;
|
|
9
7
|
};
|
|
10
8
|
/**
|
|
11
9
|
* @description
|
|
@@ -44,5 +42,5 @@ type DebounceOptions = {
|
|
|
44
42
|
* }
|
|
45
43
|
*/
|
|
46
44
|
declare function useDebounce<F extends (...args: any[]) => unknown>(callback: F, wait: number, options?: DebounceOptions): DebouncedFunction<F>;
|
|
47
|
-
|
|
48
|
-
export { useDebounce };
|
|
45
|
+
//#endregion
|
|
46
|
+
export { useDebounce };
|
|
@@ -0,0 +1,66 @@
|
|
|
1
|
+
"use client";
|
|
2
|
+
import { debounce } from "./debounce.mjs";
|
|
3
|
+
import { usePreservedCallback } from "../usePreservedCallback/usePreservedCallback.mjs";
|
|
4
|
+
import { useEffect, useMemo } from "react";
|
|
5
|
+
//#region src/hooks/useDebounce/useDebounce.ts
|
|
6
|
+
/**
|
|
7
|
+
* @description
|
|
8
|
+
* `useDebounce` is a React hook that returns a debounced version of the provided callback function.
|
|
9
|
+
* It helps optimize event handling by delaying function execution and grouping multiple calls into one.
|
|
10
|
+
*
|
|
11
|
+
* @template {(...args: any[]) => unknown} F - The type of the callback function.
|
|
12
|
+
* @param {F} callback - The function to debounce.
|
|
13
|
+
* @param {number} wait - The number of milliseconds to delay the function execution.
|
|
14
|
+
* @param {DebounceOptions} [options] - Configuration options for debounce behavior.
|
|
15
|
+
* @param {boolean} [options.leading=false] - If `true`, the function is called at the start of the sequence.
|
|
16
|
+
* @param {boolean} [options.trailing=true] - If `true`, the function is called at the end of the sequence.
|
|
17
|
+
*
|
|
18
|
+
* @returns {F & { cancel: () => void }} A debounced function that delays invoking the callback.
|
|
19
|
+
* It also includes a `cancel` method to cancel any pending debounced execution.
|
|
20
|
+
*
|
|
21
|
+
* @example
|
|
22
|
+
* function SearchInput() {
|
|
23
|
+
* const [query, setQuery] = useState('');
|
|
24
|
+
*
|
|
25
|
+
* const debouncedSearch = useDebounce((value: string) => {
|
|
26
|
+
* // Actual API call
|
|
27
|
+
* searchAPI(value);
|
|
28
|
+
* }, 300);
|
|
29
|
+
*
|
|
30
|
+
* return (
|
|
31
|
+
* <input
|
|
32
|
+
* value={query}
|
|
33
|
+
* onChange={e => {
|
|
34
|
+
* setQuery(e.target.value);
|
|
35
|
+
* debouncedSearch(e.target.value);
|
|
36
|
+
* }}
|
|
37
|
+
* placeholder="Enter search term"
|
|
38
|
+
* />
|
|
39
|
+
* );
|
|
40
|
+
* }
|
|
41
|
+
*/
|
|
42
|
+
function useDebounce(callback, wait, options = {}) {
|
|
43
|
+
const preservedCallback = usePreservedCallback(callback);
|
|
44
|
+
const { leading = false, trailing = true } = options;
|
|
45
|
+
const edges = useMemo(() => {
|
|
46
|
+
const _edges = [];
|
|
47
|
+
if (leading) _edges.push("leading");
|
|
48
|
+
if (trailing) _edges.push("trailing");
|
|
49
|
+
return _edges;
|
|
50
|
+
}, [leading, trailing]);
|
|
51
|
+
const debounced = useMemo(() => {
|
|
52
|
+
return debounce(preservedCallback, wait, { edges });
|
|
53
|
+
}, [
|
|
54
|
+
preservedCallback,
|
|
55
|
+
wait,
|
|
56
|
+
edges
|
|
57
|
+
]);
|
|
58
|
+
useEffect(function cancelDebouncedOnUnmount() {
|
|
59
|
+
return () => {
|
|
60
|
+
debounced.cancel();
|
|
61
|
+
};
|
|
62
|
+
}, [debounced]);
|
|
63
|
+
return debounced;
|
|
64
|
+
}
|
|
65
|
+
//#endregion
|
|
66
|
+
export { useDebounce };
|
|
@@ -0,0 +1,62 @@
|
|
|
1
|
+
"use client";
|
|
2
|
+
const require_debounce = require("../useDebounce/debounce.cjs");
|
|
3
|
+
const require_usePreservedCallback = require("../usePreservedCallback/usePreservedCallback.cjs");
|
|
4
|
+
let react = require("react");
|
|
5
|
+
//#region src/hooks/useDebouncedCallback/useDebouncedCallback.ts
|
|
6
|
+
/**
|
|
7
|
+
* @description
|
|
8
|
+
* `useDebouncedCallback` is a React hook that returns a debounced version of the provided callback function.
|
|
9
|
+
* It helps optimize event handling by delaying function execution and grouping multiple calls into one.
|
|
10
|
+
*
|
|
11
|
+
* Note that if both 'leading' and 'trailing' are set, the function will be called at both the start and end of the delay period. However, it must be called at least twice within debounceMs interval for this to happen, since one debounced function call cannot trigger the function twice.
|
|
12
|
+
*
|
|
13
|
+
* @param {Object} options - The options object.
|
|
14
|
+
* @param {Function} options.onChange - The callback function to debounce.
|
|
15
|
+
* @param {number} options.timeThreshold - The number of milliseconds to delay the function execution.
|
|
16
|
+
* @param {boolean} [options.leading=false] - If `true`, the function is called at the start of the sequence.
|
|
17
|
+
* @param {boolean} [options.trailing=true] - If `true`, the function is called at the end of the sequence.
|
|
18
|
+
*
|
|
19
|
+
* @returns {Function} A debounced function that delays invoking the callback.
|
|
20
|
+
*
|
|
21
|
+
* @example
|
|
22
|
+
* function SearchInput() {
|
|
23
|
+
* const [query, setQuery] = useState('');
|
|
24
|
+
* const debouncedSetQuery = useDebouncedCallback({ onChange: setQuery, timeThreshold: 100 });
|
|
25
|
+
* return <input type="text" onChange={(e) => debouncedSetQuery(e.target.value)} />;
|
|
26
|
+
* }
|
|
27
|
+
*/
|
|
28
|
+
function useDebouncedCallback({ onChange, timeThreshold, leading = false, trailing = true }) {
|
|
29
|
+
const handleChange = require_usePreservedCallback.usePreservedCallback(onChange);
|
|
30
|
+
const ref = (0, react.useRef)({
|
|
31
|
+
value: false,
|
|
32
|
+
clearPreviousDebounce: () => {}
|
|
33
|
+
});
|
|
34
|
+
(0, react.useEffect)(function clearDebouncedOnUnmount() {
|
|
35
|
+
const current = ref.current;
|
|
36
|
+
return () => {
|
|
37
|
+
current.clearPreviousDebounce();
|
|
38
|
+
};
|
|
39
|
+
}, []);
|
|
40
|
+
const edges = (0, react.useMemo)(() => {
|
|
41
|
+
const _edges = [];
|
|
42
|
+
if (leading) _edges.push("leading");
|
|
43
|
+
if (trailing) _edges.push("trailing");
|
|
44
|
+
return _edges;
|
|
45
|
+
}, [leading, trailing]);
|
|
46
|
+
return (0, react.useCallback)((nextValue) => {
|
|
47
|
+
if (nextValue === ref.current.value) return;
|
|
48
|
+
const debounced = require_debounce.debounce(() => {
|
|
49
|
+
handleChange(nextValue);
|
|
50
|
+
ref.current.value = nextValue;
|
|
51
|
+
}, timeThreshold, { edges });
|
|
52
|
+
ref.current.clearPreviousDebounce();
|
|
53
|
+
debounced();
|
|
54
|
+
ref.current.clearPreviousDebounce = debounced.cancel;
|
|
55
|
+
}, [
|
|
56
|
+
handleChange,
|
|
57
|
+
timeThreshold,
|
|
58
|
+
edges
|
|
59
|
+
]);
|
|
60
|
+
}
|
|
61
|
+
//#endregion
|
|
62
|
+
exports.useDebouncedCallback = useDebouncedCallback;
|
|
@@ -1,6 +1,8 @@
|
|
|
1
|
+
|
|
2
|
+
//#region src/hooks/useDebouncedCallback/useDebouncedCallback.d.ts
|
|
1
3
|
type DebounceOptions = {
|
|
2
|
-
|
|
3
|
-
|
|
4
|
+
leading?: boolean;
|
|
5
|
+
trailing?: boolean;
|
|
4
6
|
};
|
|
5
7
|
/**
|
|
6
8
|
* @description
|
|
@@ -24,9 +26,9 @@ type DebounceOptions = {
|
|
|
24
26
|
* return <input type="text" onChange={(e) => debouncedSetQuery(e.target.value)} />;
|
|
25
27
|
* }
|
|
26
28
|
*/
|
|
27
|
-
declare function useDebouncedCallback({ onChange, timeThreshold, leading, trailing
|
|
28
|
-
|
|
29
|
-
|
|
29
|
+
declare function useDebouncedCallback({ onChange, timeThreshold, leading, trailing }: DebounceOptions & {
|
|
30
|
+
onChange: (newValue: boolean) => void;
|
|
31
|
+
timeThreshold: number;
|
|
30
32
|
}): (nextValue: boolean) => void;
|
|
31
|
-
|
|
32
|
-
export { useDebouncedCallback };
|
|
33
|
+
//#endregion
|
|
34
|
+
export { useDebouncedCallback };
|
|
@@ -1,6 +1,8 @@
|
|
|
1
|
+
|
|
2
|
+
//#region src/hooks/useDebouncedCallback/useDebouncedCallback.d.ts
|
|
1
3
|
type DebounceOptions = {
|
|
2
|
-
|
|
3
|
-
|
|
4
|
+
leading?: boolean;
|
|
5
|
+
trailing?: boolean;
|
|
4
6
|
};
|
|
5
7
|
/**
|
|
6
8
|
* @description
|
|
@@ -24,9 +26,9 @@ type DebounceOptions = {
|
|
|
24
26
|
* return <input type="text" onChange={(e) => debouncedSetQuery(e.target.value)} />;
|
|
25
27
|
* }
|
|
26
28
|
*/
|
|
27
|
-
declare function useDebouncedCallback({ onChange, timeThreshold, leading, trailing
|
|
28
|
-
|
|
29
|
-
|
|
29
|
+
declare function useDebouncedCallback({ onChange, timeThreshold, leading, trailing }: DebounceOptions & {
|
|
30
|
+
onChange: (newValue: boolean) => void;
|
|
31
|
+
timeThreshold: number;
|
|
30
32
|
}): (nextValue: boolean) => void;
|
|
31
|
-
|
|
32
|
-
export { useDebouncedCallback };
|
|
33
|
+
//#endregion
|
|
34
|
+
export { useDebouncedCallback };
|
|
@@ -0,0 +1,62 @@
|
|
|
1
|
+
"use client";
|
|
2
|
+
import { debounce } from "../useDebounce/debounce.mjs";
|
|
3
|
+
import { usePreservedCallback } from "../usePreservedCallback/usePreservedCallback.mjs";
|
|
4
|
+
import { useCallback, useEffect, useMemo, useRef } from "react";
|
|
5
|
+
//#region src/hooks/useDebouncedCallback/useDebouncedCallback.ts
|
|
6
|
+
/**
|
|
7
|
+
* @description
|
|
8
|
+
* `useDebouncedCallback` is a React hook that returns a debounced version of the provided callback function.
|
|
9
|
+
* It helps optimize event handling by delaying function execution and grouping multiple calls into one.
|
|
10
|
+
*
|
|
11
|
+
* Note that if both 'leading' and 'trailing' are set, the function will be called at both the start and end of the delay period. However, it must be called at least twice within debounceMs interval for this to happen, since one debounced function call cannot trigger the function twice.
|
|
12
|
+
*
|
|
13
|
+
* @param {Object} options - The options object.
|
|
14
|
+
* @param {Function} options.onChange - The callback function to debounce.
|
|
15
|
+
* @param {number} options.timeThreshold - The number of milliseconds to delay the function execution.
|
|
16
|
+
* @param {boolean} [options.leading=false] - If `true`, the function is called at the start of the sequence.
|
|
17
|
+
* @param {boolean} [options.trailing=true] - If `true`, the function is called at the end of the sequence.
|
|
18
|
+
*
|
|
19
|
+
* @returns {Function} A debounced function that delays invoking the callback.
|
|
20
|
+
*
|
|
21
|
+
* @example
|
|
22
|
+
* function SearchInput() {
|
|
23
|
+
* const [query, setQuery] = useState('');
|
|
24
|
+
* const debouncedSetQuery = useDebouncedCallback({ onChange: setQuery, timeThreshold: 100 });
|
|
25
|
+
* return <input type="text" onChange={(e) => debouncedSetQuery(e.target.value)} />;
|
|
26
|
+
* }
|
|
27
|
+
*/
|
|
28
|
+
function useDebouncedCallback({ onChange, timeThreshold, leading = false, trailing = true }) {
|
|
29
|
+
const handleChange = usePreservedCallback(onChange);
|
|
30
|
+
const ref = useRef({
|
|
31
|
+
value: false,
|
|
32
|
+
clearPreviousDebounce: () => {}
|
|
33
|
+
});
|
|
34
|
+
useEffect(function clearDebouncedOnUnmount() {
|
|
35
|
+
const current = ref.current;
|
|
36
|
+
return () => {
|
|
37
|
+
current.clearPreviousDebounce();
|
|
38
|
+
};
|
|
39
|
+
}, []);
|
|
40
|
+
const edges = useMemo(() => {
|
|
41
|
+
const _edges = [];
|
|
42
|
+
if (leading) _edges.push("leading");
|
|
43
|
+
if (trailing) _edges.push("trailing");
|
|
44
|
+
return _edges;
|
|
45
|
+
}, [leading, trailing]);
|
|
46
|
+
return useCallback((nextValue) => {
|
|
47
|
+
if (nextValue === ref.current.value) return;
|
|
48
|
+
const debounced = debounce(() => {
|
|
49
|
+
handleChange(nextValue);
|
|
50
|
+
ref.current.value = nextValue;
|
|
51
|
+
}, timeThreshold, { edges });
|
|
52
|
+
ref.current.clearPreviousDebounce();
|
|
53
|
+
debounced();
|
|
54
|
+
ref.current.clearPreviousDebounce = debounced.cancel;
|
|
55
|
+
}, [
|
|
56
|
+
handleChange,
|
|
57
|
+
timeThreshold,
|
|
58
|
+
edges
|
|
59
|
+
]);
|
|
60
|
+
}
|
|
61
|
+
//#endregion
|
|
62
|
+
export { useDebouncedCallback };
|
|
@@ -1,46 +1,3 @@
|
|
|
1
|
-
import { MouseEvent } from 'react';
|
|
2
1
|
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
click?: (event: MouseEvent<E>) => void;
|
|
6
|
-
doubleClick: (event: MouseEvent<E>) => void;
|
|
7
|
-
};
|
|
8
|
-
/**
|
|
9
|
-
* @deprecated This hook is deprecated as it depends on browser-specific APIs (DOM events, window.setTimeout).
|
|
10
|
-
* react-simplikit is now focused on platform-independent, pure state/logic hooks.
|
|
11
|
-
* This hook will be removed in a future major version.
|
|
12
|
-
*
|
|
13
|
-
* @description
|
|
14
|
-
* `useDoubleClick` is a React hook that differentiates between single and double click events.
|
|
15
|
-
* It delays the single click callback execution for a specified time, and cancels it if a second click (i.e. a double click) occurs within that time.
|
|
16
|
-
*
|
|
17
|
-
* @template {HTMLElement} E - The specific type of HTMLElement to be used with this hook (e.g., HTMLButtonElement, HTMLDivElement).
|
|
18
|
-
* @param {Object} props - Configuration options for click handling.
|
|
19
|
-
* @param {number} [props.delay=250] - The number of milliseconds to wait before triggering the single click callback. Defaults to 250ms.
|
|
20
|
-
* @param {(event: MouseEvent<E>) => void} [props.click] - The callback function to be executed on a single click.
|
|
21
|
-
* @param {(event: MouseEvent<E>) => void} props.doubleClick - The callback function to be executed on a double click. Required.
|
|
22
|
-
*
|
|
23
|
-
* @returns {(event: MouseEvent<E>) => void} A click handler function to attach to an element's `onClick` event.
|
|
24
|
-
*
|
|
25
|
-
* @example
|
|
26
|
-
* function GalleryCard() {
|
|
27
|
-
* const [selected, setSelected] = useState(false);
|
|
28
|
-
*
|
|
29
|
-
* const handleClick = () => setSelected((prev) => !prev);
|
|
30
|
-
* const handleDoubleClick = () => alert('Zoom in!');
|
|
31
|
-
*
|
|
32
|
-
* const handleEvent = useDoubleClick({
|
|
33
|
-
* click: handleClick,
|
|
34
|
-
* doubleClick: handleDoubleClick,
|
|
35
|
-
* });
|
|
36
|
-
*
|
|
37
|
-
* return (
|
|
38
|
-
* <div onClick={handleEvent}>
|
|
39
|
-
* {selected ? 'Selected' : 'Not selected'}
|
|
40
|
-
* </div>
|
|
41
|
-
* );
|
|
42
|
-
* }
|
|
43
|
-
*/
|
|
44
|
-
declare function useDoubleClick<E extends HTMLElement = HTMLElement>({ delay, click, doubleClick, }: UseDoubleClickProps<E>): (event: MouseEvent<E>) => void;
|
|
45
|
-
|
|
46
|
-
export { useDoubleClick };
|
|
2
|
+
import { useDoubleClick } from "./useDoubleClick.cjs";
|
|
3
|
+
export { useDoubleClick };
|
|
@@ -0,0 +1,64 @@
|
|
|
1
|
+
"use client";
|
|
2
|
+
const require_usePreservedCallback = require("../usePreservedCallback/usePreservedCallback.cjs");
|
|
3
|
+
let react = require("react");
|
|
4
|
+
//#region src/hooks/useDoubleClick/useDoubleClick.ts
|
|
5
|
+
/**
|
|
6
|
+
* @deprecated This hook is deprecated as it depends on browser-specific APIs (DOM events, window.setTimeout).
|
|
7
|
+
* react-simplikit is now focused on platform-independent, pure state/logic hooks.
|
|
8
|
+
* This hook will be removed in a future major version.
|
|
9
|
+
*
|
|
10
|
+
* @description
|
|
11
|
+
* `useDoubleClick` is a React hook that differentiates between single and double click events.
|
|
12
|
+
* It delays the single click callback execution for a specified time, and cancels it if a second click (i.e. a double click) occurs within that time.
|
|
13
|
+
*
|
|
14
|
+
* @template {HTMLElement} E - The specific type of HTMLElement to be used with this hook (e.g., HTMLButtonElement, HTMLDivElement).
|
|
15
|
+
* @param {Object} props - Configuration options for click handling.
|
|
16
|
+
* @param {number} [props.delay=250] - The number of milliseconds to wait before triggering the single click callback. Defaults to 250ms.
|
|
17
|
+
* @param {(event: MouseEvent<E>) => void} [props.click] - The callback function to be executed on a single click.
|
|
18
|
+
* @param {(event: MouseEvent<E>) => void} props.doubleClick - The callback function to be executed on a double click. Required.
|
|
19
|
+
*
|
|
20
|
+
* @returns {(event: MouseEvent<E>) => void} A click handler function to attach to an element's `onClick` event.
|
|
21
|
+
*
|
|
22
|
+
* @example
|
|
23
|
+
* function GalleryCard() {
|
|
24
|
+
* const [selected, setSelected] = useState(false);
|
|
25
|
+
*
|
|
26
|
+
* const handleClick = () => setSelected((prev) => !prev);
|
|
27
|
+
* const handleDoubleClick = () => alert('Zoom in!');
|
|
28
|
+
*
|
|
29
|
+
* const handleEvent = useDoubleClick({
|
|
30
|
+
* click: handleClick,
|
|
31
|
+
* doubleClick: handleDoubleClick,
|
|
32
|
+
* });
|
|
33
|
+
*
|
|
34
|
+
* return (
|
|
35
|
+
* <div onClick={handleEvent}>
|
|
36
|
+
* {selected ? 'Selected' : 'Not selected'}
|
|
37
|
+
* </div>
|
|
38
|
+
* );
|
|
39
|
+
* }
|
|
40
|
+
*/
|
|
41
|
+
function useDoubleClick({ delay = 250, click, doubleClick }) {
|
|
42
|
+
const clickTimeout = (0, react.useRef)(null);
|
|
43
|
+
const clearClickTimeout = require_usePreservedCallback.usePreservedCallback(() => {
|
|
44
|
+
if (clickTimeout.current != null) {
|
|
45
|
+
window.clearTimeout(clickTimeout.current);
|
|
46
|
+
clickTimeout.current = null;
|
|
47
|
+
}
|
|
48
|
+
});
|
|
49
|
+
(0, react.useEffect)(() => () => clearClickTimeout(), [clearClickTimeout]);
|
|
50
|
+
return (0, react.useCallback)((event) => {
|
|
51
|
+
clearClickTimeout();
|
|
52
|
+
if (click && event.detail === 1) clickTimeout.current = window.setTimeout(() => {
|
|
53
|
+
click(event);
|
|
54
|
+
}, delay);
|
|
55
|
+
if (event.detail === 2) doubleClick(event);
|
|
56
|
+
}, [
|
|
57
|
+
click,
|
|
58
|
+
doubleClick,
|
|
59
|
+
delay,
|
|
60
|
+
clearClickTimeout
|
|
61
|
+
]);
|
|
62
|
+
}
|
|
63
|
+
//#endregion
|
|
64
|
+
exports.useDoubleClick = useDoubleClick;
|
package/{esm/hooks/useDoubleClick/index.d.ts → dist/hooks/useDoubleClick/useDoubleClick.d.cts}
RENAMED
|
@@ -1,9 +1,10 @@
|
|
|
1
|
-
import { MouseEvent } from 'react';
|
|
2
1
|
|
|
2
|
+
import { MouseEvent } from "react";
|
|
3
|
+
//#region src/hooks/useDoubleClick/useDoubleClick.d.ts
|
|
3
4
|
type UseDoubleClickProps<E extends HTMLElement> = {
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
5
|
+
delay?: number;
|
|
6
|
+
click?: (event: MouseEvent<E>) => void;
|
|
7
|
+
doubleClick: (event: MouseEvent<E>) => void;
|
|
7
8
|
};
|
|
8
9
|
/**
|
|
9
10
|
* @deprecated This hook is deprecated as it depends on browser-specific APIs (DOM events, window.setTimeout).
|
|
@@ -41,6 +42,6 @@ type UseDoubleClickProps<E extends HTMLElement> = {
|
|
|
41
42
|
* );
|
|
42
43
|
* }
|
|
43
44
|
*/
|
|
44
|
-
declare function useDoubleClick<E extends HTMLElement = HTMLElement>({ delay, click, doubleClick
|
|
45
|
-
|
|
46
|
-
export { useDoubleClick };
|
|
45
|
+
declare function useDoubleClick<E extends HTMLElement = HTMLElement>({ delay, click, doubleClick }: UseDoubleClickProps<E>): (event: MouseEvent<E>) => void;
|
|
46
|
+
//#endregion
|
|
47
|
+
export { useDoubleClick };
|
|
@@ -0,0 +1,47 @@
|
|
|
1
|
+
|
|
2
|
+
import { MouseEvent } from "react";
|
|
3
|
+
//#region src/hooks/useDoubleClick/useDoubleClick.d.ts
|
|
4
|
+
type UseDoubleClickProps<E extends HTMLElement> = {
|
|
5
|
+
delay?: number;
|
|
6
|
+
click?: (event: MouseEvent<E>) => void;
|
|
7
|
+
doubleClick: (event: MouseEvent<E>) => void;
|
|
8
|
+
};
|
|
9
|
+
/**
|
|
10
|
+
* @deprecated This hook is deprecated as it depends on browser-specific APIs (DOM events, window.setTimeout).
|
|
11
|
+
* react-simplikit is now focused on platform-independent, pure state/logic hooks.
|
|
12
|
+
* This hook will be removed in a future major version.
|
|
13
|
+
*
|
|
14
|
+
* @description
|
|
15
|
+
* `useDoubleClick` is a React hook that differentiates between single and double click events.
|
|
16
|
+
* It delays the single click callback execution for a specified time, and cancels it if a second click (i.e. a double click) occurs within that time.
|
|
17
|
+
*
|
|
18
|
+
* @template {HTMLElement} E - The specific type of HTMLElement to be used with this hook (e.g., HTMLButtonElement, HTMLDivElement).
|
|
19
|
+
* @param {Object} props - Configuration options for click handling.
|
|
20
|
+
* @param {number} [props.delay=250] - The number of milliseconds to wait before triggering the single click callback. Defaults to 250ms.
|
|
21
|
+
* @param {(event: MouseEvent<E>) => void} [props.click] - The callback function to be executed on a single click.
|
|
22
|
+
* @param {(event: MouseEvent<E>) => void} props.doubleClick - The callback function to be executed on a double click. Required.
|
|
23
|
+
*
|
|
24
|
+
* @returns {(event: MouseEvent<E>) => void} A click handler function to attach to an element's `onClick` event.
|
|
25
|
+
*
|
|
26
|
+
* @example
|
|
27
|
+
* function GalleryCard() {
|
|
28
|
+
* const [selected, setSelected] = useState(false);
|
|
29
|
+
*
|
|
30
|
+
* const handleClick = () => setSelected((prev) => !prev);
|
|
31
|
+
* const handleDoubleClick = () => alert('Zoom in!');
|
|
32
|
+
*
|
|
33
|
+
* const handleEvent = useDoubleClick({
|
|
34
|
+
* click: handleClick,
|
|
35
|
+
* doubleClick: handleDoubleClick,
|
|
36
|
+
* });
|
|
37
|
+
*
|
|
38
|
+
* return (
|
|
39
|
+
* <div onClick={handleEvent}>
|
|
40
|
+
* {selected ? 'Selected' : 'Not selected'}
|
|
41
|
+
* </div>
|
|
42
|
+
* );
|
|
43
|
+
* }
|
|
44
|
+
*/
|
|
45
|
+
declare function useDoubleClick<E extends HTMLElement = HTMLElement>({ delay, click, doubleClick }: UseDoubleClickProps<E>): (event: MouseEvent<E>) => void;
|
|
46
|
+
//#endregion
|
|
47
|
+
export { useDoubleClick };
|
|
@@ -0,0 +1,64 @@
|
|
|
1
|
+
"use client";
|
|
2
|
+
import { usePreservedCallback } from "../usePreservedCallback/usePreservedCallback.mjs";
|
|
3
|
+
import { useCallback, useEffect, useRef } from "react";
|
|
4
|
+
//#region src/hooks/useDoubleClick/useDoubleClick.ts
|
|
5
|
+
/**
|
|
6
|
+
* @deprecated This hook is deprecated as it depends on browser-specific APIs (DOM events, window.setTimeout).
|
|
7
|
+
* react-simplikit is now focused on platform-independent, pure state/logic hooks.
|
|
8
|
+
* This hook will be removed in a future major version.
|
|
9
|
+
*
|
|
10
|
+
* @description
|
|
11
|
+
* `useDoubleClick` is a React hook that differentiates between single and double click events.
|
|
12
|
+
* It delays the single click callback execution for a specified time, and cancels it if a second click (i.e. a double click) occurs within that time.
|
|
13
|
+
*
|
|
14
|
+
* @template {HTMLElement} E - The specific type of HTMLElement to be used with this hook (e.g., HTMLButtonElement, HTMLDivElement).
|
|
15
|
+
* @param {Object} props - Configuration options for click handling.
|
|
16
|
+
* @param {number} [props.delay=250] - The number of milliseconds to wait before triggering the single click callback. Defaults to 250ms.
|
|
17
|
+
* @param {(event: MouseEvent<E>) => void} [props.click] - The callback function to be executed on a single click.
|
|
18
|
+
* @param {(event: MouseEvent<E>) => void} props.doubleClick - The callback function to be executed on a double click. Required.
|
|
19
|
+
*
|
|
20
|
+
* @returns {(event: MouseEvent<E>) => void} A click handler function to attach to an element's `onClick` event.
|
|
21
|
+
*
|
|
22
|
+
* @example
|
|
23
|
+
* function GalleryCard() {
|
|
24
|
+
* const [selected, setSelected] = useState(false);
|
|
25
|
+
*
|
|
26
|
+
* const handleClick = () => setSelected((prev) => !prev);
|
|
27
|
+
* const handleDoubleClick = () => alert('Zoom in!');
|
|
28
|
+
*
|
|
29
|
+
* const handleEvent = useDoubleClick({
|
|
30
|
+
* click: handleClick,
|
|
31
|
+
* doubleClick: handleDoubleClick,
|
|
32
|
+
* });
|
|
33
|
+
*
|
|
34
|
+
* return (
|
|
35
|
+
* <div onClick={handleEvent}>
|
|
36
|
+
* {selected ? 'Selected' : 'Not selected'}
|
|
37
|
+
* </div>
|
|
38
|
+
* );
|
|
39
|
+
* }
|
|
40
|
+
*/
|
|
41
|
+
function useDoubleClick({ delay = 250, click, doubleClick }) {
|
|
42
|
+
const clickTimeout = useRef(null);
|
|
43
|
+
const clearClickTimeout = usePreservedCallback(() => {
|
|
44
|
+
if (clickTimeout.current != null) {
|
|
45
|
+
window.clearTimeout(clickTimeout.current);
|
|
46
|
+
clickTimeout.current = null;
|
|
47
|
+
}
|
|
48
|
+
});
|
|
49
|
+
useEffect(() => () => clearClickTimeout(), [clearClickTimeout]);
|
|
50
|
+
return useCallback((event) => {
|
|
51
|
+
clearClickTimeout();
|
|
52
|
+
if (click && event.detail === 1) clickTimeout.current = window.setTimeout(() => {
|
|
53
|
+
click(event);
|
|
54
|
+
}, delay);
|
|
55
|
+
if (event.detail === 2) doubleClick(event);
|
|
56
|
+
}, [
|
|
57
|
+
click,
|
|
58
|
+
doubleClick,
|
|
59
|
+
delay,
|
|
60
|
+
clearClickTimeout
|
|
61
|
+
]);
|
|
62
|
+
}
|
|
63
|
+
//#endregion
|
|
64
|
+
export { useDoubleClick };
|