import { forwardRef, useEffect, useImperativeHandle, useRef } from "react";
function initTimer(delay, repeat, leading, onTimeout) {
    if (repeat) {
        if (leading)
            onTimeout();
        const interval = setInterval(() => onTimeout(), delay);
        return () => clearInterval(interval);
    }
    const timeout = setTimeout(() => onTimeout(), delay);
    return () => clearTimeout(timeout);
}
export const TimeoutProvider = forwardRef(function TimeoutProvider({ delay, repeat, leading, onTimerStart, onTimeout }, ref) {
    const onTimerStartRef = useRef(onTimerStart);
    onTimerStartRef.current = onTimerStart;
    const onTimeoutRef = useRef(onTimeout);
    onTimeoutRef.current = onTimeout;
    const destroyTimeoutRef = useRef();
    function init(delay, repeat, leading) {
        if (delay == null)
            return;
        onTimerStartRef.current?.(delay);
        const destroyTimer = initTimer(delay, repeat, leading, () => onTimeoutRef.current?.());
        destroyTimeoutRef.current = destroyTimer;
        return destroyTimer;
    }
    function deinit(destroyTimer = destroyTimeoutRef.current) {
        if (destroyTimer) {
            destroyTimer();
            destroyTimer = undefined;
        }
    }
    useImperativeHandle(ref, () => {
        return {
            reset() {
                deinit();
                init(delay, repeat, leading);
            },
        };
    });
    useEffect(() => {
        deinit();
        return init(delay, repeat, leading);
    }, [delay, repeat, leading]);
    return null;
});
//# sourceMappingURL=TimeoutProvider.jsx.map