// src/pages/DraftsList.tsx import React, { useState } from "react"; import { useQuery } from "@tanstack/react-query"; import { List, Typography, Tag, Spin, Empty, DatePicker, Flex, Button, } from "antd"; import { useNavigate } from "react-router-dom"; import { ArrowRightOutlined, CheckCircleOutlined, DeleteOutlined, PlusOutlined, ExclamationCircleOutlined, LoadingOutlined, CloseCircleOutlined, StopOutlined, SyncOutlined, CloudServerOutlined, } from "@ant-design/icons"; import dayjs, { Dayjs } from "dayjs"; import { api } from "../services/api"; import type { UnifiedInvoice } from "../services/types"; const { Title, Text } = Typography; export const DraftsList: React.FC = () => { const navigate = useNavigate(); // Состояние фильтра дат: по умолчанию последние 7 дней const [startDate, setStartDate] = useState(dayjs().subtract(7, "day")); const [endDate, setEndDate] = useState(dayjs()); const [syncLoading, setSyncLoading] = useState(false); // Запрос данных с учетом дат (даты в ключе обеспечивают авто-перезапрос) const { data: invoices, isLoading, isError, refetch, } = useQuery({ queryKey: [ "drafts", startDate.format("YYYY-MM-DD"), endDate.format("YYYY-MM-DD"), ], queryFn: () => api.getDrafts( startDate.format("YYYY-MM-DD"), endDate.format("YYYY-MM-DD") ), staleTime: 0, refetchOnMount: true, refetchOnWindowFocus: true, }); const handleSync = async () => { setSyncLoading(true); try { await api.syncInvoices(); refetch(); } finally { setSyncLoading(false); } }; const getStatusTag = (item: UnifiedInvoice) => { switch (item.status) { case "PROCESSING": return ( } color="blue"> Обработка ); case "READY_TO_VERIFY": return ( } color="orange"> Проверка ); case "COMPLETED": return ( } color="green"> Готово ); case "ERROR": return ( } color="red"> Ошибка ); case "CANCELED": return ( } color="default"> Отменен ); case "NEW": return ( } color="blue"> Новая ); case "PROCESSED": return ( } color="green"> Проведена ); case "DELETED": return ( } color="red"> Удалена ); default: return {item.status}; } }; const handleInvoiceClick = (item: UnifiedInvoice) => { if (item.type === "DRAFT") { navigate("/invoice/draft/" + item.id); } else if (item.type === "SYNCED") { navigate("/invoice/view/" + item.id); } }; if (isError) { return (
Ошибка загрузки списка накладных
); } return (
Накладные
); };