1- import { useCallback , useEffect , useRef , useState } from 'react' ;
1+ import { useCallback , useEffect , useMemo , useRef , useState } from 'react' ;
2+ import { isBefore } from 'date-fns' ;
23
3- import { calcDuration , msToTime } from '../helpers/DateTime' ;
4+ import { calcDuration , calcDurationGaps , msToTime } from '../helpers/DateTime' ;
45import TaskModel , { ITimeRangeModel } from '../models/TaskModel' ;
56import TaskTimeItemModel from '../models/TaskTimeItemModel' ;
67
@@ -31,25 +32,33 @@ export function useTaskDuration(model: TaskModel | undefined) {
3132 return duration ;
3233}
3334
34- export function useTimeItemsDuration (
35- taskTime : TaskTimeItemModel [ ] ,
36- showSeconds : boolean = false
37- ) {
38- const [ duration , setDuration ] = useState < string > ( '' ) ;
35+ export function useTimeItemsDuration ( taskTime : TaskTimeItemModel [ ] ) {
36+ const [ durationMs , setDurationMs ] = useState < number > ( 0 ) ;
37+ const [ gapsMs , setGapsMs ] = useState < number > ( 0 ) ;
3938 const intervalRef = useRef < NodeJS . Timeout > ( ) ;
4039
4140 const calcTaskDuration = useCallback (
42- ( ) => msToTime ( calcDuration ( taskTime . map ( ( t ) => t . time ) ) , showSeconds ) ,
43- [ showSeconds , taskTime ]
41+ ( ) => calcDuration ( taskTime . map ( ( t ) => t . time ) ) ,
42+ [ taskTime ]
43+ ) ;
44+
45+ const calcTaskGapsDuration = useCallback (
46+ ( ) => calcDurationGaps ( taskTime . map ( ( t ) => t . time ) ) ,
47+ [ taskTime ]
4448 ) ;
4549
50+ const setTimes = useCallback ( ( ) => {
51+ setDurationMs ( calcTaskDuration ( ) ) ;
52+ setGapsMs ( calcTaskGapsDuration ( ) ) ;
53+ } , [ calcTaskDuration , calcTaskGapsDuration ] ) ;
54+
4655 useEffect ( ( ) => {
47- setDuration ( calcTaskDuration ( ) ) ;
56+ setTimes ( ) ;
4857
4958 const haveActiveTime = taskTime . some ( ( t ) => ! t . time . end ) ;
5059 if ( haveActiveTime ) {
5160 intervalRef . current = setInterval ( ( ) => {
52- setDuration ( calcTaskDuration ( ) ) ;
61+ setTimes ( ) ;
5362 } , 1000 ) ;
5463 }
5564
@@ -58,9 +67,12 @@ export function useTimeItemsDuration(
5867 clearInterval ( intervalRef . current ) ;
5968 }
6069 } ;
61- } , [ calcTaskDuration , taskTime ] ) ;
70+ } , [ setTimes , taskTime ] ) ;
6271
63- return duration ;
72+ return {
73+ durationMs,
74+ gapsMs,
75+ } ;
6476}
6577
6678export function useTimeRangeDuration ( timeRange : ITimeRangeModel | undefined ) {
@@ -93,3 +105,17 @@ export function useTimeRangeDuration(timeRange: ITimeRangeModel | undefined) {
93105
94106 return duration ;
95107}
108+
109+ export function useStartWorkingTime (
110+ timeItems : TaskTimeItemModel [ ]
111+ ) : Date | undefined {
112+ return useMemo ( ( ) => {
113+ let minTime : Date | undefined ;
114+ timeItems . forEach ( ( time ) => {
115+ if ( ! minTime || isBefore ( time . time . start , minTime ) ) {
116+ minTime = time . time . start ;
117+ }
118+ } ) ;
119+ return minTime ;
120+ } , [ timeItems ] ) ;
121+ }
0 commit comments