import debounce from 'lodash-es/debounce'; import { useMemo, useRef } from 'react'; export interface DebouncedFunc unknown> { (...args: Parameters): ReturnType | undefined; cancel(): void; flush(): ReturnType | undefined; } export type DebounceOptions = { leading?: boolean; maxWait?: number; trailing?: boolean; }; const defaultOptions: DebounceOptions = { leading: false, trailing: true, }; const useDebouncedFn = ) => unknown>( fn: T, wait = 100, options: DebounceOptions = defaultOptions, ): DebouncedFunc => { const fnRef = useRef(fn); fnRef.current = fn; return useMemo( () => debounce(((...args) => fnRef.current(...args)) as T, wait, options), [options, wait], ); }; export default useDebouncedFn;