Spaces:
Running
Running
| import { FC, useCallback, useEffect, useMemo, useState } from "react"; | |
| import { useSearchParams } from "react-router-dom"; | |
| import Select from "react-select"; | |
| import { | |
| useActivateDataset, | |
| useCreateDatasetsDraft, | |
| useDeleteDataset, | |
| useDeleteFileFromDataset, | |
| useGetDatasets, | |
| } from "@/api/documents/hooks"; | |
| import Button from "@/components/generics/button/Button"; | |
| import Modal from "@/components/generics/modal/Modal"; | |
| import { DocsList } from "@/components/views/documents/docsList/DocsList"; | |
| import { CreateDatasetForm } from "@/components/views/documents/createDatasetForm/CreateDatasetForm"; | |
| import { AddDocumentForm } from "@/components/views/documents/addDocuimentForm/AddDocumentForm"; | |
| import "./Documents.scss"; | |
| const Documents: FC = () => { | |
| const { data: datasetsData, isLoading } = useGetDatasets(); | |
| const { mutate: deleteDatasetFn, isPending: isPendingDelete } = useDeleteDataset(); | |
| const { mutate: activateDatasetFn } = useActivateDataset(); | |
| const { mutate: deleteFileFn } = useDeleteFileFromDataset(); | |
| const { mutate: createDatasetsDraftFn } = useCreateDatasetsDraft(); | |
| const [searchParams, setSearchParams] = useSearchParams(); | |
| const [isOpen, setIsOpen] = useState<boolean>(false); | |
| const [modalContent, setModalContent] = useState<React.ReactNode>(null); | |
| useEffect(() => { | |
| if ( | |
| (!searchParams.get("datasetId") || | |
| !datasetsData?.find((e) => e.id.toString() == searchParams.get("datasetId"))) && | |
| datasetsData?.[0].id | |
| ) { | |
| setSearchParams({ datasetId: String(datasetsData?.[0].id) }); | |
| } | |
| }, [datasetsData, searchParams, setSearchParams]); | |
| const closeModal = () => setIsOpen(false); | |
| const currentDataset = useMemo( | |
| () => datasetsData?.find((e) => searchParams.get("datasetId") == e.id.toString()), | |
| [datasetsData, searchParams] | |
| ); | |
| const deleteDatasetModal = useMemo( | |
| () => ( | |
| <div className="docs-modal"> | |
| <p>Вы уверены что хотите удалить базу документов?</p> | |
| <div className="docs-modal-actions"> | |
| <Button name="Отмена" onClick={closeModal} /> | |
| <Button | |
| loading={isPendingDelete} | |
| name="Продолжить" | |
| onClick={() => | |
| currentDataset?.id | |
| ? deleteDatasetFn(currentDataset?.id, { | |
| onSuccess: () => { | |
| setSearchParams({ datasetId: String(datasetsData?.[0].id) }); | |
| setIsOpen(false); | |
| }, | |
| }) | |
| : null | |
| } | |
| /> | |
| </div> | |
| </div> | |
| ), | |
| [currentDataset?.id, datasetsData, deleteDatasetFn, isPendingDelete, setSearchParams] | |
| ); | |
| const activateDatasetModal = useMemo( | |
| () => ( | |
| <div className="docs-modal"> | |
| <p> | |
| Вы уверены что хотите выбрать новую базу документов? Процесс векторизации может занять продолжительное время. | |
| </p> | |
| <div className="docs-modal-actions"> | |
| <Button name="Отмена" onClick={closeModal} /> | |
| <Button | |
| name="Продолжить" | |
| onClick={() => activateDatasetFn(Number(currentDataset?.id), { onSuccess: () => location.reload() })} | |
| /> | |
| </div> | |
| </div> | |
| ), | |
| [activateDatasetFn, currentDataset?.id] | |
| ); | |
| const handleSelectChange = (selectedOption: { value: string; label: string } | null) => { | |
| const datasetId = selectedOption?.value ?? ""; | |
| setSearchParams({ datasetId }); | |
| }; | |
| const handleDeleteFile = useCallback( | |
| (fileId: number) => { | |
| if (currentDataset) { | |
| if (!currentDataset.isDraft) { | |
| createDatasetsDraftFn(currentDataset.id, { | |
| onSuccess: (newDatasetData) => { | |
| setSearchParams({ datasetId: newDatasetData.id.toString() }); | |
| deleteFileFn({ datasetId: newDatasetData.id, fileId: fileId }); | |
| }, | |
| }); | |
| } else { | |
| deleteFileFn({ datasetId: currentDataset.id, fileId: fileId }); | |
| } | |
| } | |
| }, | |
| [createDatasetsDraftFn, currentDataset, deleteFileFn, setSearchParams] | |
| ); | |
| const options = useMemo( | |
| () => | |
| datasetsData?.map((dataset) => ({ | |
| value: dataset.id.toString(), | |
| label: `${dataset.name} ${dataset.isDraft ? "(черновик)" : ""} ${dataset.isActive ? "(активный)" : ""}`, | |
| })), | |
| [datasetsData] | |
| ); | |
| return ( | |
| <div className="documents-page"> | |
| <div className="datasets-actions"> | |
| <Select | |
| options={options} | |
| placeholder="" | |
| isLoading={isLoading} | |
| classNamePrefix="react-select" | |
| value={options?.find((e) => e.value === searchParams.get("datasetId"))} | |
| onChange={handleSelectChange} | |
| theme={(theme) => ({ | |
| ...theme, | |
| colors: { | |
| ...theme.colors, | |
| text: "orangered", | |
| primary25: "var(--primary-color)", | |
| primary50: "var(--primary-color)", | |
| primary: "var(--secondary-color)", | |
| }, | |
| })} | |
| /> | |
| <Button | |
| name="Загрузить базу документов" | |
| onClick={() => { | |
| setModalContent(<CreateDatasetForm closeModal={closeModal} setSearchParams={setSearchParams} />); | |
| setIsOpen(true); | |
| }} | |
| /> | |
| </div> | |
| <div className="docs-actions"> | |
| <div className="datasets-name"> | |
| {currentDataset?.name} {currentDataset?.isDraft ? "(черновик)" : ""} | |
| </div> | |
| <div className="actions"> | |
| <Button | |
| name="Добавить новый документ" | |
| onClick={() => { | |
| setModalContent( | |
| <AddDocumentForm | |
| datasetId={Number(searchParams.get("datasetId"))} | |
| isDraft={currentDataset?.isDraft ?? true} | |
| closeModal={closeModal} | |
| setSearchParams={setSearchParams} | |
| /> | |
| ); | |
| setIsOpen(true); | |
| }} | |
| /> | |
| {!currentDataset?.isActive && ( | |
| <Button | |
| name="Удалить базу документов" | |
| onClick={() => { | |
| setModalContent(deleteDatasetModal); | |
| setIsOpen(true); | |
| }} | |
| /> | |
| )} | |
| <Button | |
| name="Использовать базу документов" | |
| onClick={() => { | |
| setModalContent(activateDatasetModal); | |
| setIsOpen(true); | |
| }} | |
| buttonType="secondary" | |
| /> | |
| </div> | |
| </div> | |
| {searchParams.get("datasetId") && | |
| datasetsData?.findIndex((e) => e.id === Number(searchParams.get("datasetId"))) != null && ( | |
| <DocsList datasetId={Number(searchParams.get("datasetId"))} handleDeleteFile={handleDeleteFile} /> | |
| )} | |
| <Modal isOpen={isOpen} closeModal={closeModal} label="Загрузить базу документов"> | |
| {modalContent} | |
| </Modal> | |
| </div> | |
| ); | |
| }; | |
| export default Documents; | |