@@ -68,48 +68,66 @@ const Input: React.FC<Props> = (e: Props) => {
68
68
( e : React . ChangeEvent < HTMLInputElement > ) => {
69
69
const inputValue = e . target . value ;
70
70
71
- const start = parseFormattedDate ( inputValue . slice ( 0 , 10 ) , displayFormat ) . format (
72
- DATE_FORMAT
73
- ) ;
74
- const end = asSingle
75
- ? start
76
- : parseFormattedDate ( inputValue . slice ( 11 , inputValue . length ) , displayFormat ) . format (
77
- DATE_FORMAT
78
- ) ;
79
-
80
- const input = inputRef ?. current ;
81
-
82
- if (
83
- start . length === 10 &&
84
- end . length === 10 &&
85
- dateIsValid ( new Date ( start ) ) &&
86
- dateIsValid ( new Date ( end ) ) &&
87
- ( dayjs ( start ) . isBefore ( end ) || asSingle )
88
- ) {
71
+ const dates = [ ] ;
72
+
73
+ if ( asSingle ) {
74
+ const date = parseFormattedDate ( inputValue , displayFormat ) ;
75
+ if ( dateIsValid ( date . toDate ( ) ) ) {
76
+ dates . push ( date . format ( DATE_FORMAT ) ) ;
77
+ }
78
+ } else {
79
+ const parsed = inputValue . split ( separator ) ;
80
+
81
+ let startDate = null ;
82
+ let endDate = null ;
83
+
84
+ if ( parsed . length === 2 ) {
85
+ startDate = parseFormattedDate ( parsed [ 0 ] , displayFormat ) ;
86
+ endDate = parseFormattedDate ( parsed [ 1 ] , displayFormat ) ;
87
+ } else {
88
+ const middle = Math . floor ( inputValue . length / 2 ) ;
89
+ startDate = parseFormattedDate ( inputValue . slice ( 0 , middle ) , displayFormat ) ;
90
+ endDate = parseFormattedDate ( inputValue . slice ( middle ) , displayFormat ) ;
91
+ }
92
+
93
+ if (
94
+ dateIsValid ( startDate . toDate ( ) ) &&
95
+ dateIsValid ( endDate . toDate ( ) ) &&
96
+ startDate . isBefore ( endDate )
97
+ ) {
98
+ dates . push ( startDate . format ( DATE_FORMAT ) ) ;
99
+ dates . push ( endDate . format ( DATE_FORMAT ) ) ;
100
+ }
101
+ }
102
+
103
+ if ( dates [ 0 ] ) {
89
104
changeDatepickerValue (
90
105
{
91
- startDate : start ,
92
- endDate : end
106
+ startDate : dates [ 0 ] ,
107
+ endDate : dates [ 1 ] || dates [ 0 ]
93
108
} ,
94
109
e . target
95
110
) ;
96
- if ( ! asSingle ) changeDayHover ( dayjs ( end ) . add ( - 1 , "day" ) . format ( DATE_FORMAT ) ) ;
97
- else changeDayHover ( start ) ;
98
- hideDatepicker ( ) ;
111
+ if ( dates [ 1 ] ) changeDayHover ( dayjs ( dates [ 1 ] ) . add ( - 1 , "day" ) . format ( DATE_FORMAT ) ) ;
112
+ else changeDayHover ( dates [ 0 ] ) ;
113
+ }
114
+
115
+ changeInputText ( e . target . value ) ;
116
+ } ,
117
+ [ asSingle , displayFormat , separator , changeDatepickerValue , changeDayHover , changeInputText ]
118
+ ) ;
119
+
120
+ const handleInputKeyDown = useCallback (
121
+ ( e : React . KeyboardEvent < HTMLInputElement > ) => {
122
+ if ( e . key === "Enter" ) {
123
+ const input = inputRef . current ;
99
124
if ( input ) {
100
125
input . blur ( ) ;
101
126
}
127
+ hideDatepicker ( ) ;
102
128
}
103
- changeInputText ( e . target . value ) ;
104
129
} ,
105
- [
106
- changeDatepickerValue ,
107
- changeDayHover ,
108
- changeInputText ,
109
- hideDatepicker ,
110
- displayFormat ,
111
- asSingle
112
- ]
130
+ [ hideDatepicker ]
113
131
) ;
114
132
115
133
const renderToggleIcon = useCallback (
@@ -266,6 +284,7 @@ const Input: React.FC<Props> = (e: Props) => {
266
284
autoComplete = "off"
267
285
role = "presentation"
268
286
onChange = { handleInputChange }
287
+ onKeyDown = { handleInputKeyDown }
269
288
/>
270
289
271
290
< button
0 commit comments