1import { useEffect, useRef, useCallback } from "react";
2
3const random = (min: number, max: number) =>
4 Math.floor(Math.random() * (max - min)) + min;
5
6export function useRandomInterval(
7 callback: () => void,
8 minDelay: number | null,
9 maxDelay: number | null
10) {
11 const timeoutId = useRef<number | null>(null);
12 const savedCallback = useRef(callback);
13
14 useEffect(() => {
15 savedCallback.current = callback;
16 }, [callback]);
17
18 useEffect(() => {
19 const isEnabled =
20 typeof minDelay === "number" && typeof maxDelay === "number";
21 if (isEnabled) {
22 const handleTick = () => {
23 const nextTickAt = random(minDelay, maxDelay);
24 timeoutId.current = window.setTimeout(() => {
25 savedCallback.current();
26 handleTick();
27 }, nextTickAt);
28 };
29 handleTick();
30 }
31 return () => {
32 if (timeoutId.current) window.clearTimeout(timeoutId.current);
33 };
34 }, [minDelay, maxDelay]);
35
36 const cancel = useCallback(() => {
37 if (timeoutId.current) window.clearTimeout(timeoutId.current);
38 }, []);
39
40 return cancel;
41}