import React, { ComponentPropsWithoutRef, Fragment, MouseEvent, useRef, } from 'react'; import {DateRangeIcon} from '../../../../../icons/material/DateRange'; import {DialogTrigger} from '../../../../overlays/dialog/dialog-trigger'; import {DatePickerField, DatePickerFieldProps} from './date-picker-field'; import {useDateRangePickerState} from './use-date-range-picker-state'; import {ArrowRightAltIcon} from '../../../../../icons/material/ArrowRightAlt'; import {DatePickerValueProps} from '../date-picker/use-date-picker-state'; import {DateRangeValue} from './date-range-value'; import {DateSegmentList} from '../segments/date-segment-list'; import {DateRangeDialog} from './dialog/date-range-dialog'; import {useIsMobileMediaQuery} from '../../../../../utils/hooks/is-mobile-media-query'; export interface DateRangePickerProps extends DatePickerValueProps>, Omit {} export function DateRangePicker(props: DateRangePickerProps) { const {granularity, closeDialogOnSelection, ...fieldProps} = props; const state = useDateRangePickerState(props); const inputRef = useRef(null); const isMobile = useIsMobileMediaQuery(); const hideCalendarIcon = isMobile && granularity !== 'day'; const dialog = ( ); const openOnClick: ComponentPropsWithoutRef<'div'> = { onClick: e => { e.stopPropagation(); e.preventDefault(); if (!isHourSegment(e)) { state.setCalendarIsOpen(true); } else { state.setCalendarIsOpen(false); } }, }; const value = state.selectedValue; const onChange = state.setSelectedValue; return ( : undefined} {...fieldProps} > { onChange({start: newValue, end: value.end}); }} /> { onChange({start: value.start, end: newValue}); }} /> {dialog} ); } function isHourSegment(e: MouseEvent): boolean { return ['hour', 'minute', 'dayPeriod'].includes( (e.currentTarget as HTMLElement).ariaLabel || '' ); }