Skip to content

TimeRangePicker

A time range picker component that displays a text field which opens a dialog for selecting start and end times.

import { TimeRangePicker } from '@mgcrea/react-native-jetpack-compose';
import type { TimeRange } from '@mgcrea/react-native-jetpack-compose';
const [timeRange, setTimeRange] = useState<TimeRange | null>(null);
<TimeRangePicker
label="Select Time Range"
value={timeRange}
onConfirm={setTimeRange}
/>
PropTypeDefaultDescription
valueTimeRange | nullnullSelected time range
is24HourbooleanSystem defaultUse 24-hour format
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: TimeRange) => voidUser confirmed selection
onCancel() => voidUser cancelled
onChange(range: TimeRange) => voidRange changed (before confirm)
interface TimeRange {
startTime: Date | null;
endTime: Date | null;
}
const [businessHours, setBusinessHours] = useState<TimeRange | null>(null);
<TimeRangePicker
label="Business Hours"
value={businessHours}
onConfirm={setBusinessHours}
title="Set business hours"
is24Hour={true}
/>
const [meetingTime, setMeetingTime] = useState<TimeRange | null>(null);
// Calculate duration
const getDuration = (range: TimeRange | null): string => {
if (!range?.startTime || !range?.endTime) return '';
const startMinutes = range.startTime.getHours() * 60 + range.startTime.getMinutes();
const endMinutes = range.endTime.getHours() * 60 + range.endTime.getMinutes();
let durationMinutes = endMinutes - startMinutes;
// Handle overnight ranges
if (durationMinutes < 0) {
durationMinutes += 24 * 60;
}
const hours = Math.floor(durationMinutes / 60);
const minutes = durationMinutes % 60;
if (hours > 0 && minutes > 0) {
return `${hours}h ${minutes}m`;
} else if (hours > 0) {
return `${hours}h`;
} else {
return `${minutes}m`;
}
};
<TimeRangePicker
label="Meeting Time"
value={meetingTime}
onConfirm={setMeetingTime}
/>
<Text>Duration: {getDuration(meetingTime)}</Text>
const [shift, setShift] = useState<TimeRange | null>(null);
<TimeRangePicker
label="Shift Hours"
value={shift}
onConfirm={setShift}
title="Set shift schedule"
is24Hour={true}
/>
const [availability, setAvailability] = useState<TimeRange | null>(null);
<TimeRangePicker
label="Available Hours"
value={availability}
onConfirm={setAvailability}
title="When are you available?"
placeholder="Set your availability"
/>
const [eventDate, setEventDate] = useState<Date | null>(null);
const [eventTime, setEventTime] = useState<TimeRange | null>(null);
<DatePicker
label="Event Date"
value={eventDate}
onConfirm={setEventDate}
minDate={new Date()}
/>
<TimeRangePicker
label="Event Time"
value={eventTime}
onConfirm={setEventTime}
disabled={!eventDate}
/>
const [timeRange, setTimeRange] = useState<TimeRange | null>(null);
const formatTimeRange = (range: TimeRange | null): string => {
if (!range?.startTime || !range?.endTime) {
return 'Not set';
}
const options: Intl.DateTimeFormatOptions = {
hour: 'numeric',
minute: '2-digit',
hour12: true,
};
const start = range.startTime.toLocaleTimeString('en-US', options);
const end = range.endTime.toLocaleTimeString('en-US', options);
return `${start} - ${end}`;
};
<TimeRangePicker
label="Hours"
value={timeRange}
onConfirm={setTimeRange}
/>
<Text>{formatTimeRange(timeRange)}</Text>
interface DaySchedule {
day: string;
timeRange: TimeRange | null;
}
const [schedule, setSchedule] = useState<DaySchedule[]>([
{ day: 'Monday', timeRange: null },
{ day: 'Tuesday', timeRange: null },
{ day: 'Wednesday', timeRange: null },
{ day: 'Thursday', timeRange: null },
{ day: 'Friday', timeRange: null },
]);
{schedule.map((item, index) => (
<TimeRangePicker
key={item.day}
label={item.day}
value={item.timeRange}
onConfirm={(range) => {
const newSchedule = [...schedule];
newSchedule[index].timeRange = range;
setSchedule(newSchedule);
}}
is24Hour={true}
/>
))}
Use CaseComponent
Single time (alarm, appointment start)TimePicker
Time range (business hours, shifts, events)TimeRangePicker