summaryrefslogtreecommitdiff
path: root/hooks/use-debounced-callback.ts
diff options
context:
space:
mode:
authorjoonhoekim <26rote@gmail.com>2025-03-25 15:55:45 +0900
committerjoonhoekim <26rote@gmail.com>2025-03-25 15:55:45 +0900
commit1a2241c40e10193c5ff7008a7b7b36cc1d855d96 (patch)
tree8a5587f10ca55b162d7e3254cb088b323a34c41b /hooks/use-debounced-callback.ts
initial commit
Diffstat (limited to 'hooks/use-debounced-callback.ts')
-rw-r--r--hooks/use-debounced-callback.ts29
1 files changed, 29 insertions, 0 deletions
diff --git a/hooks/use-debounced-callback.ts b/hooks/use-debounced-callback.ts
new file mode 100644
index 00000000..51f5dd17
--- /dev/null
+++ b/hooks/use-debounced-callback.ts
@@ -0,0 +1,29 @@
+/**
+ * @see https://github.com/mantinedev/mantine/blob/master/packages/@mantine/hooks/src/use-debounced-callback/use-debounced-callback.ts
+ */
+
+import * as React from "react"
+
+import { useCallbackRef } from "@/hooks/use-callback-ref"
+
+export function useDebouncedCallback<T extends (...args: never[]) => unknown>(
+ callback: T,
+ delay: number
+) {
+ const handleCallback = useCallbackRef(callback)
+ const debounceTimerRef = React.useRef(0)
+ React.useEffect(() => () => window.clearTimeout(debounceTimerRef.current), [])
+
+ const setValue = React.useCallback(
+ (...args: Parameters<T>) => {
+ window.clearTimeout(debounceTimerRef.current)
+ debounceTimerRef.current = window.setTimeout(
+ () => handleCallback(...args),
+ delay
+ )
+ },
+ [handleCallback, delay]
+ )
+
+ return setValue
+}