import { useEffect, useRef, useState } from 'react'; import useUnmount from './useUnmount'; const useThrottle = (value: T, ms: number = 200) => { const [state, setState] = useState(value); const timeout = useRef(null); const nextValue = useRef(null) as any; const hasNextValue = useRef(0) as any; useEffect(() => { if (!timeout.current) { setState(value); const timeoutCallback = () => { if (hasNextValue.current) { hasNextValue.current = false; setState(nextValue.current); timeout.current = setTimeout(timeoutCallback, ms); } else { timeout.current = null; } }; timeout.current = setTimeout(timeoutCallback, ms); } else { nextValue.current = value; hasNextValue.current = true; } }, [value]); useUnmount(() => { clearTimeout(timeout.current); }); return state; }; export default useThrottle;