import React, { useEffect, useRef, useState } from "react"; const useCountdown = (seconds, onEnd) => { const [finished, setFinished] = useState(false); const [remaining, setRemaining] = useState(seconds); const [paused, setPaused] = useState(false); const remainingMut = useRef(seconds); useEffect(() => { const timer = setInterval(() => { if (!paused) { setRemaining((remainingMut.current -= 1)); } }, 1000); return () => clearInterval(timer); }, [paused]); useEffect(() => { if (!finished && remaining <= 0) { onEnd(); setFinished(true); } }, [finished, remaining, onEnd]); return [remaining, () => setPaused(!paused)]; }; const CountdownButton = ({ onCancelled, onEnd, formatter, seconds, autoFocus, buttonClass, }) => { const [remaining, pause] = useCountdown(seconds, onEnd); return ( ); }; const DelayedButton = ({ children, onEnd, countDownFormatter, seconds, autoFocus, buttonClass, }) => { const [delayed, setDelayed] = useState(false); return delayed ? ( setDelayed(false)} onEnd={onEnd} formatter={countDownFormatter ?? JSON.stringify} seconds={seconds ?? 3} autoFocus={autoFocus} buttonClass={buttonClass} /> ) : ( ); }; export default DelayedButton;