import { useState, useEffect } from "react"; import { clamp } from "lodash"; interface Props { startTime: number | null; length: number; onTimeout?: () => unknown; } const invLerp = (a: number, b: number, x: number): number => clamp((x - b) / (a - b), 0, 1); const Timer = ({ startTime, length, onTimeout }: Props) => { const [segs, setSegs] = useState(0); const updateTimer = () => { if (!startTime) return; const endTime = startTime + length; const currentTime = Date.now(); const segs = invLerp(startTime, endTime, currentTime) * 5; setSegs(segs); if (segs > 0) { setTimeout(updateTimer, 100); } else if (onTimeout) { onTimeout(); } }; useEffect(() => { setTimeout(updateTimer, 100); }, [startTime, length]); return ( {[5, 4, 3, 2, 1, 2, 3, 4, 5].map((seg, i) => ( ))} ); }; export default Timer;