Skip to content

Commit da89b40

Browse files
review feedback
1 parent 6f1d6f5 commit da89b40

File tree

2 files changed

+92
-40
lines changed

2 files changed

+92
-40
lines changed

src/components/DatePicker/Common.tsx

Lines changed: 44 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -60,3 +60,47 @@ export const DatePickerInput = ({
6060
);
6161
};
6262

63+
interface DateRangePickerInputProps {
64+
isActive: boolean;
65+
disabled: boolean;
66+
id?: string;
67+
placeholder?: string;
68+
selectedEndDate?: Date;
69+
selectedStartDate?: Date;
70+
}
71+
72+
export const DateRangePickerInput = ({
73+
isActive,
74+
disabled,
75+
id,
76+
placeholder,
77+
selectedEndDate,
78+
selectedStartDate,
79+
}: DateRangePickerInputProps) => {
80+
const defaultId = useId();
81+
82+
let formattedValue = "";
83+
if (selectedStartDate) {
84+
formattedValue = selectedDateFormatter.format(selectedStartDate);
85+
86+
formattedValue = `${formattedValue} - ${
87+
selectedEndDate ? selectedDateFormatter.format(selectedEndDate) : "end date"
88+
}`;
89+
}
90+
91+
return (
92+
<HighlightedInputWrapper
93+
$isActive={isActive}
94+
disabled={disabled}
95+
id={id ?? defaultId}
96+
>
97+
<Icon name="calendar" />
98+
<InputElement
99+
data-testid="datepicker-input"
100+
placeholder={placeholder}
101+
readOnly
102+
value={formattedValue}
103+
/>
104+
</HighlightedInputWrapper>
105+
);
106+
};

src/components/DatePicker/DateRangePicker.tsx

Lines changed: 48 additions & 40 deletions
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,7 @@ import { styled } from "styled-components";
44
import Dropdown from "../Dropdown/Dropdown";
55
import { Container } from "../Container/Container";
66
import { IconButton } from "../IconButton/IconButton";
7-
import { DatePickerInput } from "./Common";
7+
import { DateRangePickerInput } from "./Common";
88

99
const locale = "en-US";
1010
const weekdayFormatter = new Intl.DateTimeFormat(locale, { weekday: "short" });
@@ -114,7 +114,6 @@ const DateTableCell = styled.td<{
114114
interface CalendarProps {
115115
closeDatepicker: () => void;
116116
futureDatesDisabled: boolean;
117-
selectedDate?: Date;
118117
setSelectedDate: (selectedDate: Date) => void;
119118
startDate?: Date;
120119
endDate?: Date;
@@ -123,7 +122,6 @@ interface CalendarProps {
123122
const Calendar = ({
124123
closeDatepicker,
125124
futureDatesDisabled,
126-
selectedDate,
127125
setSelectedDate,
128126
startDate,
129127
endDate,
@@ -133,9 +131,6 @@ const Calendar = ({
133131
defaultWeekStart: 1,
134132
};
135133

136-
if (selectedDate) {
137-
calendarOptions.defaultDate = selectedDate;
138-
}
139134
const { body, headers, month, navigation, year } = useCalendar(calendarOptions);
140135

141136
const handleNextClick = (): void => {
@@ -146,14 +141,14 @@ const Calendar = ({
146141
navigation.toPrev();
147142
};
148143

149-
const handleMouseOut = (): void => {
150-
setHoveredDate(undefined);
151-
};
152-
153144
const headerDate = new Date();
154145
headerDate.setMonth(month);
155146
headerDate.setFullYear(year);
156147

148+
const handleMouseOut = (): void => {
149+
setHoveredDate(undefined);
150+
};
151+
157152
return (
158153
<DatePickerContainer
159154
data-testid="datepicker-calendar-container"
@@ -229,7 +224,9 @@ const Calendar = ({
229224
return false;
230225
}
231226
setSelectedDate(fullDate);
232-
closeDatepicker();
227+
if (startDate && endDate) {
228+
closeDatepicker();
229+
}
233230
};
234231

235232
return (
@@ -260,76 +257,86 @@ const Calendar = ({
260257
};
261258

262259
export interface DatePickerProps {
263-
date?: Date;
260+
endDate?: Date;
264261
disabled?: boolean;
265262
futureDatesDisabled?: boolean;
266263
onSelectDate: (selectedDate: Date) => void;
267264
placeholder?: string;
265+
startDate?: Date;
268266
}
269267

270268
export const DateRangePicker = ({
271-
date,
269+
endDate,
270+
startDate,
272271
disabled = false,
273272
futureDatesDisabled = false,
274273
onSelectDate,
275274
placeholder = "start date - end date",
276275
}: DatePickerProps) => {
277276
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>();
281279

282280
useEffect(() => {
283-
if (date) {
284-
setSelectedDate(date);
281+
if (startDate) {
282+
setSelectedStartDate(startDate);
285283
}
286-
}, [date]);
284+
}, [startDate]);
287285

288-
const closeDatePicker = () => {
289-
if (startDate && endDate) {
290-
setIsOpen(false);
286+
useEffect(() => {
287+
if (endDate) {
288+
setSelectedEndDate(endDate);
291289
}
290+
}, [endDate]);
291+
292+
useEffect(() => {
293+
if (selectedStartDate && selectedEndDate) {
294+
closeDatePicker();
295+
}
296+
}, [selectedStartDate, selectedEndDate]);
297+
298+
const closeDatePicker = () => {
299+
setIsOpen(false);
292300
};
293301

294302
const handleSelectDate = (selectedDate: Date): void => {
295303
// Start date and end date are selected, user clicks end date.
296304
// Reset the end date.
297-
if (endDate && isSameDate(endDate, selectedDate)) {
298-
setEndDate(undefined);
305+
if (selectedEndDate && isSameDate(selectedEndDate, selectedDate)) {
306+
setSelectedEndDate(undefined);
299307
return;
300308
}
301309

302-
if (startDate) {
303-
if (isSameDate(startDate, selectedDate)) {
310+
if (selectedStartDate) {
311+
if (isSameDate(selectedStartDate, selectedDate)) {
304312
// Start date and end date are selected, user clicks start date.
305313
// 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);
309317
return;
310318
}
311319

312320
// Start date is selected, user clicks start date.
313321
// Reset the start date.
314-
setStartDate(undefined);
322+
setSelectedStartDate(undefined);
315323
return;
316324
}
317325

318326
// Start date is selected, user clicks an earlier date.
319327
// Set the earlier date to the new start date.
320-
if (selectedDate < startDate) {
321-
setStartDate(selectedDate);
328+
if (selectedDate < selectedStartDate) {
329+
setSelectedStartDate(selectedDate);
322330
return;
323331
}
324332

325333
// Otherwise, set the end date to the date the user clicked.
326-
setEndDate(selectedDate);
327-
setSelectedDate(selectedDate);
334+
setSelectedEndDate(selectedDate);
328335
onSelectDate(selectedDate);
329336
return;
330337
}
331338

332-
setStartDate(selectedDate);
339+
setSelectedStartDate(selectedDate);
333340
};
334341

335342
return (
@@ -338,21 +345,22 @@ export const DateRangePicker = ({
338345
open={isOpen}
339346
>
340347
<Dropdown.Trigger disabled={disabled}>
341-
<DatePickerInput
342-
data-testid="datepicker-inpcontainer"
348+
<DateRangePickerInput
349+
data-testid="datepicker-input-container"
343350
disabled={disabled}
344351
isActive={isOpen}
345352
placeholder={placeholder}
346-
selectedDate={selectedDate}
353+
selectedEndDate={selectedEndDate}
354+
selectedStartDate={selectedStartDate}
347355
/>
348356
</Dropdown.Trigger>
349357
<Dropdown.Content align="start">
350358
<Calendar
351359
closeDatepicker={closeDatePicker}
352360
futureDatesDisabled={futureDatesDisabled}
353361
setSelectedDate={handleSelectDate}
354-
startDate={startDate}
355-
endDate={endDate}
362+
startDate={selectedStartDate}
363+
endDate={selectedEndDate}
356364
/>
357365
</Dropdown.Content>
358366
</Dropdown>

0 commit comments

Comments
 (0)