import { useState, useEffect } from "react"; import moment from "moment-jalaali"; import ArrowLeftB from "@/components/icons/ArrowLeftB"; import { Button, MenuItem, Select, FormControl, InputLabel } from "@mui/material"; import ButtonFixed from "./ButtonFixed"; import { request } from "@/services/response"; import { formatToman } from "@/lib/money"; const PAYMENT_TTL = 900; function Paying({ setStep, appointmentId, expiresAt, doctor, data, isForAnother, selectedSlot }) { const [selectedBank, setSelectedBank] = useState(""); const [gateways, setGateways] = useState([]); const [loading, setLoading] = useState(false); const [testMode, setTestMode] = useState(null); const [feeRials, setFeeRials] = useState(null); const computeLeft = () => expiresAt ? Math.max(0, Math.floor((expiresAt * 1000 - Date.now()) / 1000)) : PAYMENT_TTL; const [timeLeft, setTimeLeft] = useState(computeLeft); useEffect(() => { const timer = setInterval(() => setTimeLeft(computeLeft()), 1000); return () => clearInterval(timer); }, [expiresAt]); useEffect(() => { request .getPaymentConfig() .then((res) => { const gws = Array.isArray(res?.data?.gateways) ? res.data.gateways : []; setTestMode(Boolean(res?.data?.test_mode)); setFeeRials(Number(res?.data?.appointment_fee_rials) || 0); setGateways(gws); setSelectedBank(gws[0]?.name ?? ""); }) .catch(() => { setTestMode(false); setFeeRials(0); setGateways([]); }); }, []); const formatTime = (seconds) => { const m = Math.floor(seconds / 60); const s = seconds % 60; return `${m}:${s.toString().padStart(2, "0")}`; }; const toman = feeRials != null ? formatToman(feeRials) : "—"; const patientName = isForAnother ? [data?.name?.value, data?.family?.value].filter(Boolean).join(" ").trim() : data?.name?.value; const expired = timeLeft === 0; const progress = Math.max(0, Math.min(100, (timeLeft / PAYMENT_TTL) * 100)); const handlePayment = () => { if (!appointmentId) return; const gateway = testMode ? "mellat" : selectedBank; if (!gateway) return; setLoading(true); // بدون هیچ XHR: مرورگر مستقیماً به entry بکاند میرود؛ بکاند صلاحیت را تأیید، // Payment را میسازد و به درگاه بانک منتقل میکند. const apiBase = process.env.NEXT_PUBLIC_API_URL; const ret = encodeURIComponent(`${window.location.origin}/payment/result`); window.location.href = `${apiBase}/api/v1/payment/order/${appointmentId}` + `?gateway=${encodeURIComponent(gateway)}&return=${ret}`; }; return (
تأیید و پرداخت
{/* ── خلاصه نوبت ── */}درگاه پرداخت آزمایشی
در این حالت پرداخت واقعی انجام نمیشود و نوبت بهصورت آزمایشی تأیید میگردد.
درگاه پرداخت فعالی موجود نیست. لطفاً بعداً تلاش کنید.
مهلت پرداخت تمام شد و نوبت آزاد شد. لطفاً دوباره زمان نوبت را انتخاب کنید.