import { useCallback, useRef } from 'react'; export interface DebounceOptions { wait?: number; immediate?: boolean; } export type DebounceCallback = (...args: T) => void; export function useDebounce( callback: DebounceCallback, options?: DebounceOptions ): DebounceCallback { const timeoutIdRef = useRef(); const { wait, immediate } = options ?? {}; const debounceCallback = useCallback( (...cbArgs: T) => { if (timeoutIdRef.current) { clearTimeout(timeoutIdRef.current); timeoutIdRef.current = undefined; } else if (immediate) { callback(...cbArgs); } timeoutIdRef.current = window.setTimeout(() => { callback(...cbArgs); timeoutIdRef.current = undefined; }, wait); }, [callback, wait, immediate] ); return debounceCallback; }