File size: 2,707 Bytes
79278ec
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
import "./DocumentModal.scss";

import { FC, useCallback, useEffect, useState } from "react";

import Button from "@/components/generics/button/Button";
import { GoX } from "react-icons/go";
import Modal from "react-modal";
import PdfViewer from "./PdfViewer";
import Spinner from "@/components/generics/spinner/Spinner";
import { getDocumentPdf } from "@/api/documents/documentsApi";

export interface DocumentModalProps {
  isOpen: boolean;
  file_id: string | null;
  file_xml_name: string;
  filename: string;
  setIsOpen: React.Dispatch<React.SetStateAction<boolean>>;
}
const customStyles = {
  content: {
    top: "50%",
    left: "50%",
    right: "auto",
    bottom: "auto",
    transform: "translate(-50%, -50%)",
    borderRadius: "15px",
    minWidth: "600px",
  },
};

export const DocumentModal: FC<DocumentModalProps> = ({
  isOpen,
  file_id,
  filename,
  setIsOpen,
}) => {
  const [file, setFile] = useState<{ file: Blob; filename: string } | null>(
    null
  );
  const [isLoading, setIsLoading] = useState(false);
  const [isError, setIsError] = useState(false);

  const handleRead = useCallback(() => {
    setIsLoading(true);

    if (file_id !== null) {
      getDocumentPdf(null, file_id, filename)
        .then((file) => {
          setIsError(false);
          setFile(file);
        })
        .catch(() => {
          setIsError(true);
        })
        .finally(() => {
          setIsLoading(false);
        });
    }

  }, [file_id, filename]);

  useEffect(() => {
    if (isOpen) {
      handleRead();
    }
  }, [handleRead, isOpen]);

  function closeModal() {
    setIsOpen(false);
    setFile(null);
  }

  return (
    <Modal
      style={customStyles}
      isOpen={isOpen}
      ariaHideApp={false}
      onRequestClose={closeModal}
    >
      <div className={"document_modal"}>
        <div className="actions">
          <h3 className="filename" title={filename}>
            {filename}
          </h3>
          <Button
            name={""}
            onClick={closeModal}
            icon={<GoX />}
            buttonType="link"
          />
        </div>
        {isLoading || isError ? (
          <div
            style={{
              display: "flex",
              gap: "10px",
              alignItems: "center",
              flexDirection: "column",
            }}
          >
            {!isError ? (
              <>
                Загрузка документа
                <Spinner />
              </>
            ) : (
              <>Ошибка загрузки документа</>
            )}
          </div>
        ) : (
          <PdfViewer file={file?.file ?? null} />
        )}
      </div>
    </Modal>
  );
};