MCPcopy Index your code
hub / github.com/CodebuffAI/codebuff / useElapsedTime

Function useElapsedTime

cli/src/hooks/use-elapsed-time.ts:49–116  ·  view source on GitHub ↗
()

Source from the content-addressed store, hash-verified

47 * <MessageBlock timer={timer} />
48 */
49export 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

Callers 1

useChatStreamingFunction · 0.90

Calls 1

updateElapsedFunction · 0.70

Tested by

no test coverage detected