import { useEffect, useState } from 'react' // modified from https://usehooks.com/useDebounce/ /** * Debounce a value of type T. * It stores a single value but returns after debounced time unless a new value is assigned before the debounce time elapses, in which case the process restarts. * @param value variable to be debounced * @param delay debounce time - amount of time in ms. * @internal Intended for internal use - use it on your own risk * @returns debounced value * * @example * const [someValue, setValue] = useState(...) * const debouncedValue = useDebounce(value, 1000) */ export function useDebounce(value: T, delay: number): T { const [debouncedValue, setDebouncedValue] = useState(value) useEffect(() => { // Update debounced value after delay const handler = setTimeout(() => { setDebouncedValue(value) }, delay) // Cancel the timeout if value changes (also on delay change or unmount) // This is how we prevent debounced value from updating if value is changed ... // .. within the delay period. Timeout gets cleared and restarted. return () => { clearTimeout(handler) } }, [value, delay]) return debouncedValue }