@@ -12,6 +12,8 @@ import {HOUR_IN_SECONDS, SECOND_IN_MS} from '../../utils/constants';
1212import { useTypedSelector } from '../../utils/hooks' ;
1313import { isAxiosError } from '../../utils/response' ;
1414
15+ import { useElapsedDuration } from './useElapsedDuration' ;
16+
1517import './QueryExecutionStatus.scss' ;
1618
1719const b = cn ( 'kv-query-execution-status' ) ;
@@ -29,38 +31,17 @@ export const QueryExecutionStatus = ({className, error, loading}: QueryExecution
2931 let textColor : TextProps [ 'color' ] ;
3032 const { startTime, endTime} = useTypedSelector ( selectQueryDuration ) ;
3133
32- const [ queryDuration , setQueryDuration ] = React . useState < number > (
33- startTime ? ( endTime || Date . now ( ) ) - startTime : 0 ,
34- ) ;
35-
36- const isCancelled = isQueryCancelledError ( error ) ;
37-
38- const setDuration = React . useCallback ( ( ) => {
39- if ( startTime ) {
40- const actualEndTime = endTime || Date . now ( ) ;
41- setQueryDuration ( actualEndTime - startTime ) ;
34+ const durationMs = useElapsedDuration ( { startTime, endTime, loading} ) ;
35+ const formattedDuration = React . useMemo ( ( ) => {
36+ if ( durationMs < 10 * SECOND_IN_MS ) {
37+ return duration ( durationMs ) . format ( 'mm:ss.SSS' ) ;
4238 }
43- } , [ endTime , startTime ] ) ;
39+ return durationMs > HOUR_IN_SECONDS * SECOND_IN_MS
40+ ? duration ( durationMs ) . format ( 'hh:mm:ss' )
41+ : duration ( durationMs ) . format ( 'mm:ss' ) ;
42+ } , [ durationMs ] ) ;
4443
45- React . useEffect ( ( ) => {
46- let timerId : ReturnType < typeof setInterval > | undefined ;
47- setDuration ( ) ;
48-
49- if ( loading ) {
50- timerId = setInterval ( setDuration , SECOND_IN_MS ) ;
51- } else {
52- clearInterval ( timerId ) ;
53- }
54- return ( ) => {
55- clearInterval ( timerId ) ;
56- } ;
57- } , [ loading , setDuration ] ) ;
58-
59- const formattedQueryDuration = React . useMemo ( ( ) => {
60- return queryDuration > HOUR_IN_SECONDS * SECOND_IN_MS
61- ? duration ( queryDuration ) . format ( 'hh:mm:ss' )
62- : duration ( queryDuration ) . format ( 'mm:ss' ) ;
63- } , [ queryDuration ] ) ;
44+ const isCancelled = isQueryCancelledError ( error ) ;
6445
6546 if ( loading ) {
6647 theme = 'info' ;
@@ -96,7 +77,7 @@ export const QueryExecutionStatus = ({className, error, loading}: QueryExecution
9677 size = "m"
9778 className = { b ( null , className ) }
9879 icon = { icon }
99- value = { formattedQueryDuration }
80+ value = { formattedDuration }
10081 >
10182 < Text color = { textColor } > { label } </ Text >
10283 </ Label >
0 commit comments