'use client';
import * as React from 'react';
import { format } from 'date-fns';
import { ptBR } from 'date-fns/locale';
import { CalendarIcon } from 'lucide-react';
import type { DateRange } from 'react-day-picker';
import { cn } from '@/lib/utils';
import { Button } from '@/components/ui/button';
import { Calendar } from '@/components/ui/calendar';
import { Popover, PopoverContent, PopoverTrigger } from '@/components/ui/popover';
interface DatePickerProps {
value?: Date;
onChange: (date: Date | undefined) => void;
placeholder?: string;
disabled?: boolean;
className?: string;
id?: string;
'aria-invalid'?: boolean;
'aria-describedby'?: string;
}
/** Seleção de data única — usada em formulários (ex: vencimento de parcela). */
function DatePicker({
value,
onChange,
placeholder = 'Selecionar data',
disabled,
className,
id,
...aria
}: DatePickerProps) {
const [open, setOpen] = React.useState(false);
return (
{
onChange(date);
setOpen(false);
}}
locale={ptBR}
autoFocus
/>
);
}
interface DateRangePickerProps {
value?: DateRange;
onChange: (range: DateRange | undefined) => void;
placeholder?: string;
disabled?: boolean;
className?: string;
id?: string;
}
/** Seleção de período — usada nos filtros de dashboard/listagens (seção 7 do schema). */
function DateRangePicker({
value,
onChange,
placeholder = 'Selecionar período',
disabled,
className,
id,
}: DateRangePickerProps) {
const [open, setOpen] = React.useState(false);
const label = React.useMemo(() => {
if (!value?.from) return placeholder;
if (!value.to) return format(value.from, 'dd/MM/yyyy', { locale: ptBR });
return `${format(value.from, 'dd/MM/yyyy', { locale: ptBR })} – ${format(value.to, 'dd/MM/yyyy', { locale: ptBR })}`;
}, [value, placeholder]);
return (
);
}
export { DatePicker, DateRangePicker };