"use client"; import { useEffect, useState } from "react"; import moment from "jalali-moment"; import { request } from "@/services/response"; function toToman(rials) { if (!rials) return null; return Math.round(rials / 10).toLocaleString("fa-IR"); } /** * جمعِ سمتِ کلاینت — فقط fallback برای بکاندی که `total_duration_minutes` نمیدهد. * مدت، دادهٔ سرور است: فرمولش قرار است به «زمان تنها / زمان اضافه» تغییر کند و هر * محاسبهٔ موازی در فرانت از آن روز عددِ غلط نشان میدهد. */ function fallbackSum(services, uuids) { return services .filter((s) => uuids.includes(s.uuid)) .reduce((sum, s) => sum + (Number(s.duration_minutes) || 0), 0); } // مرحلهٔ انتخاب سرویس (فقط حالت نوبتدهی سرویسی) — پیش از انتخاب روز. function ServiceSelect({ services = [], onContinue, doctorUuid, clinicUuid = null }) { const [draft, setDraft] = useState([]); /** `{ key, minutes }` — کلید همان انتخابی است که عدد به آن تعلق دارد. */ const [serverDuration, setServerDuration] = useState(null); const toggle = (uuid) => setDraft((prev) => prev.includes(uuid) ? prev.filter((u) => u !== uuid) : [...prev, uuid] ); const draftKey = draft.join(","); // مدت را سرور حساب میکند. این مرحله پیش از انتخاب روز است، ولی // `total_duration_minutes` به تاریخ وابسته نیست — بکاند آن را پیش از لمسِ // شیفتهای آن روز برمیگرداند، پس حتی اگر امروز تعطیل باشد و `start_times` // خالی بیاید، عدد درست است. useEffect(() => { if (!doctorUuid || draftKey === "") return; let cancelled = false; const today = moment().format("YYYY-MM-DD"); request .getServiceSlots(doctorUuid, today, draftKey.split(","), clinicUuid) .then((res) => { if (cancelled) return; const minutes = (res?.data?.data ?? res?.data)?.total_duration_minutes; if (typeof minutes !== "number") { console.warn("[booking] total_duration_minutes missing — falling back to client sum"); return; } setServerDuration({ key: draftKey, minutes }); }) .catch(() => {}); return () => { cancelled = true; }; }, [doctorUuid, clinicUuid, draftKey]); // کهنهبودن **مشتق** میشود، نه با reset: عددِ متعلق به انتخاب قبلی خودکار نادیده // گرفته میشود و effect لازم نیست در بدنهاش setState صدا بزند. const serverMinutes = serverDuration?.key === draftKey ? serverDuration.minutes : null; const totalMinutes = serverMinutes ?? fallbackSum(services, draft); return (
در حال حاضر سرویسی برای نوبتدهی آنلاین تعریف نشده است.
) : (