import { Component, createSignal, onMount, onCleanup } from "solid-js"; interface CountdownCircleTimerProps { duration: number; initialRemainingTime?: number; size: number; strokeWidth: number; colors: string; children: (props: { remainingTime: number }) => any; onComplete?: () => void; isPlaying?: boolean; } const CountdownCircleTimer: Component = (props) => { const radius = (props.size - props.strokeWidth) / 2; const circumference = radius * 2 * Math.PI; const [remainingTime, setRemainingTime] = createSignal( props.initialRemainingTime ?? props.duration ); const progress = () => remainingTime() / props.duration; const strokeDashoffset = () => circumference * (1 - progress()); onMount(() => { const startTime = Date.now(); const initialTime = remainingTime(); let animationFrameId: number; const animate = () => { const elapsed = (Date.now() - startTime) / 1000; const newTime = Math.max(0, initialTime - elapsed); setRemainingTime(newTime); if (newTime <= 0) { props.onComplete?.(); return; } animationFrameId = requestAnimationFrame(animate); }; animationFrameId = requestAnimationFrame(animate); onCleanup(() => { cancelAnimationFrame(animationFrameId); }); }); return (
{props.children({ remainingTime: remainingTime() })}
); }; export default CountdownCircleTimer;