()
| 47 | * <MessageBlock timer={timer} /> |
| 48 | */ |
| 49 | export const useElapsedTime = (): ElapsedTimeTracker => { |
| 50 | const [startTime, setStartTime] = useState<number | null>(null) |
| 51 | const [elapsedSeconds, setElapsedSeconds] = useState<number>(0) |
| 52 | const [isPaused, setIsPaused] = useState(false) |
| 53 | // Track accumulated time from previous pause/resume cycles |
| 54 | const [accumulatedSeconds, setAccumulatedSeconds] = useState(0) |
| 55 | |
| 56 | const start = useCallback(() => { |
| 57 | setStartTime(Date.now()) |
| 58 | setAccumulatedSeconds(0) |
| 59 | setIsPaused(false) |
| 60 | }, []) |
| 61 | |
| 62 | const stop = useCallback(() => { |
| 63 | setStartTime(null) |
| 64 | setElapsedSeconds(0) |
| 65 | setAccumulatedSeconds(0) |
| 66 | setIsPaused(false) |
| 67 | }, []) |
| 68 | |
| 69 | const pause = useCallback(() => { |
| 70 | if (startTime && !isPaused) { |
| 71 | // Capture current elapsed time before pausing |
| 72 | const currentElapsed = Math.floor((Date.now() - startTime) / 1000) |
| 73 | setAccumulatedSeconds(currentElapsed) |
| 74 | setElapsedSeconds(currentElapsed) |
| 75 | setIsPaused(true) |
| 76 | } |
| 77 | }, [startTime, isPaused]) |
| 78 | |
| 79 | const resume = useCallback(() => { |
| 80 | if (isPaused) { |
| 81 | // Set a new start time adjusted for accumulated time |
| 82 | setStartTime(Date.now() - accumulatedSeconds * 1000) |
| 83 | setIsPaused(false) |
| 84 | } |
| 85 | }, [isPaused, accumulatedSeconds]) |
| 86 | |
| 87 | useEffect(() => { |
| 88 | if (!startTime || isPaused) { |
| 89 | // When paused, keep showing the frozen elapsed time (don't reset) |
| 90 | if (!isPaused && !startTime) { |
| 91 | setElapsedSeconds(0) |
| 92 | } |
| 93 | return |
| 94 | } |
| 95 | |
| 96 | const updateElapsed = () => { |
| 97 | const elapsed = Math.floor((Date.now() - startTime) / 1000) |
| 98 | setElapsedSeconds(elapsed) |
| 99 | } |
| 100 | |
| 101 | // Update immediately |
| 102 | updateElapsed() |
| 103 | |
| 104 | // Then update every second |
| 105 | const interval = setInterval(updateElapsed, 1000) |
| 106 |
no test coverage detected