Skip to content

Commit 3bf98a7

Browse files
author
Dmitry Yadrikhinsky
committed
[TotalHours] Move into component
1 parent 30e727a commit 3bf98a7

File tree

3 files changed

+49
-6
lines changed

3 files changed

+49
-6
lines changed

src/hooks/TaskHooks.ts

Lines changed: 32 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,11 +1,8 @@
11
import { msToTime } from '../helpers/DateTime';
22
import TaskModel from '../models/TaskModel';
33
import { useEffect, useRef, useState } from 'react';
4+
import TaskTimeModel from '../models/TaskTimeModel';
45

5-
/**
6-
*
7-
* @param model
8-
*/
96
export 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+
}

src/screens/hours/HoursView.tsx

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
import React, { useState } from 'react';
1+
import React, { useMemo, useState } from 'react';
22
import { Layout, Space } from 'antd';
33
import { observer } from 'mobx-react';
44

@@ -11,6 +11,7 @@ import SelectDate from './components/SelectDate/SelectDate';
1111
import TimeRangeModal from '../../components/TimeRangeModal/TimeRangeModal';
1212
import TaskTimeModel from '../../models/TaskTimeModel';
1313
import { Undefined } from '../../types/CommonTypes';
14+
import TotalHours from './components/TotalHours/TotalHours';
1415

1516
const { 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}
Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,13 @@
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+
}

0 commit comments

Comments
 (0)