This repository has been archived by the owner on Jan 20, 2024. It is now read-only.
/
dateTimePicker.tsx
85 lines (81 loc) · 2.68 KB
/
dateTimePicker.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
import React from "react";
import parse from "date-fns/parse";
import format from "date-fns/format";
import {
dateTimeToUnixTime,
DateFormat,
TimeFormat,
} from "../../helpers/datetime";
import strings from "../assets/locales";
/** Helper for `new Date()`. */
const FDate = (v: number | undefined) => new Date(v || 0);
interface Props {
dateRequired?: boolean;
timeRequired?: boolean;
initialValue?: number;
onChange?: (date: number) => void;
}
interface State {
date: Date;
}
export class DateTimePicker extends React.Component<Props, State> {
state = {
date: FDate(this.props.initialValue),
};
componentDidUpdate = (prevProps: Props, prevState: State) => {
if (this.props.onChange) {
if (prevState.date !== this.state.date) {
this.props.onChange(dateTimeToUnixTime(this.state.date));
}
}
if (this.props.initialValue !== prevProps.initialValue) {
this.setState({ date: FDate(this.props.initialValue) });
}
};
updateDate = (e: React.FormEvent<HTMLInputElement>) => {
// event input is a string of format like "2020-01-03"
// eslint-disable-next-line react/no-access-state-in-setstate
const date = parse(e.currentTarget.value, DateFormat, this.state.date);
this.setState({ date });
};
updateTime = (e: React.FormEvent<HTMLInputElement>) => {
// input is a string of format like "13:45"
// eslint-disable-next-line react/no-access-state-in-setstate
const date = parse(e.currentTarget.value, TimeFormat, this.state.date);
this.setState({ date });
};
unsetDate = () => this.setState({ date: FDate(0) });
render = () => {
let date, time;
// date/time input sometimes reports weird values that are out of range
try {
date = format(this.state.date, DateFormat);
time = format(this.state.date, TimeFormat);
} catch {
date = "";
time = "";
}
return (
<div>
<input
type="date"
onChange={this.updateDate}
value={date}
required={this.props.dateRequired}
/>
<input
type="time"
onChange={this.updateTime}
value={time}
required={this.props.timeRequired}
/>
<input
type="button"
value={strings.editor_unsetTp}
onClick={this.unsetDate}
/>
</div>
);
};
}
export default DateTimePicker;