1
- import DatePicker from 'react-datepicker'
1
+ import DatePicker , { DatePickerProps } from 'react-datepicker'
2
2
import Icon from './Icon'
3
- import { useState } from 'react'
3
+ import { useState , FC } from 'react'
4
+
5
+ export interface DateSelectProps
6
+ extends Pick < DatePickerProps , 'dateFormat' | 'selected' > {
7
+ value ?: DatePickerProps [ 'value' ]
8
+ className ?: string
9
+ isValid ?: boolean
10
+ onChange ?: (
11
+ date : Date | null ,
12
+ event ?: React . MouseEvent < HTMLElement > | React . KeyboardEvent < HTMLElement > ,
13
+ ) => void
14
+ }
15
+
16
+ const DateSelect : FC < DateSelectProps > = ( {
17
+ className,
18
+ dateFormat,
19
+ isValid,
20
+ onChange,
21
+ selected,
22
+ value,
23
+ } ) => {
24
+ const [ isMonthPicker , setIsMonthPicker ] = useState ( false )
25
+ const [ isYearPicker , setIsYearPicker ] = useState ( false )
26
+ const [ touched , setTouched ] = useState ( false )
27
+ const [ isOpen , setIsOpen ] = useState ( false )
4
28
5
- const DateSelect = ( { dateFormat, onChange, onSelect, selected, value } ) => {
6
- const [ isMonthPicker , setMonthPicker ] = useState ( false )
7
- const [ isYearPicker , setYearPicker ] = useState ( false )
8
- const [ isOpen , setOpen ] = useState ( false )
9
29
return (
10
30
< Flex style = { { position : 'relative' } } >
11
31
< DatePicker
32
+ className = { `input-lg ${ className } ${
33
+ ! isValid && touched ? 'invalid' : ''
34
+ } `}
12
35
dateFormat = { dateFormat }
36
+ onFocus = { ( ) => setTouched ( true ) }
13
37
renderCustomHeader = { ( {
14
38
date,
15
39
decreaseMonth,
@@ -32,9 +56,9 @@ const DateSelect = ({ dateFormat, onChange, onSelect, selected, value }) => {
32
56
</ span >
33
57
< div
34
58
onClick = { ( ) => {
35
- setMonthPicker ( true )
59
+ setIsMonthPicker ( true )
36
60
if ( isMonthPicker ) {
37
- setYearPicker ( true )
61
+ setIsYearPicker ( true )
38
62
}
39
63
} }
40
64
className = 'react-datepicker-header-title'
@@ -64,25 +88,33 @@ const DateSelect = ({ dateFormat, onChange, onSelect, selected, value }) => {
64
88
</ Row >
65
89
) }
66
90
minDate = { new Date ( ) }
67
- onChange = { ( date , e ) => {
68
- if ( date < new Date ( ) ) {
69
- setMonthPicker ( false )
70
- setYearPicker ( false )
71
- onChange ( new Date ( ) )
72
- } else {
73
- onChange ( date )
74
- if ( ! e ) {
75
- setOpen ( false )
76
- }
77
- if ( isMonthPicker ) {
78
- setMonthPicker ( false )
79
- }
80
- if ( isYearPicker ) {
81
- setYearPicker ( false )
82
- }
91
+ onChange = { ( date , e ) : DatePickerProps [ 'onChange' ] => {
92
+ if ( date === null ) {
93
+ setIsMonthPicker ( false )
94
+ setIsYearPicker ( false )
95
+ onChange ?.( null )
96
+ return
97
+ }
98
+
99
+ const today = new Date ( )
100
+ if ( date < today ) {
101
+ setIsMonthPicker ( false )
102
+ setIsYearPicker ( false )
103
+ onChange ?.( new Date ( ) )
104
+ return
105
+ }
106
+
107
+ onChange ?.( date )
108
+ if ( ! e ) {
109
+ setIsOpen ( false )
110
+ }
111
+ if ( isMonthPicker ) {
112
+ setIsMonthPicker ( false )
113
+ }
114
+ if ( isYearPicker ) {
115
+ setIsYearPicker ( false )
83
116
}
84
117
} }
85
- className = 'input-lg'
86
118
formatWeekDay = { ( nameOfDay ) => nameOfDay . substr ( 0 , 1 ) }
87
119
showTimeSelect = { ! isMonthPicker && ! isYearPicker }
88
120
showMonthYearPicker = { isMonthPicker }
@@ -92,12 +124,12 @@ const DateSelect = ({ dateFormat, onChange, onSelect, selected, value }) => {
92
124
selected = { selected }
93
125
value = { value }
94
126
timeFormat = 'HH:mm'
95
- onInputClick = { ( ) => setOpen ( true ) }
127
+ onInputClick = { ( ) => setIsOpen ( true ) }
96
128
onClickOutside = { ( e ) => {
97
129
if ( e ) {
98
- setOpen ( false )
99
- setMonthPicker ( false )
100
- setYearPicker ( false )
130
+ setIsOpen ( false )
131
+ setIsMonthPicker ( false )
132
+ setIsYearPicker ( false )
101
133
}
102
134
} }
103
135
open = { isOpen }
0 commit comments