diff --git a/src/components/ui/JalaliDatePicker.tsx b/src/components/ui/JalaliDatePicker.tsx index c03711c..60112bd 100644 --- a/src/components/ui/JalaliDatePicker.tsx +++ b/src/components/ui/JalaliDatePicker.tsx @@ -1,4 +1,4 @@ -import React, { useEffect, useState } from "react" +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" @@ -16,8 +16,10 @@ interface JalaliDatePickerProps { } 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 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(() => { @@ -28,17 +30,28 @@ export default function JalaliDatePicker({ value, onChange, label, disabled, inp return () => observer.disconnect() }, []) - const handleChange = (date: DateObject | null) => { + 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")) } - } - - return ( -
+ } + + 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 && (
) }