import React, { useMemo, useRef } from 'react'; import { observer } from 'mobx-react-lite'; import { Box, DatePicker, DatePickerProps, Text, TimeInput, Input, TimeInputProps, } from '@wix/design-system'; import { DateRangePickerState } from '../../state'; import { TimeSmall } from '@wix/wix-ui-icons-common'; import { useWindowFlipPopoverProps } from '../../utils/useWindowFlipPopoverProps'; import { usePatternsTheme } from '../../themes/PatternsThemeProvider'; export interface DateRangePickerProps extends Partial { state: DateRangePickerState; } function _DateRangePicker(props: DateRangePickerProps) { const { state, dataHook, popoverProps, ...rest } = props; const { translate: t, filterByTime } = state; const datePickerFrom = useRef(null); const datePickerTo = useRef(null); const { windowFlipPopoverProps } = useWindowFlipPopoverProps({ popoverProps, }); const { rangePicker } = usePatternsTheme(); const commonInputProps = { size: rangePicker.size, }; const commonDatePickerProps: Partial = { ...commonInputProps, shouldCloseOnSelect: true, dateStyle: 'medium', width: filterByTime ? '100%' : rangePicker.width, zIndex: rangePicker.zIndex, }; const commonTimeInputProps: Partial = { ...commonInputProps, prefix: ( ), popoverProps: windowFlipPopoverProps, }; const filterDateFrom = useMemo( () => (date: Date) => state.filterDateFrom(date), [state.to], ); const filterDateTo = useMemo( () => (date: Date) => state.filterDateTo(date), [state.from], ); const filterDateTimeFrom = useMemo( () => (date: Date) => state.filterDateTimeFrom(date), [state.to, state.from, state.isToTimeSet], ); const filterDateTimeTo = useMemo( () => (date: Date) => state.filterDateTimeTo(date), [state.from, state.to, state.isFromTimeSet], ); const fromPicker = ( state.onFromSelected(from)} value={state.from ?? undefined} filterDate={filterDateFrom} onClose={() => state.onFromClosed()} dataHook="date-range-picker-from" popoverProps={{ ...windowFlipPopoverProps, placement: 'bottom-start', }} clearButton inputProps={{ clearButtonAriaLabel: t( 'cairo.filtersPanel.date.from.clearButton.ariaLabel', ), }} onClear={() => state.onFromSelected(null)} {...rest} {...commonDatePickerProps} /> ); const toPicker = ( state.onToSelected(to)} value={state.to ?? undefined} filterDate={filterDateTo} onClose={() => state.onToClosed()} dataHook="date-range-picker-to" popoverProps={{ ...windowFlipPopoverProps, placement: 'bottom-end', }} clearButton inputProps={{ clearButtonAriaLabel: t( 'cairo.filtersPanel.date.to.clearButton.ariaLabel', ), }} onClear={() => state.onToSelected(null)} {...rest} {...commonDatePickerProps} /> ); return ( {t('cairo.filtersPanel.date.from.placeholder')} {filterByTime ? ( {fromPicker} state.onFromTimeSelected(date)} disabled={!state.from} filterTime={filterDateTimeFrom} size="small" {...commonTimeInputProps} /> ) : ( fromPicker )} {t('cairo.filtersPanel.date.to.placeholder')} {filterByTime ? ( {toPicker} state.onToTimeSelected(date)} disabled={!state.to} filterTime={filterDateTimeTo} {...commonTimeInputProps} /> ) : ( toPicker )} ); } export const DateRangePicker = observer(_DateRangePicker);