diff --git a/packages/web/components/templates/UploadModal.tsx b/packages/web/components/templates/UploadModal.tsx index 1e065edf0..872a76fd7 100644 --- a/packages/web/components/templates/UploadModal.tsx +++ b/packages/web/components/templates/UploadModal.tsx @@ -15,6 +15,10 @@ import { uploadFileRequestMutation } from '../../lib/networking/mutations/upload import axios from 'axios' import { File } from 'phosphor-react' import { showErrorToast } from '../../lib/toastHelpers' +import { + UploadImportFileType, + uploadImportFileRequestMutation, +} from '../../lib/networking/mutations/uploadImportFileMutation' const DragnDropContainer = styled('div', { width: '100%', @@ -80,6 +84,7 @@ type UploadingFile = { progress: number status: 'inprogress' | 'success' | 'error' openUrl: string | undefined + contentType: string } export function UploadModal(props: UploadModalProps): JSX.Element { @@ -106,19 +111,53 @@ export function UploadModal(props: UploadModalProps): JSX.Element { [dropzoneRef] ) + const uploadSignedUrlForFile = async (file: UploadingFile) => { + switch (file.contentType) { + case 'text/csv': { + const result = await uploadImportFileRequestMutation( + UploadImportFileType.URL_LIST, + file.contentType + ) + return [result?.uploadSignedUrl, undefined] + } + case 'application/zip': { + const result = await uploadImportFileRequestMutation( + UploadImportFileType.MATTER, + file.contentType + ) + return [result?.uploadSignedUrl, undefined] + } + case 'application/pdf': + case 'application/epub+zip': { + const request = await uploadFileRequestMutation({ + // This will tell the backend not to save the URL + // and give it the local filename as the title. + url: `file://local/${file.id}/${file.file.path}`, + contentType: file.contentType, + createPageEntry: true, + }) + return [request?.uploadSignedUrl, request?.createdPageId] + } + } + return [undefined, undefined] + } + const handleAcceptedFiles = useCallback( (acceptedFiles: any, event: DropEvent) => { setInDragOperation(false) - const addedFiles = acceptedFiles.map((file: { name: any }) => { - return { - id: uuidv4(), - file: file, - name: file.name, - progress: 0, - status: 'inprogress', + const addedFiles = acceptedFiles.map( + (file: { name: any; type: string }) => { + return { + id: uuidv4(), + file: file, + name: file.name, + progress: 0, + status: 'inprogress', + contentType: file.type, + } } - }) + ) const allFiles = [...uploadFiles, ...addedFiles] @@ -127,22 +166,17 @@ export function UploadModal(props: UploadModalProps): JSX.Element { for (const file of addedFiles) { try { console.log('using content type: ', file.file.type) - const request = await uploadFileRequestMutation({ - // This will tell the backend not to save the URL - // and give it the local filename as the title. - url: `file://local/${file.id}/${file.file.path}`, - contentType: file.file.type, - createPageEntry: true, - }) - - if (!request?.uploadSignedUrl) { + const [uploadSignedUrl, requestId] = await uploadSignedUrlForFile( + file + ) + if (!uploadSignedUrl) { showErrorToast('No upload URL available') return } const uploadResult = await axios.request({ method: 'PUT', - url: request?.uploadSignedUrl, + url: uploadSignedUrl, data: file.file, withCredentials: false, headers: { @@ -162,7 +196,7 @@ export function UploadModal(props: UploadModalProps): JSX.Element { file.progress = 100 file.status = 'success' - file.openUrl = `/article/sr/${request.createdPageId}` + file.openUrl = requestId ? `/article/sr/${requestId}` : undefined setUploadFiles([...allFiles]) } catch (error) { @@ -216,6 +250,8 @@ export function UploadModal(props: UploadModalProps): JSX.Element { preventDropOnDocument={true} noClick={true} accept={{ + 'text/csv': ['.csv'], + 'application/zip': ['.zip'], 'application/pdf': ['.pdf'], 'application/epub+zip': ['.epub'], }} @@ -318,6 +354,9 @@ export function UploadModal(props: UploadModalProps): JSX.Element { {file.status == 'success' && file.openUrl && ( Read Now )} + {file.status == 'success' && !file.openUrl && ( + Your import has started + )} {file.status == 'error' && ( Error Uploading