@@ -4,7 +4,7 @@ import { styled } from "styled-components";
4
4
import Dropdown from "../Dropdown/Dropdown" ;
5
5
import { Container } from "../Container/Container" ;
6
6
import { IconButton } from "../IconButton/IconButton" ;
7
- import { DatePickerInput } from "./Common" ;
7
+ import { DateRangePickerInput } from "./Common" ;
8
8
9
9
const locale = "en-US" ;
10
10
const weekdayFormatter = new Intl . DateTimeFormat ( locale , { weekday : "short" } ) ;
@@ -114,7 +114,6 @@ const DateTableCell = styled.td<{
114
114
interface CalendarProps {
115
115
closeDatepicker : ( ) => void ;
116
116
futureDatesDisabled : boolean ;
117
- selectedDate ?: Date ;
118
117
setSelectedDate : ( selectedDate : Date ) => void ;
119
118
startDate ?: Date ;
120
119
endDate ?: Date ;
@@ -123,7 +122,6 @@ interface CalendarProps {
123
122
const Calendar = ( {
124
123
closeDatepicker,
125
124
futureDatesDisabled,
126
- selectedDate,
127
125
setSelectedDate,
128
126
startDate,
129
127
endDate,
@@ -133,9 +131,6 @@ const Calendar = ({
133
131
defaultWeekStart : 1 ,
134
132
} ;
135
133
136
- if ( selectedDate ) {
137
- calendarOptions . defaultDate = selectedDate ;
138
- }
139
134
const { body, headers, month, navigation, year } = useCalendar ( calendarOptions ) ;
140
135
141
136
const handleNextClick = ( ) : void => {
@@ -146,14 +141,14 @@ const Calendar = ({
146
141
navigation . toPrev ( ) ;
147
142
} ;
148
143
149
- const handleMouseOut = ( ) : void => {
150
- setHoveredDate ( undefined ) ;
151
- } ;
152
-
153
144
const headerDate = new Date ( ) ;
154
145
headerDate . setMonth ( month ) ;
155
146
headerDate . setFullYear ( year ) ;
156
147
148
+ const handleMouseOut = ( ) : void => {
149
+ setHoveredDate ( undefined ) ;
150
+ } ;
151
+
157
152
return (
158
153
< DatePickerContainer
159
154
data-testid = "datepicker-calendar-container"
@@ -229,7 +224,9 @@ const Calendar = ({
229
224
return false ;
230
225
}
231
226
setSelectedDate ( fullDate ) ;
232
- closeDatepicker ( ) ;
227
+ if ( startDate && endDate ) {
228
+ closeDatepicker ( ) ;
229
+ }
233
230
} ;
234
231
235
232
return (
@@ -260,76 +257,86 @@ const Calendar = ({
260
257
} ;
261
258
262
259
export interface DatePickerProps {
263
- date ?: Date ;
260
+ endDate ?: Date ;
264
261
disabled ?: boolean ;
265
262
futureDatesDisabled ?: boolean ;
266
263
onSelectDate : ( selectedDate : Date ) => void ;
267
264
placeholder ?: string ;
265
+ startDate ?: Date ;
268
266
}
269
267
270
268
export const DateRangePicker = ( {
271
- date,
269
+ endDate,
270
+ startDate,
272
271
disabled = false ,
273
272
futureDatesDisabled = false ,
274
273
onSelectDate,
275
274
placeholder = "start date - end date" ,
276
275
} : DatePickerProps ) => {
277
276
const [ isOpen , setIsOpen ] = useState < boolean > ( false ) ;
278
- const [ selectedDate , setSelectedDate ] = useState < Date > ( ) ;
279
- const [ startDate , setStartDate ] = useState < Date > ( ) ;
280
- const [ endDate , setEndDate ] = useState < Date > ( ) ;
277
+ const [ selectedStartDate , setSelectedStartDate ] = useState < Date > ( ) ;
278
+ const [ selectedEndDate , setSelectedEndDate ] = useState < Date > ( ) ;
281
279
282
280
useEffect ( ( ) => {
283
- if ( date ) {
284
- setSelectedDate ( date ) ;
281
+ if ( startDate ) {
282
+ setSelectedStartDate ( startDate ) ;
285
283
}
286
- } , [ date ] ) ;
284
+ } , [ startDate ] ) ;
287
285
288
- const closeDatePicker = ( ) => {
289
- if ( startDate && endDate ) {
290
- setIsOpen ( false ) ;
286
+ useEffect ( ( ) => {
287
+ if ( endDate ) {
288
+ setSelectedEndDate ( endDate ) ;
291
289
}
290
+ } , [ endDate ] ) ;
291
+
292
+ useEffect ( ( ) => {
293
+ if ( selectedStartDate && selectedEndDate ) {
294
+ closeDatePicker ( ) ;
295
+ }
296
+ } , [ selectedStartDate , selectedEndDate ] ) ;
297
+
298
+ const closeDatePicker = ( ) => {
299
+ setIsOpen ( false ) ;
292
300
} ;
293
301
294
302
const handleSelectDate = ( selectedDate : Date ) : void => {
295
303
// Start date and end date are selected, user clicks end date.
296
304
// Reset the end date.
297
- if ( endDate && isSameDate ( endDate , selectedDate ) ) {
298
- setEndDate ( undefined ) ;
305
+ if ( selectedEndDate && isSameDate ( selectedEndDate , selectedDate ) ) {
306
+ setSelectedEndDate ( undefined ) ;
299
307
return ;
300
308
}
301
309
302
- if ( startDate ) {
303
- if ( isSameDate ( startDate , selectedDate ) ) {
310
+ if ( selectedStartDate ) {
311
+ if ( isSameDate ( selectedStartDate , selectedDate ) ) {
304
312
// Start date and end date are selected, user clicks start date.
305
313
// Set the start date to the old end date, reset end date.
306
- if ( endDate ) {
307
- setStartDate ( endDate ) ;
308
- setEndDate ( undefined ) ;
314
+ if ( selectedEndDate ) {
315
+ setSelectedStartDate ( selectedEndDate ) ;
316
+ setSelectedEndDate ( undefined ) ;
309
317
return ;
310
318
}
311
319
312
320
// Start date is selected, user clicks start date.
313
321
// Reset the start date.
314
- setStartDate ( undefined ) ;
322
+ setSelectedStartDate ( undefined ) ;
315
323
return ;
316
324
}
317
325
318
326
// Start date is selected, user clicks an earlier date.
319
327
// Set the earlier date to the new start date.
320
- if ( selectedDate < startDate ) {
321
- setStartDate ( selectedDate ) ;
328
+ if ( selectedDate < selectedStartDate ) {
329
+ setSelectedStartDate ( selectedDate ) ;
322
330
return ;
323
331
}
324
332
325
333
// Otherwise, set the end date to the date the user clicked.
326
- setEndDate ( selectedDate ) ;
327
- setSelectedDate ( selectedDate ) ;
334
+ setSelectedEndDate ( selectedDate ) ;
328
335
onSelectDate ( selectedDate ) ;
329
336
return ;
330
337
}
331
338
332
- setStartDate ( selectedDate ) ;
339
+ setSelectedStartDate ( selectedDate ) ;
333
340
} ;
334
341
335
342
return (
@@ -338,21 +345,22 @@ export const DateRangePicker = ({
338
345
open = { isOpen }
339
346
>
340
347
< Dropdown . Trigger disabled = { disabled } >
341
- < DatePickerInput
342
- data-testid = "datepicker-inpcontainer "
348
+ < DateRangePickerInput
349
+ data-testid = "datepicker-input-container "
343
350
disabled = { disabled }
344
351
isActive = { isOpen }
345
352
placeholder = { placeholder }
346
- selectedDate = { selectedDate }
353
+ selectedEndDate = { selectedEndDate }
354
+ selectedStartDate = { selectedStartDate }
347
355
/>
348
356
</ Dropdown . Trigger >
349
357
< Dropdown . Content align = "start" >
350
358
< Calendar
351
359
closeDatepicker = { closeDatePicker }
352
360
futureDatesDisabled = { futureDatesDisabled }
353
361
setSelectedDate = { handleSelectDate }
354
- startDate = { startDate }
355
- endDate = { endDate }
362
+ startDate = { selectedStartDate }
363
+ endDate = { selectedEndDate }
356
364
/>
357
365
</ Dropdown . Content >
358
366
</ Dropdown >
0 commit comments