import { CloudArrowUp } from "@phosphor-icons/react"; import { useEffect, useState } from "react"; import { useTranslation } from "react-i18next"; import showToast from "../../../../../utils/toast"; import System from "../../../../../models/system"; import { useDropzone } from "react-dropzone"; import { v4 } from "uuid"; import FileUploadProgress from "./FileUploadProgress"; import Workspace from "../../../../../models/workspace"; import debounce from "lodash.debounce"; export default function UploadFile({ workspace, fetchKeys, setLoading, setLoadingMessage, }) { const { t } = useTranslation(); const [ready, setReady] = useState(false); const [files, setFiles] = useState([]); const [fetchingUrl, setFetchingUrl] = useState(false); const handleSendLink = async (e) => { e.preventDefault(); setLoading(true); setLoadingMessage("Scraping link..."); setFetchingUrl(true); const formEl = e.target; const form = new FormData(formEl); const { response, data } = await Workspace.uploadLink( workspace.slug, form.get("link") ); if (!response.ok) { showToast(`Error uploading link: ${data.error}`, "error"); } else { fetchKeys(true); showToast("Link uploaded successfully", "success"); formEl.reset(); } setLoading(false); setFetchingUrl(false); }; // Queue all fetchKeys calls through the same debouncer to prevent spamming the server. // either a success or error will trigger a fetchKeys call so the UI is not stuck loading. const debouncedFetchKeys = debounce(() => fetchKeys(true), 1000); const handleUploadSuccess = () => debouncedFetchKeys(); const handleUploadError = () => debouncedFetchKeys(); const onDrop = async (acceptedFiles, rejections) => { const newAccepted = acceptedFiles.map((file) => { return { uid: v4(), file, }; }); const newRejected = rejections.map((file) => { return { uid: v4(), file: file.file, rejected: true, reason: file.errors[0].code, }; }); setFiles([...newAccepted, ...newRejected]); }; useEffect(() => { async function checkProcessorOnline() { const online = await System.checkDocumentProcessorOnline(); setReady(online); } checkProcessorOnline(); }, []); const { getRootProps, getInputProps } = useDropzone({ onDrop, disabled: !ready, }); return (
{ready === false ? (
{t("connectors.upload.processor-offline")}
{t("connectors.upload.processor-offline-desc")}
) : files.length === 0 ? (
{t("connectors.upload.click-upload")}
{t("connectors.upload.file-types")}
) : (
{files.map((file) => ( ))}
)}
{t("connectors.upload.or-submit-link")}
{t("connectors.upload.privacy-notice")}
); }