"use client"; import { format } from "date-fns"; import { CalendarDays, Clock2Icon, X } from "lucide-react"; import { useId, useState } from "react"; import { Button } from "@/components/ui/button"; import { Calendar } from "@/components/ui/calendar"; import { Field, FieldGroup, FieldLabel, } from "@/components/ui/field"; import { InputGroup, InputGroupAddon, InputGroupInput, } from "@/components/ui/input-group"; import { Popover, PopoverContent, PopoverTrigger, } from "@/components/ui/popover"; import { Separator } from "@/components/ui/separator"; const TIME_PATTERN = /^(?:[01]\d|2[0-3]):[0-5]\d$/; function formatTimeInput(input: string) { const digits = input.replace(/\D/g, "").slice(0, 4); return digits.length > 2 ? `${digits.slice(0, 2)}:${digits.slice(2)}` : digits; } export function DateTimePicker({ id, value, onChange, placeholder = "Select date and time", }: { id?: string; value?: Date; onChange: (value: Date | undefined) => void; placeholder?: string; }) { const generatedId = useId(); const timeInputId = `${id ?? generatedId}-time`; const [open, setOpen] = useState(false); const time = value ? format(value, "HH:mm") : "23:59"; const [timeInput, setTimeInput] = useState(time); const handleDateChange = (date: Date | undefined) => { if (!date) { setTimeInput("23:59"); onChange(undefined); return; } const next = new Date(date); if (value) { next.setHours(value.getHours(), value.getMinutes(), 0, 0); } else { next.setHours(23, 59, 0, 0); } setTimeInput(format(next, "HH:mm")); onChange(next); }; const handleTimeChange = (nextTime: string) => { const formattedTime = formatTimeInput(nextTime); setTimeInput(formattedTime); if (!value || !TIME_PATTERN.test(formattedTime)) return; const [hours, minutes] = formattedTime.split(":").map(Number); const next = new Date(value); next.setHours(hours, minutes, 0, 0); onChange(next); }; return ( Time (24-hour HH:mm) handleTimeChange(event.target.value)} onBlur={() => setTimeInput(time)} />
); }