import { eachMonthOfInterval, endOfYear, format, startOfYear } from "date-fns"; import { Calendar as CalendarIcon } from "lucide-react"; import * as React from "react"; import { Button } from "@/components/ui/button"; import { Calendar } from "@/components/ui/calendar"; import { Popover, PopoverContent, PopoverTrigger, } from "@/components/ui/popover"; import { Select, SelectContent, SelectItem, SelectTrigger, SelectValue, } from "@/components/ui/select"; import { cn } from "@/lib/utils"; interface DatePickerProps { date: Date | undefined; setDate: (date: Date | undefined) => void; } export function DatePicker({ date, setDate }: DatePickerProps) { const [month, setMonth] = React.useState( date ? date.getMonth() : new Date().getMonth(), ); const [year, setYear] = React.useState( date ? date.getFullYear() : new Date().getFullYear(), ); const years = React.useMemo(() => { const currentYear = new Date().getFullYear(); return Array.from( { length: currentYear - 1900 + 1 }, (_, i) => currentYear - i, ); }, []); const months = React.useMemo(() => { if (year) { return eachMonthOfInterval({ start: startOfYear(new Date(year, 0, 1)), end: endOfYear(new Date(year, 0, 1)), }); } return []; }, [year]); React.useEffect(() => { if (date) { setMonth(date.getMonth()); setYear(date.getFullYear()); } }, [date]); const handleYearChange = (selectedYear: string) => { const newYear = Number.parseInt(selectedYear, 10); setYear(newYear); if (date) { const newDate = new Date(date); newDate.setFullYear(newYear); setDate(newDate); } }; const handleMonthChange = (selectedMonth: string) => { const newMonth = Number.parseInt(selectedMonth, 10); setMonth(newMonth); if (date) { const newDate = new Date(date); newDate.setMonth(newMonth); setDate(newDate); } else { setDate(new Date(year, newMonth, 1)); } }; return (
{ setMonth(newMonth.getMonth()); setYear(newMonth.getFullYear()); }} initialFocus />
); }