forked from decred/politeiagui
-
Notifications
You must be signed in to change notification settings - Fork 0
/
DatePickerField.jsx
118 lines (109 loc) · 3.4 KB
/
DatePickerField.jsx
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
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
import React, { useState, useCallback } from "react";
import PropTypes from "prop-types";
import { classNames, DatePicker, Icon, Text } from "pi-ui";
import { FormikConsumer } from "formik";
import styles from "./DatePickerField.module.css";
import { Row } from "../layout";
import { MONTHS_LABELS } from "src/constants";
import { formatDateToInternationalString } from "src/helpers";
const DatePickerField = ({
name,
placeholder,
years,
className,
isRange,
error
}) => {
const [isOpen, setIsOpen] = useState(false);
const togglePicker = useCallback(() => {
setIsOpen(!isOpen);
}, [isOpen, setIsOpen]);
return (
<FormikConsumer>
{({ setFieldValue, setFieldTouched, values }) => {
const onDateChange = (year, month, day) => {
if (!!year && !!month && !!day) {
setFieldValue(name, { year, month, day });
}
setFieldTouched(name, true);
setIsOpen(false);
};
const value = values[name];
const onRangeChange = (year, month, day, idx) => {
if (!!year && !!month && !!day) {
const newValue = value ? [...value] : [];
newValue[idx] = { year, month, day };
setFieldValue(name, newValue);
}
};
const onDismiss = () => {
if (isOpen) {
setFieldTouched(name, true);
setIsOpen(false);
}
};
const formattedValue = () => {
// If range mode is on, format both values and return as string.
if (isRange) {
let firstFormattedValue = "";
if (value[0]) {
firstFormattedValue = `${formatDateToInternationalString(
value[0]
)} - `;
}
let secondFormattedValue;
if (value[1]) {
secondFormattedValue = `${formatDateToInternationalString(
value[1]
)}`;
}
return `${firstFormattedValue}${secondFormattedValue}`;
}
// In single mode return the formatted picked date.
return formatDateToInternationalString(value);
};
return (
<div
className={classNames("cursor-pointer", className)}
data-testid="datepicker">
<DatePicker
show={isOpen}
years={years}
isRange={isRange}
value={values[name]}
lang={MONTHS_LABELS}
onChange={isRange ? onRangeChange : onDateChange}
onDismiss={onDismiss}>
<Row
className={styles.box}
justify="space-between"
align="center"
noMargin
onClick={togglePicker}>
{value && formattedValue()}
{!value && (
<Text className={styles.placeholder}>{placeholder}</Text>
)}
<Icon type="calendar" />
</Row>
</DatePicker>
<p className={classNames(styles.errorMsg, styles.active)}>
{error}
</p>
</div>
);
}}
</FormikConsumer>
);
};
DatePickerField.propTypes = {
name: PropTypes.string.isRequired,
label: PropTypes.string,
year: PropTypes.object,
readOnly: PropTypes.bool,
className: PropTypes.string
};
DatePickerField.defaultProps = {
readOnly: false
};
export default DatePickerField;