11import React , { useEffect , useState } from 'react'
22
3+ import { ElapsedTimer } from './elapsed-timer'
34import { ShimmerText } from './shimmer-text'
45import { useTheme } from '../hooks/use-theme'
56import { getCodebuffClient } from '../utils/codebuff-client'
6-
7- import type { ElapsedTimeTracker } from '../hooks/use-elapsed-time'
7+ import { formatElapsedTime } from '../utils/format-elapsed-time'
88
99const useConnectionStatus = ( ) => {
1010 const [ isConnected , setIsConnected ] = useState ( true )
@@ -38,17 +38,37 @@ const useConnectionStatus = () => {
3838export const StatusIndicator = ( {
3939 clipboardMessage,
4040 isActive = false ,
41- timer,
41+ isWaitingForResponse = false ,
42+ timerStartTime,
4243 nextCtrlCWillExit,
4344} : {
4445 clipboardMessage ?: string | null
4546 isActive ?: boolean
46- timer : ElapsedTimeTracker
47+ isWaitingForResponse ?: boolean
48+ timerStartTime : number | null
4749 nextCtrlCWillExit : boolean
4850} ) => {
4951 const theme = useTheme ( )
5052 const isConnected = useConnectionStatus ( )
51- const elapsedSeconds = timer . elapsedSeconds
53+ const [ elapsedSeconds , setElapsedSeconds ] = useState ( 0 )
54+
55+ useEffect ( ( ) => {
56+ if ( ! timerStartTime || ! isWaitingForResponse ) {
57+ setElapsedSeconds ( 0 )
58+ return
59+ }
60+
61+ const updateElapsed = ( ) => {
62+ const now = Date . now ( )
63+ const elapsed = Math . floor ( ( now - timerStartTime ) / 1000 )
64+ setElapsedSeconds ( elapsed )
65+ }
66+
67+ updateElapsed ( )
68+ const interval = setInterval ( updateElapsed , 1000 )
69+
70+ return ( ) => clearInterval ( interval )
71+ } , [ timerStartTime , isWaitingForResponse ] )
5272
5373 if ( nextCtrlCWillExit ) {
5474 return < span fg = { theme . secondary } > Press Ctrl-C again to exit</ span >
@@ -69,29 +89,24 @@ export const StatusIndicator = ({
6989 }
7090
7191 if ( isActive ) {
72- // If we have elapsed time > 0, show it with "working..."
73- if ( elapsedSeconds > 0 ) {
92+ if ( isWaitingForResponse ) {
7493 return (
7594 < >
7695 < ShimmerText
77- text = "working ..."
96+ text = "thinking ..."
7897 interval = { 160 }
7998 primaryColor = { theme . secondary }
8099 />
81- < span fg = { theme . muted } > </ span >
82- < span fg = { theme . secondary } > { elapsedSeconds } s</ span >
100+ { elapsedSeconds > 0 && (
101+ < >
102+ < span fg = { theme . muted } > </ span >
103+ < span fg = { theme . secondary } > { formatElapsedTime ( elapsedSeconds ) } </ span >
104+ </ >
105+ ) }
83106 </ >
84107 )
85108 }
86-
87- // Otherwise show thinking...
88- return (
89- < ShimmerText
90- text = "thinking..."
91- interval = { 160 }
92- primaryColor = { theme . secondary }
93- />
94- )
109+ return < ElapsedTimer startTime = { timerStartTime } />
95110 }
96111
97112 return null
@@ -100,17 +115,18 @@ export const StatusIndicator = ({
100115export const useHasStatus = ( params : {
101116 isActive : boolean
102117 clipboardMessage ?: string | null
103- timer ?: ElapsedTimeTracker
118+ timerStartTime ?: number | null
104119 nextCtrlCWillExit : boolean
105120} ) : boolean => {
106- const { isActive, clipboardMessage, timer, nextCtrlCWillExit } = params
121+ const { isActive, clipboardMessage, timerStartTime, nextCtrlCWillExit } =
122+ params
107123
108124 const isConnected = useConnectionStatus ( )
109125 return (
110126 isConnected === false ||
111127 isActive ||
112128 Boolean ( clipboardMessage ) ||
113- Boolean ( timer ?. startTime ) ||
129+ Boolean ( timerStartTime ) ||
114130 nextCtrlCWillExit
115131 )
116132}
0 commit comments