import { useState, useEffect, useRef } from 'react' export function useSessionTimer(startedAt: string | undefined | null): string | null { const [elapsed, setElapsed] = useState(null) const intervalRef = useRef | null>(null) useEffect(() => { // Always clear any previous interval before (re)initializing. if (intervalRef.current) { clearInterval(intervalRef.current) intervalRef.current = null } if (!startedAt) return const parsedStartTime = new Date(startedAt).getTime() // If the server timestamp is invalid or ahead of the local clock, fall back to "now" // so the timer still starts ticking immediately for the user. const startTime = Number.isNaN(parsedStartTime) || parsedStartTime > Date.now() ? Date.now() : parsedStartTime const tick = () => { const diff = Math.max(0, Math.floor((Date.now() - startTime) / 1000)) const hours = Math.floor(diff / 3600) const minutes = Math.floor((diff % 3600) / 60) const seconds = diff % 60 const pad = (n: number) => String(n).padStart(2, '0') setElapsed(hours > 0 ? `${pad(hours)}:${pad(minutes)}:${pad(seconds)}` : `${pad(minutes)}:${pad(seconds)}`) } tick() intervalRef.current = setInterval(tick, 1000) return () => { if (intervalRef.current) clearInterval(intervalRef.current) } }, [startedAt]) return startedAt ? elapsed : null }