import React, { useState, useRef } from 'react'; import { Calendar, RefreshCw, ChevronDown } from 'lucide-react'; import type { DateRange } from '../types'; import { endOfLocalDay, formatDateParam, parseLocalDateInput, rangeForDay, rangeForLastDays, rangeForPreviousDay, startOfLocalDay } from '../dateRanges'; interface DateRangePickerProps { dateRange: DateRange; onChange: (range: DateRange) => void; refreshInterval?: number; setRefreshInterval?: (interval: number) => void; onManualRefresh?: () => void; } const PRESETS = [ { label: 'Hoje', getRange: () => rangeForDay(new Date()) }, { label: 'Ontem', getRange: () => rangeForPreviousDay() }, { label: 'Últimos 7 dias', getRange: () => rangeForLastDays(7) }, { label: 'Últimos 30 dias', getRange: () => rangeForLastDays(30) }, { label: 'Este Mês', getRange: () => { const end = endOfLocalDay(new Date()); const start = startOfLocalDay(new Date(end.getFullYear(), end.getMonth(), 1)); return { start, end }; } }, { label: 'Mês Passado', getRange: () => { const d = new Date(); const start = new Date(d.getFullYear(), d.getMonth() - 1, 1); const end = new Date(d.getFullYear(), d.getMonth(), 0, 23, 59, 59, 999); return { start, end }; } }, { label: 'Últimos 90 dias', getRange: () => rangeForLastDays(90) }, { label: 'Este Ano', getRange: () => { const end = endOfLocalDay(new Date()); const start = startOfLocalDay(new Date(end.getFullYear(), 0, 1)); return { start, end }; } }, { label: 'Todo o Período', getRange: () => { const end = endOfLocalDay(new Date()); const start = startOfLocalDay(new Date(2000, 0, 1)); return { start, end }; } }, ]; const REFRESH_OPTIONS = [ { label: 'Desligado', value: 0 }, { label: '5s', value: 5000 }, { label: '10s', value: 10000 }, { label: '30s', value: 30000 }, { label: '1m', value: 60000 }, { label: '5m', value: 300000 }, ]; const DateRangePicker: React.FC = ({ dateRange, onChange, refreshInterval, setRefreshInterval, onManualRefresh }) => { const [isPresetOpen, setIsPresetOpen] = useState(false); const startRef = useRef(null); const endRef = useRef(null); const formatDisplayDate = (date: Date) => { return date.toLocaleDateString('pt-BR', { day: '2-digit', month: '2-digit', year: 'numeric' }); }; const formatDateForInput = (date: Date) => { return formatDateParam(date); }; const handleStartChange = (e: React.ChangeEvent) => { const newStart = parseLocalDateInput(e.target.value); if (newStart && !isNaN(newStart.getTime())) { const start = startOfLocalDay(newStart); const end = dateRange.end < start ? endOfLocalDay(start) : dateRange.end; onChange({ start, end }); } }; const handleEndChange = (e: React.ChangeEvent) => { const newEnd = parseLocalDateInput(e.target.value); if (newEnd && !isNaN(newEnd.getTime())) { const end = endOfLocalDay(newEnd); const start = dateRange.start > end ? startOfLocalDay(end) : dateRange.start; onChange({ start, end }); } }; const openPicker = (ref: React.RefObject) => { if (ref.current) { try { if ('showPicker' in HTMLInputElement.prototype) { ref.current.showPicker(); } else { ref.current.focus(); } } catch { ref.current.focus(); } } }; return (
{/* Date Presets Dropdown */}
{isPresetOpen && ( <>
setIsPresetOpen(false)}>
Período Customizado
De:
openPicker(startRef)} > {formatDisplayDate(dateRange.start)}
Até:
openPicker(endRef)} > {formatDisplayDate(dateRange.end)}
Atalhos {PRESETS.map((preset) => ( ))}
)}
{/* Auto Refresh Dropdown */} {setRefreshInterval && onManualRefresh && (
)}
); }; export default DateRangePicker;