This repository has been archived by the owner on Jan 20, 2024. It is now read-only.
/
taskLine.tsx
102 lines (95 loc) · 3.47 KB
/
taskLine.tsx
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
import React from "react";
import { connect } from "react-redux";
import { withRouter, RouteComponentProps as RCP } from "react-router";
import format from "date-fns/format";
import Level from "../components/bulma/level";
import Button from "../components/bulma/button";
import { Task } from "../../typings/tasks";
import { Dispatch } from "../../typings/react";
import { updateTask } from "../../actions/tasks";
import strings from "../assets/locales";
const mapDispatchToProps = (dispatch: Dispatch) => ({
update: (task: Task) => dispatch(updateTask(task)),
});
interface Props extends ReturnType<typeof mapDispatchToProps>, RCP {
level: number;
task: Task;
}
interface State {
task: Task;
}
class TaskLine extends React.Component<Props, State> {
state = {
task: this.props.task,
};
componentDidUpdate = (prevProps: Props) => {
if (prevProps !== this.props) {
this.setState({
task: this.props.task,
});
}
};
toggleTask = (): void => {
const task: Task = { ...this.state.task };
task.Completed = !task.Completed;
this.props.update(task);
};
// Pp expands to a localized date string that looks like this:
// "05/29/1453, 12:00 AM"
fmtDate = (date: number) => format(new Date(date), "Pp");
gotoEditor = () => this.props.history.push(`/task/${this.state.task.ID}`);
render = () => {
const {
ID,
Completed,
ToRemove,
Text,
Deadline,
Reminder,
} = this.state.task;
let classNames: string[] = ["taskLine"];
Completed && classNames.push("taskCompleted");
ToRemove && classNames.push("taskToRemove");
Deadline && classNames.push("taskHasDeadline");
Reminder && classNames.push("taskHasReminder");
return (
<Level level isMobile className={classNames.join(" ")}>
<Level
level
levelItem
levelLeft
className="taskData"
onClick={this.gotoEditor}
>
<Level levelItem className="taskTextWrapper">
<span className="taskID">{`#${ID}`}</span>
{/* eslint-disable react/jsx-no-literals */}
<span className="taskText">{Text}</span>
</Level>
<Level levelItem className="taskDates">
<span className="taskDeadline">
{`(D: ${this.fmtDate(Deadline)})`}
{/* eslint-disable react/jsx-no-literals */}
</span>
<span className="taskReminder">
{`(R: ${this.fmtDate(Reminder)})`}
</span>
</Level>
</Level>
<Level levelItem levelRight className="taskButton">
<Button
value={
Completed
? strings.task_toggleBtnCompleted
: strings.task_toggleBtnPending
}
onClick={this.toggleTask}
/>
</Level>
</Level>
);
};
}
export default withRouter(connect(null, mapDispatchToProps)(TaskLine));