Files
resolutionflow/frontend/src/hooks/useSessionTimer.ts
2026-02-11 19:09:29 -05:00

42 lines
1.4 KiB
TypeScript

import { useState, useEffect, useRef } from 'react'
export function useSessionTimer(startedAt: string | undefined | null): string | null {
const [elapsed, setElapsed] = useState<string | null>(null)
const intervalRef = useRef<ReturnType<typeof setInterval> | 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
}