import React, { useState, useEffect, useRef } from 'react'; import { Clock, Calendar } from 'lucide-react'; import ScrollPicker from './ScrollPicker'; interface Props { value: string; // ISO format or HH:mm:ss onChange: (value: string) => void; type: 'date' | 'time' | 'datetime'; label?: string; } export default function VedicDateTimePicker({ value, onChange, type, label }: Props) { const [internalDate, setInternalDate] = useState(''); const [hour, setHour] = useState(10); const [minute, setMinute] = useState(0); const [second, setSecond] = useState(0); const [showPicker, setShowPicker] = useState(false); const pickerRef = useRef(null); // Sync internal state from value prop useEffect(() => { if (!value) return; try { if (type === 'time') { const [h, m, s] = value.split(':').map(Number); setHour(isNaN(h) ? 10 : h); setMinute(isNaN(m) ? 0 : m); setSecond(isNaN(s) ? 0 : s); } else if (type === 'date') { setInternalDate(value); } else if (type === 'datetime') { const parts = value.split(' '); if (parts.length === 2) { setInternalDate(parts[0]); const [h, m, s] = parts[1].split(':').map(Number); setHour(isNaN(h) ? 10 : h); setMinute(isNaN(m) ? 0 : m); setSecond(isNaN(s) ? 0 : s); } else if (value.includes('T')) { const [dPart, tPart] = value.split('T'); setInternalDate(dPart); const [h, m, s] = tPart.replace('Z', '').split(':').map(Number); setHour(isNaN(h) ? 10 : h); setMinute(isNaN(m) ? 0 : m); setSecond(isNaN(s) ? 0 : s); } } } catch (e) { console.error("Date Parse Error:", e); } }, [value, type]); // Handle outside clicks useEffect(() => { const handleClickOutside = (event: MouseEvent) => { if (pickerRef.current && !pickerRef.current.contains(event.target as Node)) { setShowPicker(false); } }; document.addEventListener('mousedown', handleClickOutside); return () => document.removeEventListener('mousedown', handleClickOutside); }, []); const handleDateChange = (e: React.ChangeEvent) => { const newDateStr = e.target.value; setInternalDate(newDateStr); if (type === 'date') { onChange(newDateStr); } else { const timeStr = `${hour.toString().padStart(2, '0')}:${minute.toString().padStart(2, '0')}:${second.toString().padStart(2, '0')}`; onChange(`${newDateStr} ${timeStr}`); } }; const handleTimeUpdate = (h: number, mi: number, s: number) => { const timeStr = `${h.toString().padStart(2, '0')}:${mi.toString().padStart(2, '0')}:${s.toString().padStart(2, '0')}`; if (type === 'time') { onChange(timeStr); } else { onChange(`${internalDate} ${timeStr}`); } }; const hours = Array.from({ length: 24 }, (_, i) => i); const minutes = Array.from({ length: 60 }, (_, i) => i); const seconds = Array.from({ length: 60 }, (_, i) => i); return (
{(type === 'date' || type === 'datetime') && (
)} {(type === 'time' || type === 'datetime') && (
{showPicker && (
{ setHour(v); handleTimeUpdate(v, minute, second); }} /> { setMinute(v); handleTimeUpdate(hour, v, second); }} /> { setSecond(v); handleTimeUpdate(hour, minute, v); }} />
)}
)}
); }