import { observer } from "mobx-react"; import * as React from "react"; import Dropzone from "react-dropzone"; import { useTranslation } from "react-i18next"; import styled, { css } from "styled-components"; import HelpText from "~/components/HelpText"; import LoadingIndicator from "~/components/LoadingIndicator"; import useImportDocument from "~/hooks/useImportDocument"; import useToasts from "~/hooks/useToasts"; type Props = { children: React.ReactNode; disabled: boolean; accept: string; collectionId: string; }; function DropToImport({ children, disabled, accept, collectionId }: Props) { const { handleFiles, isImporting } = useImportDocument(collectionId); const { showToast } = useToasts(); const { t } = useTranslation(); const handleRejection = React.useCallback(() => { showToast( t("Document not supported – try Markdown, Plain text, HTML, or Word"), { type: "error", } ); }, [t, showToast]); return ( {({ getRootProps, getInputProps, isDragActive }) => ( {isImporting && } {children} {t("Drop documents to import")} )} ); } const DropMessage = styled(HelpText)` opacity: 0; pointer-events: none; `; const DropzoneContainer = styled.div<{ isDragActive?: boolean }>` outline-color: transparent !important; height: calc(100% - 56px); position: relative; ${({ isDragActive, theme }) => isDragActive && css` &:after { display: block; content: ""; position: absolute; top: 24px; right: 24px; left: 24px; height: 85vh; background: ${theme.background}; border-radius: 8px; border: 1px dashed ${theme.divider}; box-shadow: 0 0 0 100px white; z-index: 1; } ${DropMessage} { opacity: 1; z-index: 2; position: absolute; text-align: center; top: 50vh; left: 50%; transform: translateX(-50%); } `} `; export default observer(DropToImport);