import React, { useRef, useState } 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 getRangeKey = (range: DateRange) => `${formatDateParam(range.start)}:${formatDateParam(range.end)}`; const DateRangePicker: React.FC = ({ dateRange, onChange, refreshInterval, setRefreshInterval, onManualRefresh }) => { const [isPresetOpen, setIsPresetOpen] = useState(false); const [customDraft, setCustomDraft] = useState(() => ({ appliedKey: getRangeKey(dateRange), range: dateRange })); const startRef = useRef(null); const endRef = useRef(null); const appliedRangeKey = getRangeKey(dateRange); const draftRange = customDraft.appliedKey === appliedRangeKey ? customDraft.range : dateRange; 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 = draftRange.end < start ? endOfLocalDay(start) : draftRange.end; setCustomDraft({ appliedKey: appliedRangeKey, range: { start, end } }); } }; const handleEndChange = (e: React.ChangeEvent) => { const newEnd = parseLocalDateInput(e.target.value); if (newEnd && !isNaN(newEnd.getTime())) { const end = endOfLocalDay(newEnd); const start = draftRange.start > end ? startOfLocalDay(end) : draftRange.start; setCustomDraft({ appliedKey: appliedRangeKey, range: { start, end } }); } }; const draftRangeKey = getRangeKey(draftRange); const isDraftApplied = draftRangeKey === appliedRangeKey; const handleApplyCustomRange = () => { onChange(draftRange); setIsPresetOpen(false); }; 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(draftRange.start)}
Até:
openPicker(endRef)} > {formatDisplayDate(draftRange.end)}
Atalhos {PRESETS.map((preset) => ( ))}
)}
{/* Auto Refresh Dropdown */} {setRefreshInterval && onManualRefresh && (
)}
); }; export default DateRangePicker;