import * as React from 'react' import { ChevronDownIcon } from 'lucide-react' import { enUS, fr, ja, ru, vi, zhCN } from 'react-day-picker/locale' import { useTranslation } from 'react-i18next' import dayjs from '@/lib/dayjs' import { cn } from '@/lib/utils' import { Button } from '@/components/ui/button' import { Calendar } from '@/components/ui/calendar' import { Input } from '@/components/ui/input' import { Popover, PopoverContent, PopoverTrigger, } from '@/components/ui/popover' const calendarLocales = { en: enUS, zh: zhCN, fr, ru, ja, vi, } as const interface DateTimePickerProps { value?: Date onChange?: (date: Date | undefined) => void placeholder?: string className?: string } export function DateTimePicker({ value, onChange, placeholder, className, }: DateTimePickerProps) { const { t, i18n } = useTranslation() const placeholderText = placeholder ?? t('Select date') const calendarLocale = calendarLocales[i18n.language as keyof typeof calendarLocales] ?? enUS const [open, setOpen] = React.useState(false) const [date, setDate] = React.useState(value) const [month, setMonth] = React.useState(value) const [time, setTime] = React.useState('00:00') React.useEffect(() => { setDate(value) setMonth(value) if (value) { const hours = value.getHours().toString().padStart(2, '0') const minutes = value.getMinutes().toString().padStart(2, '0') setTime(`${hours}:${minutes}`) } }, [value]) const handleDateSelect = (selectedDate: Date | undefined) => { if (selectedDate) { const [hours, minutes] = time.split(':').map(Number) const newDate = new Date(selectedDate) newDate.setHours(hours, minutes, 0, 0) setDate(newDate) setMonth(newDate) onChange?.(newDate) setOpen(false) } else { setDate(undefined) setMonth(undefined) onChange?.(undefined) } } const handleTimeChange = (e: React.ChangeEvent) => { const newTime = e.target.value setTime(newTime) if (date) { const [hours, minutes] = newTime.split(':').map(Number) const newDate = new Date(date) newDate.setHours(hours, minutes, 0, 0) setDate(newDate) onChange?.(newDate) } } const handleClear = () => { setDate(undefined) setMonth(undefined) setTime('00:00') onChange?.(undefined) } return (
} > {date ? dayjs(date).format('YYYY-MM-DD') : placeholderText} {date && ( )}
) }