diff --git a/digital-course-file/package-lock.json b/digital-course-file/package-lock.json index 926d82a87abd301cd42ae23198bab3ec948aa47f..3733eefb2da293859f3d202f309313f4ebd85081 100644 --- a/digital-course-file/package-lock.json +++ b/digital-course-file/package-lock.json @@ -28,6 +28,7 @@ "react-github-login-button": "^1.0.1", "react-google-button": "^0.7.2", "react-icons": "^4.2.0", + "react-id-generator": "^3.0.1", "react-loader-spinner": "^4.0.0", "react-router-bootstrap": "^0.25.0", "react-router-dom": "^5.2.0", @@ -15741,6 +15742,14 @@ "resolved": "https://registry.npmjs.org/react-icons/-/react-icons-4.2.0.tgz", "integrity": "sha512-rmzEDFt+AVXRzD7zDE21gcxyBizD/3NqjbX6cmViAgdqfJ2UiLer8927/QhhrXQV7dEj/1EGuOTPp7JnLYVJKQ==" }, + "node_modules/react-id-generator": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/react-id-generator/-/react-id-generator-3.0.1.tgz", + "integrity": "sha512-YxorMaYxB8ItXA3Cuadcl/8ZaquU9Tzrrr5ogFL8tNqevF96cmCtx3LZLXYqBEj3BxoV9aBIK5yJjIuX/XHQ1A==", + "peerDependencies": { + "react": ">= 16.8.0" + } + }, "node_modules/react-is": { "version": "17.0.1", "resolved": "https://registry.npmjs.org/react-is/-/react-is-17.0.1.tgz", @@ -34276,6 +34285,12 @@ "resolved": "https://registry.npmjs.org/react-icons/-/react-icons-4.2.0.tgz", "integrity": "sha512-rmzEDFt+AVXRzD7zDE21gcxyBizD/3NqjbX6cmViAgdqfJ2UiLer8927/QhhrXQV7dEj/1EGuOTPp7JnLYVJKQ==" }, + "react-id-generator": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/react-id-generator/-/react-id-generator-3.0.1.tgz", + "integrity": "sha512-YxorMaYxB8ItXA3Cuadcl/8ZaquU9Tzrrr5ogFL8tNqevF96cmCtx3LZLXYqBEj3BxoV9aBIK5yJjIuX/XHQ1A==", + "requires": {} + }, "react-is": { "version": "17.0.1", "resolved": "https://registry.npmjs.org/react-is/-/react-is-17.0.1.tgz", diff --git a/digital-course-file/package.json b/digital-course-file/package.json index 9c11193cd1ad92cc70080279ab4fd9489bf5f70e..987d348d91c1bc6e31fbf36f63e23b2013b04e77 100644 --- a/digital-course-file/package.json +++ b/digital-course-file/package.json @@ -24,6 +24,7 @@ "react-github-login-button": "^1.0.1", "react-google-button": "^0.7.2", "react-icons": "^4.2.0", + "react-id-generator": "^3.0.1", "react-loader-spinner": "^4.0.0", "react-router-bootstrap": "^0.25.0", "react-router-dom": "^5.2.0", diff --git a/digital-course-file/src/user/AddFile.js b/digital-course-file/src/user/AddFile.js index 6e52a91f61628160c31a9fada31a99cd4d1b0432..48a0c0d7a0864083ab3f1839093c14ae8f30294e 100644 --- a/digital-course-file/src/user/AddFile.js +++ b/digital-course-file/src/user/AddFile.js @@ -1,41 +1,37 @@ -import React, { useState } from "react" -import ReactDOM from "react-dom" -import { faFileUpload } from "@fortawesome/free-solid-svg-icons" -import { FontAwesomeIcon } from "@fortawesome/react-fontawesome" +import React, { useState } from 'react' +import ReactDOM from 'react-dom' +import { faFileUpload } from '@fortawesome/free-solid-svg-icons' +import { FontAwesomeIcon } from '@fortawesome/react-fontawesome' import { storage, database } from '../fire.js' -import { ROOT_FOLDER } from "../hooks/useFolder" -import { v4 as uuidV4 } from "uuid" -import { ProgressBar, Toast } from "react-bootstrap" +import { ROOT_FOLDER } from '../hooks/useFolder' +import { v4 as uuidV4 } from 'uuid' +import { ProgressBar, Toast } from 'react-bootstrap' import firebase from 'firebase' export default function AddFile({ currentFolder }) { const [uploadingFiles, setUploadingFiles] = useState([]) - function handleUpload(e) { const file = e.target.files[0] if (currentFolder == null || file == null) return const id = uuidV4() - setUploadingFiles(prevUploadingFiles => [ + setUploadingFiles((prevUploadingFiles) => [ ...prevUploadingFiles, { id: id, name: file.name, progress: 0, error: false }, ]) - const filePath = - currentFolder === ROOT_FOLDER - ? `${currentFolder.path.join("/")}/${file.name}` - : `${currentFolder.path.join("/")}/${currentFolder.name}/${file.name}` + const uniqueid = uuidV4() const uploadTask = storage - .ref(`/files/${firebase.auth().currentUser.uid}/${filePath}`) + .ref(`/files/${firebase.auth().currentUser.uid}/${uniqueid}`) .put(file) uploadTask.on( - "state_changed", - snapshot => { + 'state_changed', + (snapshot) => { const progress = snapshot.bytesTransferred / snapshot.totalBytes - setUploadingFiles(prevUploadingFiles => { - return prevUploadingFiles.map(uploadFile => { + setUploadingFiles((prevUploadingFiles) => { + return prevUploadingFiles.map((uploadFile) => { if (uploadFile.id === id) { return { ...uploadFile, progress: progress } } @@ -45,8 +41,8 @@ export default function AddFile({ currentFolder }) { }) }, () => { - setUploadingFiles(prevUploadingFiles => { - return prevUploadingFiles.map(uploadFile => { + setUploadingFiles((prevUploadingFiles) => { + return prevUploadingFiles.map((uploadFile) => { if (uploadFile.id === id) { return { ...uploadFile, error: true } } @@ -55,19 +51,19 @@ export default function AddFile({ currentFolder }) { }) }, () => { - setUploadingFiles(prevUploadingFiles => { - return prevUploadingFiles.filter(uploadFile => { + setUploadingFiles((prevUploadingFiles) => { + return prevUploadingFiles.filter((uploadFile) => { return uploadFile.id !== id }) }) - uploadTask.snapshot.ref.getDownloadURL().then(url => { + uploadTask.snapshot.ref.getDownloadURL().then((url) => { database.files - .where("name", "==", file.name) - .where("userId", "==", firebase.auth().currentUser.uid) - .where("folderId", "==", currentFolder.id) + .where('name', '==', file.name) + .where('userId', '==', firebase.auth().currentUser.uid) + .where('folderId', '==', currentFolder.id) .get() - .then(existingFiles => { + .then((existingFiles) => { const existingFile = existingFiles.docs[0] if (existingFile) { existingFile.ref.update({ url: url }) @@ -75,6 +71,7 @@ export default function AddFile({ currentFolder }) { database.files.add({ url: url, name: file.name, + uniqueid: uniqueid, createdAt: database.getTime(), folderId: currentFolder.id, userId: firebase.auth().currentUser.uid, @@ -88,31 +85,31 @@ export default function AddFile({ currentFolder }) { return ( <> - <label className="btn btn-outline-success btn-sm m-0 mr-2"> + <label className='btn btn-outline-success btn-sm m-0 mr-2'> <FontAwesomeIcon icon={faFileUpload} /> <input - name="upload" - type="file" + name='upload' + type='file' onChange={handleUpload} - style={{ opacity: 0, position: "absolute", left: "-9999px" }} + style={{ opacity: 0, position: 'absolute', left: '-9999px' }} /> </label> {uploadingFiles.length > 0 && ReactDOM.createPortal( <div style={{ - position: "absolute", - bottom: "4rem", - right: "2rem", - maxWidth: "250px", + position: 'absolute', + bottom: '4rem', + right: '2rem', + maxWidth: '250px', }} > - {uploadingFiles.map(file => ( + {uploadingFiles.map((file) => ( <Toast key={file.id} onClose={() => { - setUploadingFiles(prevUploadingFiles => { - return prevUploadingFiles.filter(uploadFile => { + setUploadingFiles((prevUploadingFiles) => { + return prevUploadingFiles.filter((uploadFile) => { return uploadFile.id !== file.id }) }) @@ -120,18 +117,18 @@ export default function AddFile({ currentFolder }) { > <Toast.Header closeButton={file.error} - className="text-truncate w-100 d-block" + className='text-truncate w-100 d-block' > {file.name} </Toast.Header> <Toast.Body> <ProgressBar animated={!file.error} - variant={file.error ? "danger" : "primary"} + variant={file.error ? 'danger' : 'primary'} now={file.error ? 100 : file.progress * 100} label={ file.error - ? "Error" + ? 'Error' : `${Math.round(file.progress * 100)}%` } /> @@ -143,4 +140,4 @@ export default function AddFile({ currentFolder }) { )} </> ) -} \ No newline at end of file +} diff --git a/digital-course-file/src/user/Dropzone.js b/digital-course-file/src/user/Dropzone.js index 1e42498dbb3d7e7aca8f634c652fc5dee7c25574..4e32cf835d2ec9ee7220df41a0bd566b41707716 100644 --- a/digital-course-file/src/user/Dropzone.js +++ b/digital-course-file/src/user/Dropzone.js @@ -51,13 +51,10 @@ export default function Dropzone({ currentFolder }) { ...prevUploadingFiles, { id: id, name: file.name, progress: 0, error: false }, ]) - const filePath = - currentFolder === ROOT_FOLDER - ? `${currentFolder.path.join('/')}/${file.name}` - : `${currentFolder.path.join('/')}/${currentFolder.name}/${file.name}` + const uniqueid = uuidV4() const uploadTask = storage - .ref(`/files/${firebase.auth().currentUser.uid}/${filePath}`) + .ref(`/files/${firebase.auth().currentUser.uid}/${uniqueid}`) .put(file) uploadTask.on( @@ -105,6 +102,7 @@ export default function Dropzone({ currentFolder }) { database.files.add({ url: url, name: file.name, + uniqueid:uniqueid, createdAt: database.getTime(), folderId: currentFolder.id, userId: firebase.auth().currentUser.uid,