1234567891011121314151617181920212223242526272829303132333435363738394041424344454647 |
- import { useEffect, useRef, useState } from "react";
- export function Timer({
- isRunning,
- initialSeconds = 0,
- onChange,
- }: {
- isRunning: boolean;
- initialSeconds?: number;
- onChange?: (seconds: number) => void;
- }) {
- const [seconds, setSeconds] = useState(initialSeconds);
- const intervalRef = useRef<NodeJS.Timeout | null>(null);
- useEffect(() => {
- setSeconds(initialSeconds);
- }, [initialSeconds]);
- useEffect(() => {
- if (isRunning) {
- intervalRef.current = setInterval(() => {
- setSeconds((s) => {
- const next = s + 1;
- onChange?.(next);
- return next;
- });
- }, 1000);
- } else if (intervalRef.current) {
- clearInterval(intervalRef.current);
- intervalRef.current = null;
- }
- return () => {
- if (intervalRef.current) clearInterval(intervalRef.current);
- };
- }, [isRunning, onChange]);
- // Format mm:ss ou hh:mm:ss
- const format = () => {
- const h = Math.floor(seconds / 3600);
- const m = Math.floor((seconds % 3600) / 60);
- const s = seconds % 60;
- if (h > 0) return `${h.toString().padStart(2, "0")}:${m.toString().padStart(2, "0")}:${s.toString().padStart(2, "0")}`;
- return `${m.toString().padStart(2, "0")}:${s.toString().padStart(2, "0")}`;
- };
- return <span>{format()}</span>;
- }
|