Skip to content

Commit 9da3586

Browse files
authored
fix: ensure the new date is always between max and min dates (#988)
1 parent 3cc4c34 commit 9da3586

File tree

3 files changed

+41
-18
lines changed

3 files changed

+41
-18
lines changed

example/src/DatePickerExample.js

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -113,8 +113,8 @@ function DatePickerExample({ theme }) {
113113
label="Date with minimum and maximum"
114114
placeholder="Select a date..."
115115
type="solid"
116-
minimumDate={new Date("April 10, 2023")}
117-
maximumDate={new Date("May 10, 2023")}
116+
minimumDate={new Date("2023-04-10")}
117+
maximumDate={new Date("2023-05-10")}
118118
/>
119119
</Section>
120120
<Section title="Styled">

packages/core/src/components/DatePicker/DatePicker.tsx

Lines changed: 24 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -32,6 +32,7 @@ import {
3232
paddingStyleNames,
3333
positionStyleNames,
3434
} from "../../utilities";
35+
import { parseDate } from "./parseDate";
3536

3637
const AnimatedText = Animated.createAnimatedComponent(Text);
3738

@@ -397,6 +398,29 @@ const DatePicker: React.FC<React.PropsWithChildren<Props>> = ({
397398
type === "solid" ? { marginHorizontal: 12 } : {},
398399
];
399400

401+
React.useEffect(() => {
402+
const currentDate = parseDate(value);
403+
404+
if (!currentDate) return;
405+
406+
const minDate = parseDate(minimumDate);
407+
const maxDate = parseDate(maximumDate);
408+
409+
let newDate = currentDate;
410+
411+
if (minDate && currentDate < minDate) {
412+
newDate = minDate;
413+
}
414+
if (maxDate && currentDate > maxDate) {
415+
newDate = maxDate;
416+
}
417+
418+
if (newDate !== currentDate) {
419+
setValue(newDate);
420+
onDateChange(newDate);
421+
}
422+
}, [value, minimumDate, maximumDate, onDateChange]);
423+
400424
const Picker = (
401425
<DateTimePicker
402426
value={getValidDate()}
@@ -620,20 +644,4 @@ const styles = StyleSheet.create({
620644
},
621645
});
622646

623-
function parseDate(date?: string | Date) {
624-
if (typeof date === "string") {
625-
const parsed = Date.parse(date);
626-
if (!isNaN(parsed)) {
627-
return new Date(parsed);
628-
}
629-
console.warn(
630-
"Invalid date string:",
631-
`'${date}'.`,
632-
"See https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Date#date_time_string_format"
633-
);
634-
return undefined;
635-
}
636-
return date;
637-
}
638-
639647
export default withTheme(DatePicker);
Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,15 @@
1+
export function parseDate(date?: string | Date) {
2+
if (typeof date === "string") {
3+
const parsed = Date.parse(date);
4+
if (!isNaN(parsed)) {
5+
return new Date(parsed);
6+
}
7+
console.warn(
8+
"Invalid date string:",
9+
`'${date}'.`,
10+
"See https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Date#date_time_string_format"
11+
);
12+
return undefined;
13+
}
14+
return date;
15+
}

0 commit comments

Comments
 (0)