import { useEffect, useState } from 'react'; type Dispatch = (value: A, propagate?: boolean) => void; type SetStateAction = S | ((prevState: S, propagate?: boolean) => S); export const useTimeoutEffect = ( initialValue: T, handler: (value: T) => void, delay: number = 500 ): [T, Dispatch>] => { const [value, setValue] = useState(initialValue); const [propage, setPropagate] = useState(true); const [timeoutId, setTimeoutId] = useState(null); useEffect(() => { if (!propage) return; if (timeoutId) { clearTimeout(timeoutId); } const id = setTimeout(() => { handler(value); }, delay); setTimeoutId(id); }, [value]); const setValueWrapper = (value: SetStateAction, propagate: boolean = true) => { setPropagate(propagate); setValue(value); }; return [value, setValueWrapper]; };