File tree Expand file tree Collapse file tree 3 files changed +49
-6
lines changed
Expand file tree Collapse file tree 3 files changed +49
-6
lines changed Original file line number Diff line number Diff line change 11import { msToTime } from '../helpers/DateTime' ;
22import TaskModel from '../models/TaskModel' ;
33import { useEffect , useRef , useState } from 'react' ;
4+ import TaskTimeModel from '../models/TaskTimeModel' ;
45
5- /**
6- *
7- * @param model
8- */
96export function useTaskDuration ( model : TaskModel | undefined ) {
107 model = model || ( { } as TaskModel ) ;
118
@@ -34,3 +31,34 @@ export function useTaskDuration(model: TaskModel | undefined) {
3431
3532 return duration ;
3633}
34+
35+ function calcDuration ( taskTime : TaskTimeModel [ ] ) {
36+ return taskTime . reduce ( ( prev , curr ) => {
37+ if ( curr . time . end ) {
38+ return prev + curr . time . end . getTime ( ) - curr . time . start . getTime ( ) ;
39+ }
40+ return prev + new Date ( ) . getTime ( ) - curr . time . start . getTime ( ) ;
41+ } , 0 ) ;
42+ }
43+
44+ export function useTimeItemsDuration ( taskTime : TaskTimeModel [ ] ) {
45+ const [ duration , setDuration ] = useState < string > ( '' ) ;
46+ const intervalRef = useRef < NodeJS . Timeout > ( ) ;
47+
48+ useEffect ( ( ) => {
49+ const haveActiveTime = taskTime . some ( ( t ) => ! t . time . end ) ;
50+ setDuration ( msToTime ( calcDuration ( taskTime ) , false ) ) ;
51+ if ( haveActiveTime ) {
52+ intervalRef . current = setInterval ( ( ) => {
53+ setDuration ( msToTime ( calcDuration ( taskTime ) , false ) ) ;
54+ } , 1000 ) ;
55+ }
56+ return ( ) => {
57+ if ( intervalRef . current ) {
58+ clearInterval ( intervalRef . current ) ;
59+ }
60+ } ;
61+ } , [ taskTime ] ) ;
62+
63+ return duration ;
64+ }
Original file line number Diff line number Diff line change 1- import React , { useState } from 'react' ;
1+ import React , { useMemo , useState } from 'react' ;
22import { Layout , Space } from 'antd' ;
33import { observer } from 'mobx-react' ;
44
@@ -11,6 +11,7 @@ import SelectDate from './components/SelectDate/SelectDate';
1111import TimeRangeModal from '../../components/TimeRangeModal/TimeRangeModal' ;
1212import TaskTimeModel from '../../models/TaskTimeModel' ;
1313import { Undefined } from '../../types/CommonTypes' ;
14+ import TotalHours from './components/TotalHours/TotalHours' ;
1415
1516const { tasksStore } = rootStore ;
1617
@@ -21,13 +22,14 @@ export default observer(function HoursView() {
2122 Undefined < TaskTimeModel >
2223 > ( ) ;
2324
24- const tasks = tasksStore . getTasksByDate ( date ) ;
25+ const tasks = useMemo ( ( ) => tasksStore . getTasksByDate ( date ) , [ date ] ) ;
2526 const timeItems = getTimeItems ( tasks , date ) ;
2627
2728 return (
2829 < Layout className = "hours" >
2930 < Space direction = "vertical" >
3031 < SelectDate date = { date } onChange = { setDate } />
32+ < TotalHours timeItems = { timeItems } />
3133 { timeItems . map ( ( taskTime , index ) => (
3234 < HoursCard
3335 key = { index }
Original file line number Diff line number Diff line change 1+ import React from 'react' ;
2+
3+ import { useTimeItemsDuration } from '../../../../hooks/TaskHooks' ;
4+ import TaskTimeModel from '../../../../models/TaskTimeModel' ;
5+
6+ interface TotalHoursProps {
7+ timeItems : TaskTimeModel [ ] ;
8+ }
9+
10+ export default function TotalHours ( { timeItems } : TotalHoursProps ) {
11+ const duration = useTimeItemsDuration ( timeItems ) ;
12+ return < div > { duration } </ div > ;
13+ }
You can’t perform that action at this time.
0 commit comments