You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

123 lines
3.5 KiB

import { Button, Modal, Spin } from "antd";
import { useState } from "react";
import { getImportStatus, importPoints } from "../../api.js";
import { LoadingStage } from "./LoadingStage.jsx";
import { ReportStage } from "./ReportStage.jsx";
import {
CheckCircleOutlined,
CloseCircleOutlined,
LoadingOutlined
} from "@ant-design/icons";
import { useUpdateLayerCounter } from "../../stores/useUpdateLayerCounter.js";
export const PointsFileUploadModal = ({onClose, isOpened}) => {
const [fileId, setFileId] = useState();
const [report, setReport] = useState();
const [isImporting, setIsImporting] = useState(false);
const [isReportStage, setIsReportStage] = useState(false);
const [isError, setIsError] = useState(false);
const [importStatus, setImportStatus] = useState("Импортируем точки...")
const { toggleUpdateCounter } = useUpdateLayerCounter();
const onImportPoints = async () => {
setIsImporting(true);
try {
await importPoints(fileId);
const myInterval = setInterval(async () => {
const response = await getImportStatus();
setImportStatus(response.task_status);
if (response.task_status === "Перерасчет ML завершен" || !isOpened) {
setReport(response.data);
setIsImporting(false);
toggleUpdateCounter();
clearInterval(myInterval);
}
}, 2000);
toggleUpdateCounter();
} catch (e) {
setIsError(true);
setIsImporting(false);
}
}
const getFooter = () => {
if (isError) return [
<Button
key="error-button"
type="primary"
onClick={onClose}
>
Закрыть
</Button>
]
if (isReportStage) return [
<Button
key="finish-button"
type="primary"
onClick={onClose}
>
Перейти к выбору
</Button>
]
if (report) return [
<Button
key="report-button"
type="primary"
onClick={() => setIsReportStage(true)}
>
Просмотреть отчет
</Button>
]
return [
<Button
key="close-button"
type="default"
onClick={onClose}
>
Отмена
</Button>,
<Button
key="ok-button"
type="primary"
onClick={() => onImportPoints()}
disabled={!fileId || isImporting}
>
Импортировать
</Button>,
]
}
const getContent = () => {
if (isError) return (
<div className="flex items-center justify-center font-bold gap-2">
<CloseCircleOutlined style={{ fontSize: 24, color: "#FF4D4F" }} />
При импорте точек произошла ошибка
</div>
)
if (isImporting) return (
<div className="flex flex-col justify-center gap-2 items-center">
<Spin indicator={<LoadingOutlined style={{ fontSize: 64 }} spin />} />
{importStatus}
</div>
);
if (isReportStage) return <ReportStage report={report} />;
if (report) return (
<div className="flex items-center justify-center font-bold gap-2">
<CheckCircleOutlined style={{ fontSize: 24, color: "#52C41A" }} />
Точки успешно импортированы
</div>
);
return <LoadingStage setFileId={setFileId} />;
}
return (
<Modal
open={isOpened}
title="Импорт точек"
onCancel={onClose}
width={400}
footer={getFooter()}
>
{getContent()}
</Modal>
);
}