import { Dialog, ListItem, ListSeparator, Modal, Select, type SelectProps } from '@umami/react-zen'; import { endOfYear } from 'date-fns'; import { Fragment, type Key, useState } from 'react'; import { DateDisplay } from '@/components/common/DateDisplay'; import { useMessages, useMobile } from '@/components/hooks'; import { DatePickerForm } from '@/components/metrics/DatePickerForm'; import { parseDateRange } from '@/lib/date'; export interface DateFilterProps extends SelectProps { value?: string; onChange?: (value: string) => void; showAllTime?: boolean; renderDate?: boolean; placement?: any; } export function DateFilter({ value, onChange, showAllTime, renderDate, placement = 'bottom', ...props }: DateFilterProps) { const { formatMessage, labels } = useMessages(); const [showPicker, setShowPicker] = useState(false); const { startDate, endDate } = parseDateRange(value) || {}; const { isMobile } = useMobile(); const options = [ { label: formatMessage(labels.today), value: '0day' }, { label: formatMessage(labels.lastHours, { x: '24' }), value: '24hour', }, { label: formatMessage(labels.thisWeek), value: '0week', divider: true, }, { label: formatMessage(labels.lastDays, { x: '7' }), value: '7day', }, { label: formatMessage(labels.thisMonth), value: '0month', divider: true, }, { label: formatMessage(labels.lastDays, { x: '30' }), value: '30day', }, { label: formatMessage(labels.lastDays, { x: '90' }), value: '90day', }, { label: formatMessage(labels.thisYear), value: '0year' }, { label: formatMessage(labels.lastMonths, { x: '6' }), value: '6month', divider: true, }, { label: formatMessage(labels.lastMonths, { x: '12' }), value: '12month', }, showAllTime && { label: formatMessage(labels.allTime), value: 'all', divider: true, }, { label: formatMessage(labels.customRange), value: 'custom', divider: true, }, ] .filter(n => n) .map((a, id) => ({ ...a, id })); const handleChange = (value: Key) => { if (value === 'custom') { setShowPicker(true); return; } onChange(value.toString()); }; const handlePickerChange = (value: string) => { setShowPicker(false); onChange(value.toString()); }; const renderValue = ({ defaultChildren }) => { return value?.startsWith('range') || renderDate ? ( ) : ( defaultChildren ); }; const selectedValue = value.endsWith(':all') ? 'all' : value; return ( <> {showPicker && ( setShowPicker(false)} /> )} ); }