diff --git a/app/component/date/datePicker/index.js b/app/component/date/datePicker/index.js index 3d1ad35..dde70e8 100644 --- a/app/component/date/datePicker/index.js +++ b/app/component/date/datePicker/index.js @@ -1,128 +1,70 @@ "use client"; -import { useEffect, useRef, useState } from "react"; -import FirstDatePicker from "./date/FirstDatePicker"; -import SecondDatePicker from "./date/SecondDatePicker"; -import { dateToTimestamp } from "@/helper"; +import { useEffect, useState } from "react"; import moment from "moment-jalaali"; import "moment-timezone"; +import { dateToTimestamp } from "@/helper"; +import InlineJalaliMonth from "@/components/common/InlineJalaliMonth"; function DatePicker({ setDate, disabledDates = [] }) { - const nextIconDatePickerF = useRef(); - const prevIconDatePickerF = useRef(); - const nextIconDatePickerS = useRef(); - const prevIconDatePickerS = useRef(); - - const [startDate, setStartDate] = useState(null); - const [endDate, setEndDate] = useState(); - const [loading, setLoading] = useState(true); + const [baseMonth, setBaseMonth] = useState(moment().tz("Asia/Tehran")); + const [selectedDate, setSelectedDate] = useState(null); const [autoSelected, setAutoSelected] = useState(false); - const handleStartDateChange = (date, e) => { - if (date) { - setDate(dateToTimestamp(date)); - setEndDate(null); - setStartDate(date); - } + const isDisabled = (date) => { + const day = moment(date).startOf("day"); + if (day.isBefore(moment().startOf("day"))) return true; + return disabledDates.some((ts) => day.isSame(moment.unix(ts).startOf("day"))); }; - const handleEndDateChange = (date) => { - if (date) { - setDate(dateToTimestamp(date)); - setEndDate(date); - setStartDate(null); - } - }; - - - const handleDisableDate = (e) => { - const date = moment(e).startOf("day"); - const today = moment().startOf("day"); - - if (date.isBefore(today)) return true; - - if ( - disabledDates.some((ts) => date.isSame(moment.unix(ts).startOf("day"))) - ) { - return true; - } - - return false; + const selectDay = (date) => { + if (isDisabled(date)) return; + setSelectedDate(date); + setDate(dateToTimestamp(date)); }; useEffect(() => { - // تنظیم loading به false بعد از یک تاخیر کوتاه - setTimeout(() => { - setLoading(false); - }, 1000); + if (autoSelected) return; - if (nextIconDatePickerS.current) { - nextIconDatePickerS.current.click(); - } - }, [nextIconDatePickerS, disabledDates]); - - // انتخاب خودکار امروز یا نزدیکترین روز قابل انتخاب - useEffect(() => { - if (!loading && !autoSelected && disabledDates) { - const today = moment().tz("Asia/Tehran"); - const todayTimestamp = moment().tz("Asia/Tehran").startOf("day").unix(); - - // بررسی اینکه امروز قابل انتخاب است یا نه - const isTodayDisabled = disabledDates.some((ts) => - moment.unix(ts).startOf("day").isSame(today.startOf("day")) - ); - - if (!isTodayDisabled) { - // امروز قابل انتخاب است - setStartDate(today); - setDate(todayTimestamp); + const today = moment().tz("Asia/Tehran"); + for (let i = 0; i <= 30; i++) { + const candidate = today.clone().add(i, "days"); + if (!isDisabled(candidate)) { + setSelectedDate(candidate); + setBaseMonth(candidate.clone()); + setDate(candidate.clone().startOf("day").unix()); setAutoSelected(true); - } else { - // پیدا کردن نزدیکترین روز قابل انتخاب - let nearestDate = null; - let daysToCheck = 30; // بررسی 30 روز آینده - - for (let i = 1; i <= daysToCheck; i++) { - const futureDate = moment().tz("Asia/Tehran").add(i, "days"); - const futureDateTimestamp = futureDate.clone().startOf("day").unix(); - - const isFutureDateDisabled = disabledDates.some((ts) => - moment.unix(ts).startOf("day").isSame(futureDate.startOf("day")) - ); - - if (!isFutureDateDisabled) { - nearestDate = futureDate; - setStartDate(futureDate); - setDate(futureDateTimestamp); - setAutoSelected(true); - break; - } - } + break; } } - }, [loading, disabledDates, autoSelected, setDate]); + }, [disabledDates, autoSelected, setDate]); + + const secondMonth = moment(baseMonth).add(1, "jMonth"); return ( -
+ {MONTHS[displayDate.jMonth()]} {displayDate.jYear()} +
+ +