import React, { useEffect, useRef, useState } from "react"; import { bgInputPrimaryColor, mobileBorders, textColor, } from "../../data/getColorBasedOnMode"; import { getSizeStyles } from "../../data/getInputSizes"; import { checkIsMobile } from "../../utils/checkIsMobile"; interface TimePickerProps { value?: string; onChange?: (value: string) => void; label?: string; disabled?: boolean; className?: string; size?: "small" | "medium" | "large"; } const TimePicker: React.FC = ({ onChange, label = "ساعت", disabled = false, className = "", size = "medium", }) => { const pickerRef = useRef(null!); const hourRef = useRef(null!); const minuteRef = useRef(null!); const [isOpen, setIsOpen] = useState(false); const now = new Date(); const initialHour = now.getHours(); const initialMinute = now.getMinutes(); const [selectedHour, setSelectedHour] = useState(initialHour); const [selectedMinute, setSelectedMinute] = useState(initialMinute); useEffect(() => { const handleClickOutside = (event: MouseEvent) => { if ( pickerRef.current && !pickerRef.current.contains(event.target as Node) ) { setIsOpen(false); } }; document.addEventListener("mousedown", handleClickOutside); return () => document.removeEventListener("mousedown", handleClickOutside); }, []); useEffect(() => { const timeString = `${String(selectedHour).padStart(2, "0")}:${String( selectedMinute ).padStart(2, "0")}:00`; if (onChange) { onChange(timeString); } }, [selectedHour, selectedMinute, onChange]); const scrollToSelected = ( ref: React.RefObject, selected: number ) => { const el = ref.current?.querySelector(`[data-value="${selected}"]`); el?.scrollIntoView({ behavior: "auto", block: "center" }); }; useEffect(() => { if (isOpen) { scrollToSelected(hourRef, selectedHour); scrollToSelected(minuteRef, selectedMinute); } }, [isOpen]); const renderColumn = ( title: string, range: number, selected: number, setSelected: (val: number) => void, ref: React.RefObject ) => (
{title}
    {Array.from({ length: range }, (_, i) => (
  • setSelected(i)} > {String(i).padStart(2, "0")}
  • ))}
); return (
setIsOpen(!isOpen)} className={`w-full border rounded-xl bg-white text-sm text-center text-dark-800 shadow-sm focus:border-blue-400 focus:ring focus:ring-blue-200 ${ checkIsMobile() && mobileBorders } ${getSizeStyles(size).padding} ${bgInputPrimaryColor} ${textColor}`} disabled={disabled} />
{isOpen && (
{renderColumn( "دقیقه", 60, selectedMinute, setSelectedMinute, minuteRef )} {renderColumn("ساعت", 24, selectedHour, setSelectedHour, hourRef)}
)}
); }; export default TimePicker;