diff --git a/driver-pwa/frontend/src/components/AppHeader.tsx b/driver-pwa/frontend/src/components/AppHeader.tsx index 1752530..b34d92c 100644 --- a/driver-pwa/frontend/src/components/AppHeader.tsx +++ b/driver-pwa/frontend/src/components/AppHeader.tsx @@ -1,12 +1,7 @@ -export function AppHeader({ initials }: { initials?: string }) { +export function AppHeader() { return ( -
+
Премиум Водитель - {initials && ( - - {initials} - - )}
); } diff --git a/driver-pwa/frontend/src/hooks/usePaymentStatus.ts b/driver-pwa/frontend/src/hooks/usePaymentStatus.ts index bee1229..660633a 100644 --- a/driver-pwa/frontend/src/hooks/usePaymentStatus.ts +++ b/driver-pwa/frontend/src/hooks/usePaymentStatus.ts @@ -1,10 +1,12 @@ import { useQuery } from "@tanstack/react-query"; import { getPaymentState } from "@/api/driver"; +const TERMINAL = new Set(["PAID", "CONFIRMED", "REJECTED", "REVERSED", "REFUNDED", "CANCELED", "AUTH_FAIL"]); + export function usePaymentStatus(orderId: string) { return useQuery({ queryKey: ["payment", orderId], queryFn: () => getPaymentState(orderId), - refetchInterval: (q) => (q.state.data?.status === "PAID" || q.state.data?.status === "REJECTED" ? false : 1500), + refetchInterval: (q) => (q.state.data && TERMINAL.has(q.state.data.status) ? false : 1500), }); } diff --git a/driver-pwa/frontend/src/pages/BalancePage.test.tsx b/driver-pwa/frontend/src/pages/BalancePage.test.tsx index a329ccd..9128eaa 100644 --- a/driver-pwa/frontend/src/pages/BalancePage.test.tsx +++ b/driver-pwa/frontend/src/pages/BalancePage.test.tsx @@ -32,4 +32,16 @@ describe("BalancePage", () => { expect(screen.getAllByText("−3 200 ₽").length).toBeGreaterThan(0); expect(screen.getByRole("button", { name: /Пополнить/i })).toBeInTheDocument(); }); + + it("shows an error state when balance fails to load", async () => { + const driver = await import("@/api/driver"); + (driver.getBalance as any).mockRejectedValueOnce(new Error("boom")); + // re-render fresh + const { QueryClient, QueryClientProvider } = await import("@tanstack/react-query"); + const { MemoryRouter } = await import("react-router-dom"); + const { render, screen } = await import("@testing-library/react"); + const qc = new QueryClient({ defaultOptions: { queries: { retry: false } } }); + render(); + expect(await screen.findByText(/Не удалось загрузить/i)).toBeInTheDocument(); + }); }); diff --git a/driver-pwa/frontend/src/pages/BalancePage.tsx b/driver-pwa/frontend/src/pages/BalancePage.tsx index 1a75db6..2ca0dba 100644 --- a/driver-pwa/frontend/src/pages/BalancePage.tsx +++ b/driver-pwa/frontend/src/pages/BalancePage.tsx @@ -10,14 +10,14 @@ import { Spinner } from "@/components/Spinner"; export function BalancePage() { const nav = useNavigate(); const clear = useAuth((s) => s.clear); - const { data, isLoading } = useQuery({ queryKey: ["balance"], queryFn: getBalance }); + const { data, isLoading, isError, refetch } = useQuery({ queryKey: ["balance"], queryFn: getBalance }); const accounts = data?.accounts ?? []; const totalDebt = accounts.filter((a) => a.balance < 0).reduce((s, a) => s + a.balance, 0); return (
- +

Общий долг

{formatMoney(totalDebt)}

@@ -25,6 +25,11 @@ export function BalancePage() { {isLoading ? (
+ ) : isError ? ( +
+

Не удалось загрузить баланс

+ +
) : (
{accounts.map((a) => ( diff --git a/driver-pwa/frontend/src/pages/HistoryPage.tsx b/driver-pwa/frontend/src/pages/HistoryPage.tsx index 39bcf11..de072db 100644 --- a/driver-pwa/frontend/src/pages/HistoryPage.tsx +++ b/driver-pwa/frontend/src/pages/HistoryPage.tsx @@ -10,7 +10,7 @@ const STATUS_RU: Record = { export function HistoryPage() { const nav = useNavigate(); - const { data, isLoading } = useQuery({ queryKey: ["payments"], queryFn: getPayments }); + const { data, isLoading, isError } = useQuery({ queryKey: ["payments"], queryFn: getPayments }); const rows = data?.payments ?? []; return ( @@ -19,6 +19,8 @@ export function HistoryPage() {

История пополнений

{isLoading ? (
+ ) : isError ? ( +

Не удалось загрузить историю

) : rows.length === 0 ? (

Пока нет пополнений

) : ( diff --git a/driver-pwa/frontend/src/pages/LoginPage.tsx b/driver-pwa/frontend/src/pages/LoginPage.tsx index 919e80b..716a712 100644 --- a/driver-pwa/frontend/src/pages/LoginPage.tsx +++ b/driver-pwa/frontend/src/pages/LoginPage.tsx @@ -28,8 +28,9 @@ export function LoginPage() { } setChannel(r.channel); setStep("code"); - } catch (err: any) { - toast.error(err?.response?.status === 404 ? "Номер не найден. Обратитесь в парк." : "Не удалось отправить код"); + } catch (err: unknown) { + const status = (err as { response?: { status?: number } })?.response?.status; + toast.error(status === 404 ? "Номер не найден. Обратитесь в парк." : "Не удалось отправить код"); } finally { setBusy(false); }