import { useState, useCallback, useRef } from 'react'; const DefaultDelayTime = 300; export default function useDebounceCallback any>( callback: T, delay: number = DefaultDelayTime, initiValue?: any ): [ReturnType | undefined, (...args: any[]) => void, () => void] { const [val, setVal] = useState | undefined>(initiValue); const debounceTimer = useRef | null>(null); const dispatch = useCallback( (...args) => { debounceTimer.current && clearTimeout(debounceTimer.current); debounceTimer.current = window.setTimeout(() => { setVal(callback(...args)); }, delay); }, [callback, delay, debounceTimer] ); const cancel = useCallback(() => { debounceTimer.current && clearTimeout(debounceTimer.current); }, [debounceTimer]); return [val, dispatch, cancel]; }