1- import { useEffect , useRef , useState } from 'react' ;
1+ import { useCallback , useEffect , useRef , useState } from 'react' ;
22
33import { calcDuration , msToTime } from '../helpers/DateTime' ;
44import TaskModel , { ITimeRangeModel } from '../models/TaskModel' ;
55import TaskTimeItemModel from '../models/TaskTimeItemModel' ;
66
77export function useTaskDuration ( model : TaskModel | undefined ) {
8- model = model || ( { } as TaskModel ) ;
9-
108 const intervalRef = useRef < NodeJS . Timeout > ( ) ;
119 const [ duration , setDuration ] = useState < string > ( '' ) ;
1210
@@ -28,7 +26,7 @@ export function useTaskDuration(model: TaskModel | undefined) {
2826 clearInterval ( intervalRef . current ) ;
2927 }
3028 } ;
31- } , [ model , model . active ] ) ;
29+ } , [ model , model ? .active ] ) ;
3230
3331 return duration ;
3432}
@@ -40,24 +38,27 @@ export function useTimeItemsDuration(
4038 const [ duration , setDuration ] = useState < string > ( '' ) ;
4139 const intervalRef = useRef < NodeJS . Timeout > ( ) ;
4240
41+ const calcTaskDuration = useCallback (
42+ ( ) => msToTime ( calcDuration ( taskTime . map ( ( t ) => t . time ) ) , showSeconds ) ,
43+ [ showSeconds , taskTime ]
44+ ) ;
45+
4346 useEffect ( ( ) => {
47+ setDuration ( calcTaskDuration ( ) ) ;
48+
4449 const haveActiveTime = taskTime . some ( ( t ) => ! t . time . end ) ;
45- setDuration (
46- msToTime ( calcDuration ( taskTime . map ( ( t ) => t . time ) ) , showSeconds )
47- ) ;
4850 if ( haveActiveTime ) {
4951 intervalRef . current = setInterval ( ( ) => {
50- setDuration (
51- msToTime ( calcDuration ( taskTime . map ( ( t ) => t . time ) ) , showSeconds )
52- ) ;
52+ setDuration ( calcTaskDuration ( ) ) ;
5353 } , 1000 ) ;
5454 }
55+
5556 return ( ) => {
5657 if ( intervalRef . current ) {
5758 clearInterval ( intervalRef . current ) ;
5859 }
5960 } ;
60- } , [ taskTime ] ) ;
61+ } , [ calcTaskDuration , taskTime ] ) ;
6162
6263 return duration ;
6364}
@@ -66,23 +67,29 @@ export function useTimeRangeDuration(timeRange: ITimeRangeModel | undefined) {
6667 const [ duration , setDuration ] = useState < string > ( '' ) ;
6768 const intervalRef = useRef < NodeJS . Timeout > ( ) ;
6869
70+ const calcTimeRangeDuration = useCallback (
71+ ( ) => msToTime ( timeRange ? calcDuration ( [ timeRange ] ) : 0 ) ,
72+ [ timeRange ]
73+ ) ;
74+
6975 useEffect ( ( ) => {
7076 if ( ! timeRange ) {
7177 return ;
7278 }
79+ setDuration ( calcTimeRangeDuration ( ) ) ;
80+
7381 const haveActiveTime = ! timeRange . end ;
74- setDuration ( msToTime ( calcDuration ( [ timeRange ] ) ) ) ;
7582 if ( haveActiveTime ) {
7683 intervalRef . current = setInterval ( ( ) => {
77- setDuration ( msToTime ( calcDuration ( [ timeRange ] ) ) ) ;
84+ setDuration ( calcTimeRangeDuration ( ) ) ;
7885 } , 1000 ) ;
7986 }
8087 return ( ) => {
8188 if ( intervalRef . current ) {
8289 clearInterval ( intervalRef . current ) ;
8390 }
8491 } ;
85- } , [ timeRange ] ) ;
92+ } , [ calcTimeRangeDuration , timeRange ] ) ;
8693
8794 return duration ;
8895}
0 commit comments