refactor: enhance date selection logic in DatePicker and update appointment request parameters
This commit is contained in:
@@ -5,6 +5,7 @@ import FirstDatePicker from "./date/FirstDatePicker";
|
||||
import SecondDatePicker from "./date/SecondDatePicker";
|
||||
import { dateToTimestamp } from "@/helper";
|
||||
import moment from "moment-jalaali";
|
||||
import "moment-timezone";
|
||||
|
||||
function DatePicker({ setDate, disabledDates = [] }) {
|
||||
const nextIconDatePickerF = useRef();
|
||||
@@ -15,6 +16,7 @@ function DatePicker({ setDate, disabledDates = [] }) {
|
||||
const [startDate, setStartDate] = useState(null);
|
||||
const [endDate, setEndDate] = useState();
|
||||
const [loading, setLoading] = useState(true);
|
||||
const [autoSelected, setAutoSelected] = useState(false);
|
||||
|
||||
const handleStartDateChange = (date, e) => {
|
||||
if (date) {
|
||||
@@ -59,6 +61,47 @@ function DatePicker({ setDate, disabledDates = [] }) {
|
||||
}
|
||||
}, [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);
|
||||
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;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}, [loading, disabledDates, autoSelected, setDate]);
|
||||
|
||||
return (
|
||||
<div className="datePickerApt flex items-start custom-datepicker justify-evenly w-full">
|
||||
<FirstDatePicker
|
||||
|
||||
@@ -12,7 +12,7 @@ function List({ appo, hour, setHour, value }) {
|
||||
<li key={idx}>
|
||||
<Button
|
||||
onClick={() => setHour(item)}
|
||||
disabled={!item.status === "available"}
|
||||
disabled={item.status !== "available"}
|
||||
className={`
|
||||
!w-full !rounded-[8px] !bg-[#EFEFEF] !flex !justify-center !items-center !py-[10px] !px-[14px] !h-[40px] md:!h-[42px] lg:!h-[44px]
|
||||
${checkHour(item) ? "!bg-[#F79463] " : ""}
|
||||
|
||||
@@ -4,15 +4,12 @@ import { useEffect, useState } from "react";
|
||||
import Hours from "./hours";
|
||||
import Tabs from "../../Tabs";
|
||||
import { request } from "@/services/response";
|
||||
import { useParams } from "next/navigation";
|
||||
import SendAppo from "./SendAppo";
|
||||
|
||||
const listTab = ["صبح", "بعد از ظهر"];
|
||||
const nameHours = ["hours_morning", "hours_afternoon"];
|
||||
|
||||
function DateTime({ date, doctor, setStep }) {
|
||||
const params = useParams();
|
||||
const doctorId = params.doctorId;
|
||||
const [value, setValue] = useState(0);
|
||||
const [hour, setHour] = useState();
|
||||
const [appo, setAppo] = useState("تاریخ مورد نظرتان را انتخاب کنید.");
|
||||
@@ -23,22 +20,38 @@ function DateTime({ date, doctor, setStep }) {
|
||||
};
|
||||
|
||||
useEffect(() => {
|
||||
if (date) {
|
||||
if (date && doctor?.id) {
|
||||
setAppo("loading");
|
||||
setHour();
|
||||
request
|
||||
.getAppointment(doctorId, date)
|
||||
.getAppointment(doctor.id, date)
|
||||
.then((res) => {
|
||||
setAppo(res);
|
||||
if (res.morning?.length && res.evening?.length) setValue(0);
|
||||
else if (res.morning?.length && value !== 0) setValue(0);
|
||||
else if (res.evening?.length && value !== 1) setValue(1);
|
||||
|
||||
// بررسی وجود اسلاتهای available در صبح و عصر
|
||||
const hasAvailableMorning = res.morning?.some(slot => slot.status === "available");
|
||||
const hasAvailableEvening = res.evening?.some(slot => slot.status === "available");
|
||||
|
||||
// اگر هر دو صبح و عصر اسلات available داشته باشند، صبح را نمایش بده
|
||||
if (hasAvailableMorning && hasAvailableEvening) {
|
||||
setValue(0);
|
||||
}
|
||||
// اگر فقط صبح اسلات available داشته باشد
|
||||
else if (hasAvailableMorning && !hasAvailableEvening) {
|
||||
setValue(0);
|
||||
}
|
||||
// اگر فقط عصر اسلات available داشته باشد یا هیچ کدام available نداشته باشند، عصر را نمایش بده
|
||||
else {
|
||||
setValue(1);
|
||||
}
|
||||
})
|
||||
.catch((err) => {
|
||||
setAppo("در حال حاضر، نوبتی برای ساعتهای صبح موجود نمیباشد.");
|
||||
// در صورت خطا هم عصر را نمایش بده
|
||||
setValue(1);
|
||||
});
|
||||
}
|
||||
}, [date]);
|
||||
}, [date, doctor?.id]);
|
||||
|
||||
return (
|
||||
<div className="w-full">
|
||||
|
||||
Reference in New Issue
Block a user