import React, { useEffect, useRef, useState } from 'react'; import { Calendar, ChevronDown } from 'lucide-react'; import { DateRange } from '../types'; interface DateRangePickerProps { dateRange: DateRange; onChange: (range: DateRange) => void; } export const DateRangePicker: React.FC = ({ dateRange, onChange }) => { const [isOpen, setIsOpen] = useState(false); const containerRef = useRef(null); const startRef = useRef(null); const endRef = useRef(null); useEffect(() => { const handleClickOutside = (event: MouseEvent) => { if (containerRef.current && !containerRef.current.contains(event.target as Node)) { setIsOpen(false); } }; document.addEventListener('mousedown', handleClickOutside); return () => document.removeEventListener('mousedown', handleClickOutside); }, []); const formatDateForInput = (date: Date) => { // Format to local YYYY-MM-DD to avoid timezone shifts const year = date.getFullYear(); const month = String(date.getMonth() + 1).padStart(2, '0'); const day = String(date.getDate()).padStart(2, '0'); return `${year}-${month}-${day}`; }; const formatShortDate = (date: Date) => { return date.toLocaleDateString('pt-BR', { day: '2-digit', month: '2-digit', year: '2-digit', timeZone: 'America/Sao_Paulo' }); }; const startOfDay = (date: Date) => { const result = new Date(date); result.setHours(0, 0, 0, 0); return result; }; const endOfDay = (date: Date) => { const result = new Date(date); result.setHours(23, 59, 59, 999); return result; }; const setRange = (start: Date, end: Date) => { onChange({ start: startOfDay(start), end: endOfDay(end) }); setIsOpen(false); }; const parseLocalDate = (value: string) => { // Split "YYYY-MM-DD" and create date in local timezone to avoid UTC midnight shift if (!value) return null; const [year, month, day] = value.split('-'); return new Date(parseInt(year), parseInt(month) - 1, parseInt(day)); }; const handleStartChange = (e: React.ChangeEvent) => { const newStart = parseLocalDate(e.target.value); if (newStart && !isNaN(newStart.getTime())) { onChange({ ...dateRange, start: startOfDay(newStart) }); } }; const handleEndChange = (e: React.ChangeEvent) => { const newEnd = parseLocalDate(e.target.value); if (newEnd && !isNaN(newEnd.getTime())) { onChange({ ...dateRange, end: endOfDay(newEnd) }); } }; const openPicker = (ref: React.RefObject) => { if (ref.current) { try { if ('showPicker' in HTMLInputElement.prototype) { ref.current.showPicker(); } else { ref.current.focus(); } } catch (e) { ref.current.focus(); } } }; const today = startOfDay(new Date()); const shortcuts = [ { label: 'Hoje', onClick: () => setRange(today, today), }, { label: 'Ontem', onClick: () => { const yesterday = new Date(today); yesterday.setDate(today.getDate() - 1); setRange(yesterday, yesterday); }, }, { label: 'Últimos 7 dias', onClick: () => { const start = new Date(today); start.setDate(today.getDate() - 6); setRange(start, today); }, }, { label: 'Últimos 30 dias', onClick: () => { const start = new Date(today); start.setDate(today.getDate() - 29); setRange(start, today); }, }, { label: 'Este Mês', onClick: () => setRange(new Date(today.getFullYear(), today.getMonth(), 1), today), }, { label: 'Mês Passado', onClick: () => setRange( new Date(today.getFullYear(), today.getMonth() - 1, 1), new Date(today.getFullYear(), today.getMonth(), 0) ), }, { label: 'Últimos 90 dias', onClick: () => { const start = new Date(today); start.setDate(today.getDate() - 89); setRange(start, today); }, }, { label: 'Este Ano', onClick: () => setRange(new Date(today.getFullYear(), 0, 1), today), }, { label: 'Todo o Período', onClick: () => setRange(new Date(0), today), }, ]; return (
{isOpen && (
Período Customizado
Atalhos
{shortcuts.map(shortcut => ( ))}
)}
); };