index.tsx 2.81 KB
Newer Older
dechen lin's avatar
dechen lin committed
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
118
import { Button } from "antd";
import cls from "classnames";
import UploadingOutlined from "@/assets/imgs/online.experience/UploadingOutlined.svg";
import styles from "./index.module.scss";
import Upload from "@/components/upload";
import { ReactNode } from "react";
import {
  postExtractTask,
  postReUploadExtractTask,
  SubmitRes,
} from "@/api/extract";

import { useParams } from "react-router-dom";
import { ExtractTaskType } from "@/types/extract-task-type";

interface IPdfUploadButtonProps {
  afterUploadSuccess?: (submitTask: SubmitRes) => void;
  afterAsyncCheck?: () => Promise<boolean>;
  text?: string | ReactNode;
  className?: string;
  showIcon?: boolean;
  beforeUpload?: () => void;
  onUploadError?: () => void;
  accept: string;
  extractType: ExtractTaskType;
  taskType?: string;
  submitType?: "submit" | "reUpload";
  isOcr?: boolean;
}

interface ILinearButtonProps {
  className?: string;
  text?: string | ReactNode;
  onClick?: () => void;
}

export const LinearButton = ({
  className = "",
  onClick,
  text,
}: ILinearButtonProps) => {
  return (
    <button
      onClick={() => onClick?.()}
      className={cls(styles.linearBtn, className)}
    >
      {text}
    </button>
  );
};

export const ExtractorUploadButton = ({
  text = "上传PDF",
  className = "",
  afterAsyncCheck,
  afterUploadSuccess,
  beforeUpload: beforeLocalUpload,
  onUploadError,
  showIcon = true,
  accept,
  extractType,
  taskType,
  submitType,
  isOcr,
}: IPdfUploadButtonProps) => {
  const urlParams = useParams();
  const beforeUpload = async () => {
    beforeLocalUpload?.();
    const isCheck = await afterAsyncCheck?.();
    return isCheck;
  };
  const onChange = async (pdfFile: any) => {
    if (pdfFile?.file?.status === "done") {
      const res =
        submitType === "reUpload"
          ? await postReUploadExtractTask(String(urlParams?.jobID))
          : await postExtractTask({
              fileKey: pdfFile?.file?.response?.data?.data?.file_key,
              fileName: pdfFile?.file?.name,
              taskType: extractType,
              isOcr,
            });

      if (res) {
        if (!("error" in res)) {
          afterUploadSuccess?.({
            ...(res || {}),
            type: extractType,
          } as any);
        } else {
          onUploadError?.();
        }
      } else {
        onUploadError?.();
      }
    }
  };

  return (
    <>
      <Upload
        isDragger
        accept={accept}
        className={cls(styles.gradientBtn, "mb-4", className)}
        beforeUpload={beforeUpload}
        showUploadList={false}
        onChange={onChange}
        openRead={true}
        taskType={taskType}
      >
        <div className="flex justify-center items-center ">
          {showIcon && <img src={UploadingOutlined} className="mr-1" />}
          {text}
        </div>
      </Upload>
    </>
  );
};