// @flow import * as React from 'react'; import { observable } from 'mobx'; import { observer, inject } from 'mobx-react'; import { withRouter, type RouterHistory } from 'react-router-dom'; import { createGlobalStyle } from 'styled-components'; import invariant from 'invariant'; import importFile from 'utils/importFile'; import Dropzone from 'react-dropzone'; import DocumentsStore from 'stores/DocumentsStore'; import LoadingIndicator from 'components/LoadingIndicator'; const EMPTY_OBJECT = {}; let importingLock = false; type Props = { children: React.Node, collectionId: string, documentId?: string, activeClassName?: string, rejectClassName?: string, documents: DocumentsStore, disabled: boolean, location: Object, match: Object, history: RouterHistory, staticContext: Object, }; export const GlobalStyles = createGlobalStyle` .activeDropZone { border-radius: 4px; background: ${props => props.theme.slateDark}; svg { fill: ${props => props.theme.white}; } } .activeDropZone a { color: ${props => props.theme.white} !important; } `; @observer class DropToImport extends React.Component { @observable isImporting: boolean = false; onDropAccepted = async (files = []) => { if (importingLock) return; this.isImporting = true; importingLock = true; try { let collectionId = this.props.collectionId; const documentId = this.props.documentId; const redirect = files.length === 1; if (documentId && !collectionId) { const document = await this.props.documents.fetch(documentId); invariant(document, 'Document not available'); collectionId = document.collectionId; } for (const file of files) { const doc = await importFile({ documents: this.props.documents, file, documentId, collectionId, }); if (redirect) { this.props.history.push(doc.url); } } } finally { this.isImporting = false; importingLock = false; } }; render() { const { documentId, collectionId, documents, disabled, location, match, history, staticContext, ...rest } = this.props; if (this.props.disabled) return this.props.children; return ( {this.isImporting && } {this.props.children} ); } } export default inject('documents')(withRouter(DropToImport));