|
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] |
|
); |
|
} |