fix(appointment): ensure appointment details are always fetched from the server to avoid incorrect pricing

This commit is contained in:
hamed
2026-08-10 12:21:28 +03:30
parent 7073377122
commit bb2dbc3371
2 changed files with 119 additions and 23 deletions
@@ -119,12 +119,14 @@ export default function ConfirmAppointmentModal({
const [touched, setTouched] = useState(false);
const [stepIdx, setStepIdx] = useState(0);
// وقتی صفحه‌ی میزبان نوبت را ندارد (مثل ردیف لیست) خودمان جزئیات را می‌گیریم:
// مبلغ ویزیت و قیمت سرویس‌ها فقط در detail هستند.
// جزئیات همیشه گرفته می‌شود، حتی وقتی صفحهٔ میزبان نوبتی پاس داده است: ردیفِ
// فهرست نوبت‌ها `visit_price_rials` و بیمه را ندارد، و مودال با اعتماد به همان
// ردیف، هزینهٔ ویزیتِ ثبت‌شده را صفر نشان می‌داد و همان صفر را هم ثبت می‌کرد.
// مبلغ چیزی نیست که از یک payload ناقص حدس زده شود.
const detailQuery = useQuery({
queryKey: ['appointment', appointmentUuid],
queryFn: () => api.get<ApiResponse<AppointmentLike>>(`/api/v1/appointment/${appointmentUuid}`),
enabled: open && !appointment,
enabled: open,
});
// روش‌های پرداختِ ثبت‌شده — فقط وقتی مودال باز است.
@@ -151,8 +153,10 @@ export default function ConfirmAppointmentModal({
[bankQuery.data],
);
const appt: AppointmentLike | null = appointment
?? ((detailQuery.data?.data as any)?.data ?? detailQuery.data?.data ?? null);
// پاسخ سرور مرجع است؛ نوبتِ پاس‌داده‌شده فقط تا رسیدنِ آن، صفحه را خالی نگه نمی‌دارد.
const detail: AppointmentLike | null =
(detailQuery.data?.data as any)?.data ?? detailQuery.data?.data ?? null;
const appt: AppointmentLike | null = detail ?? appointment ?? null;
// ── بیمه: نوع خدمت + بیمهٔ پایهٔ نوبت ──────────────────────────────────────
const insurance = useAppointmentInsurance(open);
@@ -278,7 +282,9 @@ export default function ConfirmAppointmentModal({
onClose();
}
const loading = detailQuery.isLoading && !appointment;
// تا رسیدنِ جزئیات، دکمه‌ها قفل‌اند: کاربر نباید روی مبلغی که هنوز از سرور نیامده
// «مرحلهٔ بعد» بزند و پرداختِ صفر ثبت کند.
const loading = detailQuery.isLoading;
const currentStep: ConfirmStepKey = CONFIRM_STEPS[Math.min(stepIdx, CONFIRM_STEPS.length - 1)].key;
const isLastStep = currentStep === 'review';