import { useQuery } from "@tanstack/react-query"; import { getStatement, type StatementKind } from "@/api/driver"; import { formatDate, formatMoney } from "@/lib/format"; import { Spinner } from "@/components/Spinner"; const FILTERS: { key: StatementKind; label: string }[] = [ { key: "all", label: "Все операции" }, { key: "charges", label: "Начисления" }, { key: "payments", label: "Пополнения" }, { key: "fines", label: "Штрафы" }, ]; /** * Выписка по счёту за период — нижняя половина главного экрана. * * Это ответ на вопрос «за что списано», который иначе задают звонком в парк. * Строки те же, по которым 1С считает долг: аренда, пени, штрафы, пополнения. */ export function Statement({ from, to, kind, onFrom, onTo, onKind }: { from: string; to: string; kind: StatementKind; onFrom: (v: string) => void; onTo: (v: string) => void; onKind: (k: StatementKind) => void; }) { const { data, isLoading, isError, refetch } = useQuery({ queryKey: ["statement", from, to, kind], queryFn: () => getStatement(from, to, kind), }); const items = data?.items ?? []; return (
{/* Нативный date-input: календарь телефона знакомее любого нашего. */} onFrom(e.target.value)} aria-label="Начало периода" className="card flex-1 px-3 py-2 text-xs bg-white" /> onTo(e.target.value)} aria-label="Конец периода" className="card flex-1 px-3 py-2 text-xs bg-white" />
{FILTERS.map((f) => ( ))}
{isLoading ? (
) : isError ? (

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

) : items.length === 0 ? (

Нет операций за выбранный период

) : (
{items.map((op, idx) => (
{op.title} {formatDate(op.date)} {op.description ? ` · ${op.description}` : ""} {formatMoney(op.amount)}
))}
)}
); }