import { useState } from "react"; import { useNavigate, useParams } from "react-router-dom"; import { toast } from "sonner"; import { apiErrorText, mockPayOutcome } from "@/api/driver"; import { useAuth } from "@/store/auth"; import { Spinner } from "@/components/Spinner"; /** * Учебная «касса»: чем закончится платёж, который сотрудник создал под просмотром. * * Это подмена банка, а не экрана приложения. Настоящий экран оплаты * (`/pay/:orderId`) остаётся тем же самым и разбирает те же статусы — иначе * отладка проверяла бы поведение, которого у водителя не будет. */ const OUTCOMES = [ { key: "paid", label: "Оплата прошла", hint: "PAID — экран «Оплачено»" }, { key: "rejected", label: "Банк отклонил", hint: "REJECTED — «Оплата не прошла»" }, { key: "expired", label: "Счёт протух", hint: "DEADLINE_EXPIRED — «Срок оплаты истёк»" }, { key: "reversed", label: "Деньги вернулись", hint: "REVERSED — «Платёж возвращён»" }, ] as const; export function MockPayPage() { const { orderId = "" } = useParams(); const nav = useNavigate(); const impersonated = useAuth((s) => s.impersonated); const [busy, setBusy] = useState(null); async function choose(outcome: (typeof OUTCOMES)[number]["key"]) { setBusy(outcome); try { await mockPayOutcome(orderId, outcome); nav(`/pay/${orderId}`, { replace: true }); } catch (e: unknown) { toast.error(await apiErrorText(e, "Не удалось разыграть исход")); } finally { setBusy(null); } } if (!impersonated) { return (

Учебная оплата недоступна

Этот экран работает только при просмотре сотрудником.

); } return (

Учебная оплата

Банка в этом платеже нет: ни списания, ни чека, ни проводки. Выберите, что «ответит» банк — приложение покажет ровно то же, что увидел бы водитель.

{OUTCOMES.map((o) => ( ))}

Заказ: {orderId}

); }