import { useEffect, useState } from "react"; /** * Use this hook when you need to debounce a value. * @param value * @param delay in milliseconds */ export const useDebounce = (value: T, delay: number) => { // State and setters for debounced value 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 the value is changed // within the delay period. Timeout gets cleared and restarted. return () => { clearTimeout(handler); }; }, [value, delay]); return debouncedValue; };