import React, { useEffect, useRef, useState } from "react" import DatePicker, { DateObject } from "react-multi-date-picker" import persian from "react-date-object/calendars/persian" import persian_fa from "react-date-object/locales/persian_fa" import gregorian from "react-date-object/calendars/gregorian" import gregorian_en from "react-date-object/locales/gregorian_en" import "react-multi-date-picker/styles/backgrounds/bg-dark.css" interface JalaliDatePickerProps { value: string | null | undefined; onChange: (date: string) => void; label?: string; disabled?: boolean; inputClassName?: string; placeholder?: string; } export default function JalaliDatePicker({ value, onChange, label, disabled, inputClassName = "", placeholder }: JalaliDatePickerProps) { const isFa = document.documentElement.dir === 'rtl' const [isDark, setIsDark] = useState(document.documentElement.classList.contains('dark')) const containerRef = useRef(null) const [calendarPosition, setCalendarPosition] = useState("bottom-right") // Listen for dark mode changes dynamically (optional but good for UX) useEffect(() => { const observer = new MutationObserver(() => { setIsDark(document.documentElement.classList.contains('dark')) }) observer.observe(document.documentElement, { attributes: true, attributeFilter: ['class'] }) return () => observer.disconnect() }, []) const handleChange = (date: DateObject | null) => { if (!date) { onChange("") } else { // Always output standard Gregorian "YYYY-MM-DD" for backend onChange(date.convert(gregorian, gregorian_en).format("YYYY-MM-DD")) } } const updateCalendarPosition = () => { const rect = containerRef.current?.getBoundingClientRect() if (!rect) return const estimatedHeight = 340 const hasMoreSpaceAbove = rect.top > window.innerHeight - rect.bottom const shouldOpenTop = window.innerHeight - rect.bottom < estimatedHeight && hasMoreSpaceAbove const horizontal = isFa ? "left" : "right" setCalendarPosition(`${shouldOpenTop ? "top" : "bottom"}-${horizontal}`) } return (
{label && ( )}
) }