import { useState } from "react"; import { useQuery } from "@tanstack/react-query"; import { useNavigate } from "react-router-dom"; import { ChevronRight, Image as ImageIcon } from "lucide-react"; import { getFines } from "@/api/driver"; import { fineStatusText, isOwed } from "@/lib/fineStatus"; import { formatDate, formatMoney } from "@/lib/format"; import { OperationIcon } from "@/components/operationIcon"; import { Spinner } from "@/components/Spinner"; /** * Штрафы водителя списком. * * Строка «Долг по штрафам −5 156 ₽» на балансе не отвечает на вопрос «за что», * и водитель идёт выяснять звонком. Здесь он видит каждое постановление, а в * карточке — фотографию с камеры. * * Долг в шапке берём из баланса 1С, а не суммой строк: постановление парк гасит * авансом, и по бумагам ГИБДД оно закрыто в тот же день — долг перед парком от * этого никуда не девается. Список без этой оговорки показывал бы «неоплаченных * нет» при −5 156 ₽ на главном экране. */ export function FinesPage() { const nav = useNavigate(); // Запрашиваем ВСЕ и фильтруем на месте: список короткий, зато вкладка // переключается мгновенно и, главное, известно, есть ли непогашенные ещё до // того, как выбрана вкладка. const { data, isLoading, isError, refetch } = useQuery({ queryKey: ["fines"], queryFn: () => getFines("all"), }); const [tab, setTab] = useState<"open" | "all" | null>(null); // Долгов нет — открываем «Все». Иначе водитель с оплаченными штрафами видел // пустой экран и решал, что приложение их потеряло (Морозов, 18.08.2026). const active = tab ?? (data && data.open_count > 0 ? "open" : "all"); const items = (data?.items ?? []).filter((f) => active === "all" || f.settled === "owed"); return (

Штрафы

{data ? data.debt !== 0 || data.open_count > 0 ? `Долг по штрафам ${formatMoney(data.debt)} · не погашено: ${data.open_count}` : "Долгов по штрафам нет" : " "}

{([["open", "Не погашены"], ["all", "Все"]] as const).map(([key, label]) => ( ))}
{isLoading ? (
) : isError ? (

Не удалось загрузить штрафы

) : items.length === 0 ? (

{active === "open" ? "Непогашенных штрафов нет" : "Штрафов не найдено"}

) : (
{items.map((f) => ( ))}
)}
); }