import { useState } from 'react'; import { Dropdown, DropdownItem, DropdownMenu, DropdownToggle } from 'reactstrap'; import { useToggle } from '../helpers/hooks'; import { DateInterval, DateRange, dateRangeIsEmpty, rangeOrIntervalToString, intervalToDateRange, rangeIsInterval, } from './types'; import DateRangeRow from './DateRangeRow'; import './DateRangeSelector.scss'; export interface DateRangeSelectorProps { initialDateRange?: DateInterval | DateRange; disabled?: boolean; onDatesChange: (dateRange: DateRange) => void; defaultText: string; } export const DateRangeSelector = ( { onDatesChange, initialDateRange, defaultText, disabled = false }: DateRangeSelectorProps, ) => { const [ isOpen, toggle ] = useToggle(); const [ activeInterval, setActiveInterval ] = useState( rangeIsInterval(initialDateRange) ? initialDateRange : undefined, ); const [ activeDateRange, setActiveDateRange ] = useState( !rangeIsInterval(initialDateRange) ? initialDateRange : undefined, ); const updateDateRange = (dateRange: DateRange) => { setActiveInterval(undefined); setActiveDateRange(dateRange); onDatesChange(dateRange); }; const updateInterval = (dateInterval?: DateInterval) => () => { setActiveInterval(dateInterval); setActiveDateRange(undefined); onDatesChange(intervalToDateRange(dateInterval)); }; return ( {rangeOrIntervalToString(activeInterval ?? activeDateRange) ?? defaultText} {defaultText} {([ 'today', 'yesterday', 'last7Days', 'last30Days', 'last90Days', 'last180days', 'last365Days' ] as DateInterval[]).map( (interval) => ( {rangeOrIntervalToString(interval)} ), )} Custom: updateDateRange({ ...activeDateRange, startDate })} onEndDateChange={(endDate) => updateDateRange({ ...activeDateRange, endDate })} /> ); };