Files
kandev/apps/web/hooks/use-debounce.ts
T
2026-02-01 19:07:52 +00:00

48 lines
1.1 KiB
TypeScript

import { useCallback, useEffect, useRef, useState } from 'react';
/**
* Debounces a value. Returns the debounced value that updates after the specified delay.
*/
export function useDebounce<T>(value: T, delay: number): T {
const [debouncedValue, setDebouncedValue] = useState(value);
useEffect(() => {
const handler = setTimeout(() => {
setDebouncedValue(value);
}, delay);
return () => {
clearTimeout(handler);
};
}, [value, delay]);
return debouncedValue;
}
/**
* Returns a debounced version of the callback function.
*/
export function useDebouncedCallback(
callback: (value: string) => void,
delay: number
): (value: string) => void {
const timeoutRef = useRef<ReturnType<typeof setTimeout> | null>(null);
const callbackRef = useRef(callback);
useEffect(() => {
callbackRef.current = callback;
}, [callback]);
return useCallback(
(value: string) => {
if (timeoutRef.current) {
clearTimeout(timeoutRef.current);
}
timeoutRef.current = setTimeout(() => {
callbackRef.current(value);
}, delay);
},
[delay]
);
}