Skip to content

DateRangePicker

A date range picker component that displays a text field which opens a Material 3 date range picker dialog when tapped.

import { DateRangePicker } from '@mgcrea/react-native-jetpack-compose';
import type { DateRange } from '@mgcrea/react-native-jetpack-compose';
const [dateRange, setDateRange] = useState<DateRange | null>(null);
<DateRangePicker
label="Select Dates"
value={dateRange}
onConfirm={setDateRange}
/>
PropTypeDefaultDescription
valueDateRange | nullnullSelected date range
initialDisplayedMonthDate | number | string-Initially displayed month
minDateDate | number | string-Minimum selectable date
maxDateDate | number | string-Maximum selectable date
yearRangeYearRange-Year range for year selector
initialDisplayMode'picker' | 'input''picker'Initial display mode
showModeTogglebooleantrueShow mode toggle button
confirmLabelstring'OK'Confirm button text
cancelLabelstring'Cancel'Cancel button text
titlestring-Dialog title
labelstring-Text field label
placeholderstring-Text field placeholder
disabledbooleanfalseDisable the picker
styleViewStyle-Container style
EventTypeDescription
onConfirm(range: DateRange) => voidUser pressed OK
onCancel() => voidUser pressed Cancel
onChange(range: DateRange) => voidRange changed (before confirm)
interface DateRange {
startDate: Date | null;
endDate: Date | null;
}
interface YearRange {
start: number;
end: number;
}
const [stayDates, setStayDates] = useState<DateRange | null>(null);
<DateRangePicker
label="Stay Dates"
value={stayDates}
onConfirm={setStayDates}
minDate={new Date()}
title="Select check-in and check-out"
placeholder="Select dates"
/>
{stayDates?.startDate && stayDates?.endDate && (
<Text>
{Math.ceil((stayDates.endDate.getTime() - stayDates.startDate.getTime()) / (1000 * 60 * 60 * 24))} nights
</Text>
)}
const [vacation, setVacation] = useState<DateRange | null>(null);
// Allow planning up to 1 year in advance
const maxDate = new Date();
maxDate.setFullYear(maxDate.getFullYear() + 1);
<DateRangePicker
label="Vacation Dates"
value={vacation}
onConfirm={setVacation}
minDate={new Date()}
maxDate={maxDate}
title="Plan your vacation"
/>
const [reportPeriod, setReportPeriod] = useState<DateRange | null>(null);
<DateRangePicker
label="Report Period"
value={reportPeriod}
onConfirm={setReportPeriod}
maxDate={new Date()} // No future dates for reports
title="Select report period"
/>
const [dateRange, setDateRange] = useState<DateRange | null>(null);
const [error, setError] = useState<string | null>(null);
const handleConfirm = (range: DateRange) => {
const { startDate, endDate } = range;
if (startDate && endDate) {
const days = Math.ceil(
(endDate.getTime() - startDate.getTime()) / (1000 * 60 * 60 * 24)
);
if (days > 14) {
setError('Maximum booking is 14 days');
return;
}
}
setError(null);
setDateRange(range);
};
<DateRangePicker
label="Booking Dates"
value={dateRange}
onConfirm={handleConfirm}
/>
{error && <Text style={{ color: 'red' }}>{error}</Text>}
<DateRangePicker
label="Date Range"
value={dateRange}
onConfirm={setDateRange}
initialDisplayMode="input"
/>
const [dateRange, setDateRange] = useState<DateRange | null>(null);
const formatRange = (range: DateRange | null): string => {
if (!range?.startDate || !range?.endDate) {
return 'No dates selected';
}
const options: Intl.DateTimeFormatOptions = {
month: 'short',
day: 'numeric',
year: 'numeric',
};
return `${range.startDate.toLocaleDateString('en-US', options)} - ${range.endDate.toLocaleDateString('en-US', options)}`;
};
<DateRangePicker
label="Trip Dates"
value={dateRange}
onConfirm={setDateRange}
/>
<Text>{formatRange(dateRange)}</Text>
Use CaseComponent
Single date (birthday, appointment)DatePicker
Date range (hotel stay, vacation, report period)DateRangePicker