/** * CustomTimePicker 컴포넌트 * 오전/오후, 시간, 분을 선택할 수 있는 시간 피커 * NumberPicker를 사용하여 스크롤 방식 선택 제공 */ import { useState, useEffect, useRef } from 'react'; import { motion, AnimatePresence } from 'framer-motion'; import { Clock } from 'lucide-react'; import NumberPicker from './NumberPicker'; function CustomTimePicker({ value, onChange, placeholder = "시간 선택" }) { const [isOpen, setIsOpen] = useState(false); const ref = useRef(null); // 현재 값 파싱 const parseValue = () => { if (!value) return { hour: "12", minute: "00", period: "오후" }; const [h, m] = value.split(":"); const hour = parseInt(h); const isPM = hour >= 12; const hour12 = hour === 0 ? 12 : hour > 12 ? hour - 12 : hour; return { hour: String(hour12).padStart(2, "0"), minute: m, period: isPM ? "오후" : "오전", }; }; const parsed = parseValue(); const [selectedHour, setSelectedHour] = useState(parsed.hour); const [selectedMinute, setSelectedMinute] = useState(parsed.minute); const [selectedPeriod, setSelectedPeriod] = useState(parsed.period); // 외부 클릭 시 닫기 useEffect(() => { const handleClickOutside = (e) => { if (ref.current && !ref.current.contains(e.target)) { setIsOpen(false); } }; document.addEventListener("mousedown", handleClickOutside); return () => document.removeEventListener("mousedown", handleClickOutside); }, []); // 피커 열릴 때 현재 값으로 초기화 useEffect(() => { if (isOpen) { const parsed = parseValue(); setSelectedHour(parsed.hour); setSelectedMinute(parsed.minute); setSelectedPeriod(parsed.period); } }, [isOpen, value]); // 시간 확정 const handleSave = () => { let hour = parseInt(selectedHour); if (selectedPeriod === "오후" && hour !== 12) hour += 12; if (selectedPeriod === "오전" && hour === 12) hour = 0; const timeStr = `${String(hour).padStart(2, "0")}:${selectedMinute}`; onChange(timeStr); setIsOpen(false); }; // 취소 const handleCancel = () => { setIsOpen(false); }; // 초기화 const handleClear = () => { onChange(""); setIsOpen(false); }; // 표시용 포맷 const displayValue = () => { if (!value) return placeholder; const [h, m] = value.split(":"); const hour = parseInt(h); const isPM = hour >= 12; const hour12 = hour === 0 ? 12 : hour > 12 ? hour - 12 : hour; return `${isPM ? "오후" : "오전"} ${hour12}:${m}`; }; // 피커 아이템 데이터 const periods = ["오전", "오후"]; const hours = [ "01", "02", "03", "04", "05", "06", "07", "08", "09", "10", "11", "12", ]; const minutes = Array.from({ length: 60 }, (_, i) => String(i).padStart(2, "0") ); return (