@@ -9,6 +9,14 @@ export interface ElapsedTimeTracker {
99 * Stop tracking and reset to 0
1010 */
1111 stop : ( ) => void
12+ /**
13+ * Pause tracking, freezing the current elapsed time
14+ */
15+ pause : ( ) => void
16+ /**
17+ * Resume tracking from the frozen elapsed time
18+ */
19+ resume : ( ) => void
1220 /**
1321 * Get the current elapsed seconds
1422 */
@@ -17,6 +25,10 @@ export interface ElapsedTimeTracker {
1725 * Get the start time timestamp (null if not started)
1826 */
1927 startTime : number | null
28+ /**
29+ * Whether the timer is currently paused
30+ */
31+ isPaused : boolean
2032}
2133
2234/**
@@ -37,19 +49,47 @@ export interface ElapsedTimeTracker {
3749export const useElapsedTime = ( ) : ElapsedTimeTracker => {
3850 const [ startTime , setStartTime ] = useState < number | null > ( null )
3951 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 )
4055
4156 const start = useCallback ( ( ) => {
4257 setStartTime ( Date . now ( ) )
58+ setAccumulatedSeconds ( 0 )
59+ setIsPaused ( false )
4360 } , [ ] )
4461
4562 const stop = useCallback ( ( ) => {
4663 setStartTime ( null )
4764 setElapsedSeconds ( 0 )
65+ setAccumulatedSeconds ( 0 )
66+ setIsPaused ( false )
4867 } , [ ] )
4968
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+
5087 useEffect ( ( ) => {
51- if ( ! startTime ) {
52- setElapsedSeconds ( 0 )
88+ if ( ! startTime || isPaused ) {
89+ // When paused, keep showing the frozen elapsed time (don't reset)
90+ if ( ! isPaused && ! startTime ) {
91+ setElapsedSeconds ( 0 )
92+ }
5393 return
5494 }
5595
@@ -65,11 +105,11 @@ export const useElapsedTime = (): ElapsedTimeTracker => {
65105 const interval = setInterval ( updateElapsed , 1000 )
66106
67107 return ( ) => clearInterval ( interval )
68- } , [ startTime ] )
108+ } , [ startTime , isPaused ] )
69109
70110 const timer = useMemo (
71- ( ) => ( { start, stop, elapsedSeconds, startTime } ) ,
72- [ start , stop , elapsedSeconds , startTime ] ,
111+ ( ) => ( { start, stop, pause , resume , elapsedSeconds, startTime, isPaused } ) ,
112+ [ start , stop , pause , resume , elapsedSeconds , startTime , isPaused ] ,
73113 )
74114
75115 return timer
0 commit comments