sheer / src /hooks /use-debounce.ts
barreloflube's picture
v1
5fc68b0
raw
history blame
877 Bytes
import { useEffect, useState, useCallback, useRef } from 'react';
export function useDebounceValue<T>(value: T, delay: number): T {
const [debouncedValue, setDebouncedValue] = useState<T>(value);
useEffect(() => {
const timer = setTimeout(() => {
setDebouncedValue(value);
}, delay);
return () => {
clearTimeout(timer);
};
}, [value, delay]);
return debouncedValue;
}
export function useDebounceCallback<Args extends unknown[], R>(
callback: (...args: Args) => R,
delay: number
): (...args: Args) => void {
const timeoutRef = useRef<NodeJS.Timeout | undefined>(undefined);
return useCallback(
(...args: Args) => {
if (timeoutRef.current) {
clearTimeout(timeoutRef.current);
}
timeoutRef.current = setTimeout(() => {
callback(...args);
}, delay);
},
[callback, delay]
);
}