Skip to content
This repository was archived by the owner on Dec 26, 2022. It is now read-only.

Commit db81ba4

Browse files
committed
Refactoring TaskHooks
1 parent aa03b2d commit db81ba4

File tree

7 files changed

+35
-28
lines changed

7 files changed

+35
-28
lines changed

src/components/TaskControl/TaskControl.tsx

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -5,14 +5,14 @@ import { PauseOutlined } from '@ant-design/icons';
55
import './TaskControl.less';
66

77
import rootStore from '../../modules/RootStore';
8-
import { useTaskDuration } from '../../hooks/TaskHooks';
8+
import * as TaskHooks from '../../hooks/TaskHooks';
99
import CircleButton from '../CircleButton/CircleButton';
1010

1111
const { tasksStore, projectStore } = rootStore;
1212

1313
export default observer(function TaskControl() {
1414
const task = tasksStore.activeTask;
15-
const duration = useTaskDuration(task);
15+
const duration = TaskHooks.useTaskDuration(task);
1616

1717
const project = useMemo(() => {
1818
return projectStore.get(task?.projectId || '');
Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
import React from 'react';
22

3-
import { useTimeRangeDuration } from '../../../hooks/TaskHooks';
3+
import * as TaskHooks from '../../../hooks/TaskHooks';
44
import { ITimeRangeModel } from '../../../models/TaskModel';
55

66
interface TimeRangeDurationProps {
@@ -10,7 +10,7 @@ interface TimeRangeDurationProps {
1010
export default function TimeRangeDuration({
1111
timeRange,
1212
}: TimeRangeDurationProps) {
13-
const duration = useTimeRangeDuration(timeRange);
13+
const duration = TaskHooks.useTimeRangeDuration(timeRange);
1414

1515
return <div>{duration}</div>;
1616
}

src/helpers/DateTime.ts

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -31,14 +31,14 @@ export function msToTime(s: number, showSeconds: boolean = true) {
3131
return `${timePad(hrs)}:${timePad(mins)}`;
3232
}
3333

34-
export function calcDuration(taskTime: ITimeRangeModel[]) {
34+
export function calcDuration(taskTime: ITimeRangeModel[]): number {
3535
return taskTime.reduce((prev, timeRange) => {
3636
if (!timeRange.start) {
3737
return 0;
3838
}
39-
if (timeRange.end) {
40-
return prev + timeRange.end.getTime() - timeRange.start.getTime();
39+
if (!timeRange.end) {
40+
return prev + new Date().getTime() - timeRange.start.getTime();
4141
}
42-
return prev + new Date().getTime() - timeRange.start.getTime();
42+
return prev + timeRange.end.getTime() - timeRange.start.getTime();
4343
}, 0);
4444
}

src/hooks/TaskHooks.ts

Lines changed: 21 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -1,12 +1,10 @@
1-
import { useEffect, useRef, useState } from 'react';
1+
import { useCallback, useEffect, useRef, useState } from 'react';
22

33
import { calcDuration, msToTime } from '../helpers/DateTime';
44
import TaskModel, { ITimeRangeModel } from '../models/TaskModel';
55
import TaskTimeItemModel from '../models/TaskTimeItemModel';
66

77
export 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
}
Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,14 +1,14 @@
11
import React from 'react';
22
import { observer } from 'mobx-react';
33

4-
import { useTimeItemsDuration } from '../../../../hooks/TaskHooks';
4+
import * as TaskHooks from '../../../../hooks/TaskHooks';
55
import TaskTimeItemModel from '../../../../models/TaskTimeItemModel';
66

77
interface TotalHoursProps {
88
timeItems: TaskTimeItemModel[];
99
}
1010

1111
export default observer(function TotalHours({ timeItems }: TotalHoursProps) {
12-
const duration = useTimeItemsDuration(timeItems);
12+
const duration = TaskHooks.useTimeItemsDuration(timeItems);
1313
return <div>{duration}</div>;
1414
});

src/screens/projects/components/DrawerTask/components/Duration.tsx

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -6,15 +6,15 @@ import { createUseStyles } from 'react-jss';
66
import IconTile from '../../../../../components/IconTile/IconTile';
77
import PlayStopButton from '../../../../../components/PlayStopButton/PlayStopButton';
88
import TaskModel from '../../../../../models/TaskModel';
9-
import { useTaskDuration } from '../../../../../hooks/TaskHooks';
9+
import * as TaskHooks from '../../../../../hooks/TaskHooks';
1010

1111
interface DurationProps {
1212
task?: TaskModel;
1313
}
1414

1515
export default observer(function Duration({ task }: DurationProps) {
1616
const classes = useStyle();
17-
const duration = useTaskDuration(task);
17+
const duration = TaskHooks.useTaskDuration(task);
1818

1919
return (
2020
<div className={classes.root}>

src/screens/projects/components/TaskNode/TaskNode.tsx

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -9,7 +9,7 @@ import { createUseStyles } from 'react-jss';
99

1010
import TaskModel from '../../../../models/TaskModel';
1111
import rootStore from '../../../../modules/RootStore';
12-
import { useTaskDuration } from '../../../../hooks/TaskHooks';
12+
import * as TaskHooks from '../../../../hooks/TaskHooks';
1313

1414
const { tasksStore } = rootStore;
1515

@@ -20,7 +20,7 @@ interface TaskNodeProps {
2020
export default observer(function TaskNode({ task }: TaskNodeProps) {
2121
const classes = useStyle();
2222

23-
const duration = useTaskDuration(task);
23+
const duration = TaskHooks.useTaskDuration(task);
2424

2525
function preventDefault(fn: () => void) {
2626
return (e: SyntheticEvent) => {

0 commit comments

Comments
 (0)