import { useCallback, useEffect, useRef } from "react"; import random from "lodash.random"; type Props = { callback: () => void; minDelay: number; maxDelay: number; }; export const useRandomInterval = ({ callback, minDelay, maxDelay }: Props) => { const timeoutId = useRef(); const savedCallback = useRef(callback); useEffect(() => { savedCallback.current = callback; }, [callback]); useEffect(() => { const isEnabled = typeof minDelay === "number" && typeof maxDelay === "number"; if (isEnabled) { const handleTick = () => { const nextTickAt = random(minDelay, maxDelay); timeoutId.current = window.setTimeout(() => { savedCallback.current(); handleTick(); }, nextTickAt); }; handleTick(); } return () => window.clearTimeout(timeoutId.current); }, [minDelay, maxDelay]); const cancel = useCallback(() => { window.clearTimeout(timeoutId.current); }, []); return cancel; };