import * as React from "react"; import { Clock } from "lucide-react"; import { Popover, PopoverContent, PopoverTrigger } from "./popover"; import { Button } from "./button"; export interface TimePickerProps { value?: string; // HH:mm format onChange?: (value: string) => void; placeholder?: string; disabled?: boolean; className?: string; error?: boolean; } export const TimePicker: React.FC = ({ value, onChange, placeholder = "Select time", disabled = false, className = "", error = false, }) => { const [open, setOpen] = React.useState(false); const [hours, setHours] = React.useState(""); const [minutes, setMinutes] = React.useState(""); const [ampm, setAmpm] = React.useState<"AM" | "PM">("AM"); React.useEffect(() => { if (value) { const [h, m] = value.split(":"); const hour = parseInt(h); if (hour === 0) { setHours("12"); setAmpm("AM"); } else if (hour < 12) { setHours(hour.toString()); setAmpm("AM"); } else if (hour === 12) { setHours("12"); setAmpm("PM"); } else { setHours((hour - 12).toString()); setAmpm("PM"); } setMinutes(m || "00"); } }, [value]); const handleTimeSelect = (h: string, m: string, a: "AM" | "PM") => { let hour24 = parseInt(h); if (a === "PM" && hour24 !== 12) { hour24 += 12; } else if (a === "AM" && hour24 === 12) { hour24 = 0; } const timeString = `${hour24.toString().padStart(2, "0")}:${m.padStart(2, "0")}`; onChange?.(timeString); setOpen(false); }; const formatDisplayTime = () => { if (!value) return ""; const [h, m] = value.split(":"); const hour = parseInt(h); if (hour === 0) return `12:${m} AM`; if (hour < 12) return `${hour}:${m} AM`; if (hour === 12) return `12:${m} PM`; return `${hour - 12}:${m} PM`; }; const hourOptions = Array.from({ length: 12 }, (_, i) => (i + 1).toString()); const minuteOptions = Array.from({ length: 60 }, (_, i) => i.toString().padStart(2, "0"), ); return (
{hourOptions.map((h) => ( ))}
{minuteOptions.map((m) => ( ))}
{hours && minutes && (
)}
); };