Skip to content

Commit 3e7759b

Browse files
committed
Added active file uploads component
1 parent 593af61 commit 3e7759b

File tree

9 files changed

+138
-106
lines changed

9 files changed

+138
-106
lines changed

package.json

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -29,6 +29,7 @@
2929
"react-toastify": "^7.0.4",
3030
"reactstrap": "^8.9.0",
3131
"styled-components": "^5.3.0",
32+
"uuid": "^8.3.2",
3233
"web-vitals": "^1.1.1"
3334
},
3435
"scripts": {

src/App.js

Lines changed: 5 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,7 @@ import Footer from './Components/Footer';
77
import './App.css';
88
import AuthContextProvider from './Context/Contexts/AuthContext';
99
import FileContextProvider from './Context/Contexts/FileContext';
10+
import FileUploadContextProvider from './Context/Contexts/FileUploadContext';
1011

1112
require('dotenv').config()
1213

@@ -15,10 +16,12 @@ function App() {
1516
<div className="App">
1617
<AuthContextProvider>
1718
<BrowserRouter>
18-
<FileContextProvider>
19+
<FileContextProvider>
1920
<Header/>
2021
<div className="routing-wrapper">
21-
<Routing/>
22+
<FileUploadContextProvider>
23+
<Routing/>
24+
</FileUploadContextProvider>
2225
</div>
2326
<Footer/>
2427
</FileContextProvider>

src/Components/FileComponents/FileForm.js

Lines changed: 27 additions & 83 deletions
Original file line numberDiff line numberDiff line change
@@ -3,12 +3,13 @@ import * as FileActionCreators from '../../Context/ActionCreators/FileActionCrea
33
import * as AuthActionCreators from '../../Context/ActionCreators/AuthActionCreater';
44
import { FileContext } from '../../Context/Contexts/FileContext';
55
import { AuthContext } from '../../Context/Contexts/AuthContext';
6+
import { FileUploadContext } from '../../Context/Contexts/FileUploadContext';
7+
import * as FileUploadActionCreators from '../../Context/ActionCreators/FileUploadActionCreater';
68
import axios from '../../utils/axios';
79
import { toast } from 'react-toastify';
810
import {useDropzone} from 'react-dropzone';
9-
import getFileSize from '../../utils/fileSize';
1011
import getFileType from '../../utils/fileType';
11-
12+
import { v4 as uuidv4 } from 'uuid';
1213
if((typeof TextDecoder==='undefined' || typeof TextEncoder==='undefined') && typeof require!=='undefined'){
1314
global.TextDecoder = require('util').TextDecoder
1415
global.TextEncoder = require('util').TextEncoder
@@ -33,48 +34,15 @@ const img = {
3334
height: '50px',
3435
width: '50px'
3536
};
36-
const FileForm = ({setCurrentPage}) => {
37-
const {fileState, fileDispatch} = useContext(FileContext)
37+
const FileForm = ({setCurrentPage, toggleFileFormModal, toggleFileUploadStatusModal}) => {
38+
const {fileState, fileDispatch} = useContext(FileContext);
39+
const {fileUploadDispatch} = useContext(FileUploadContext);
3840
const {authState} = useContext(AuthContext);
3941
const [files,setFiles] = useState([]);
40-
const [isDragActive, setIsDragActive] = useState(true);
4142
useEffect(()=>{
4243
series(files[0],0);
4344
},[files])
44-
const setStatus = (index, status, URL=undefined) =>{
45-
const temp = files;
46-
temp[index].file_status = status;
47-
if(URL){
48-
temp[index].default = process.env.REACT_APP_FRONTENDURL+"/"+URL;
49-
}
50-
setFiles(temp);
51-
}
52-
const renderStatus = (status, URL) =>{
53-
if(status=="uploaded"){
54-
return(
55-
<>
56-
<span className="fa fa-clipboard mx-2" role="button" onClick={() => {navigator.clipboard.writeText(URL)}}></span>
57-
<span className="text-success">
58-
<i className="fa fa-check-circle fa-lg"></i>
59-
</span>
60-
</>
61-
)
62-
}
63-
else if(status=="uploading"){
64-
return(
65-
<div class="spinner-grow" role="status">
66-
<span class="sr-only">Loading...</span>
67-
</div>
68-
)
69-
}
70-
else if(status=="error"){
71-
return(
72-
<span className="text-danger">
73-
<i class="fa fa-exclamation-circle fa-lg"></i>
74-
</span>
75-
)
76-
}
77-
}
45+
7846
async function getBuffer(file){
7947
const reader=new window.FileReader();
8048
return new Promise((resolve,reject)=>{
@@ -87,7 +55,8 @@ const FileForm = ({setCurrentPage}) => {
8755
}
8856
const series = (file,index) =>{
8957
if(file){
90-
setIsDragActive(false);
58+
toggleFileFormModal();
59+
toggleFileUploadStatusModal();
9160
handleSubmit(file,index,()=>{
9261
series(files[index+1],index+1);
9362
});
@@ -114,12 +83,9 @@ const FileForm = ({setCurrentPage}) => {
11483
fileDispatch(FileActionCreators.updateStartDate(undefined));
11584
FileActionCreators.loadFiles(fileDispatch,1,undefined,fileState.searchParam);
11685
setCurrentPage(1);
117-
setIsDragActive(true);
11886
}
11987
}
12088
const handleSubmit = async (file,i,callback)=>{
121-
const index=i
122-
12389
try{
12490
if(file==undefined){
12591
throw new Error("Invalid File")
@@ -140,69 +106,47 @@ const FileForm = ({setCurrentPage}) => {
140106
if(response.data.error){
141107
throw new Error(response.data.error);
142108
}
143-
setStatus(index, "uploaded", response.data.body.default);
109+
file.file_status = "uploaded";
110+
file.default = response.data.body.default;
111+
fileUploadDispatch(FileUploadActionCreators.fileUploadStateUpdateFile(file))
144112
authState.auth.storage_used+=fileData.size
145113
authState.auth.storage_used=parseFloat(authState.auth.storage_used.toFixed(4))
146114
AuthActionCreators.authStateUpdate(authState);
147115
localStorage.setItem("auth",JSON.stringify(authState.auth));
148116
callback();
149117
} catch(err){
150118
toast.error(err.message);
151-
setStatus(index, "error");
119+
file.status = "error";
120+
fileUploadDispatch(FileUploadActionCreators.fileUploadStateUpdateFile(file))
152121
callback();
153122
}
154123
}
155124

156125

157126
const {getRootProps,getInputProps} = useDropzone({
158127
onDrop: acceptedFiles => {
159-
setFiles(acceptedFiles.map(file => Object.assign(file, {
128+
const fileData = acceptedFiles.map(file => Object.assign(file, {
160129
preview: URL.createObjectURL(file),
161130
file_type: getFileType(file.name),
162131
file_name: file.name,
163132
file_size: file.size,
164-
file_status: "uploading"
165-
})));
133+
file_status: "uploading",
134+
file_id: uuidv4()
135+
}))
136+
fileUploadDispatch(FileUploadActionCreators.fileUploadStateAddFiles(fileData));
137+
setFiles(fileData);
138+
166139
}
167140
});
168-
const thumbFile = (file) =>{
169-
return(
170-
<div className="d-flex justify-content-between align-items-center">
171-
<div className="p-1 d-flex flex-row align-items-center">
172-
<img src={file.preview} style={img} alt="file"/>
173-
<span>
174-
<span className="px-2 font-weight-bold text-monospace">{file.file_name}</span>
175-
<span className="badge badge-info">{getFileSize(file.file_size)}</span>
176-
</span>
177-
</div>
178-
<span>
179-
{renderStatus(file.file_status, file.default)}
180-
</span>
181-
</div>
182-
)
183-
}
184-
const thumbs = files.map(file => {
185-
return(
186-
thumbFile(file)
187-
)
188-
});
189141
return (
190142
<div className="text-center">
191-
{isDragActive?
192-
<div {...getRootProps({style:baseStyle})}>
193-
<input {...getInputProps()} />
194-
<div className="">
195-
<img src="https://res.cloudinary.com/code-gambit/image/upload/v1621421198/Web%20App/file_40x40_sea3kj.png"/>
196-
<br></br>
197-
<p>Drag and Drop your files here</p>
198-
</div>
143+
<div {...getRootProps({style:baseStyle})}>
144+
<input {...getInputProps()} />
145+
<div className="">
146+
<img src="https://res.cloudinary.com/code-gambit/image/upload/v1621421198/Web%20App/file_40x40_sea3kj.png"/>
147+
<br></br>
148+
<p>Drag and Drop your files here</p>
199149
</div>
200-
:
201-
""
202-
}
203-
<div>
204-
205-
{thumbs}
206150
</div>
207151
</div>
208152

Lines changed: 69 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,69 @@
1+
import React, { useContext, useEffect } from 'react';
2+
import { FileUploadContext } from '../../Context/Contexts/FileUploadContext';
3+
import getFileSize from '../../utils/fileSize';
4+
import {UncontrolledTooltip} from 'reactstrap';
5+
import getFileIconURL from '../../utils/fileIcon';
6+
const img = {
7+
display: 'block',
8+
height: '50px',
9+
width: '50px'
10+
};
11+
const renderStatus = (status, URL, id) =>{
12+
if(status === "uploaded"){
13+
return(
14+
<div className="d-flex flex-row">
15+
<span className="fa fa-clipboard mx-2" role="button"
16+
onClick={() => {navigator.clipboard.writeText(process.env.REACT_APP_FRONTENDURL+"/"+URL)}}
17+
id={"copyURL"+id}
18+
></span>
19+
<UncontrolledTooltip placement="left" target={"copyURL"+id}>
20+
Copy URL
21+
</UncontrolledTooltip>
22+
<span className="text-success">
23+
<i className="fa fa-check-circle fa-lg"></i>
24+
</span>
25+
</div>
26+
)
27+
}
28+
else if(status === "uploading"){
29+
return(
30+
<div class="spinner-grow" role="status">
31+
<span class="sr-only">Loading...</span>
32+
</div>
33+
)
34+
}
35+
else if(status === "error"){
36+
return(
37+
<span className="text-danger">
38+
<i class="fa fa-exclamation-circle fa-lg"></i>
39+
</span>
40+
)
41+
}
42+
}
43+
const thumbFile = (file) =>{
44+
return(
45+
<div className="d-flex justify-content-between align-items-center my-1">
46+
<img src={getFileIconURL(file.file_name)} style={img} alt="file"/>
47+
<span className="font-weight-bold">{file.file_name}</span>
48+
<div className="d-flex align-items-center">
49+
<span className="badge badge-info">{getFileSize(file.file_size)}</span>
50+
{renderStatus(file.file_status, file.default, file.id)}
51+
</div>
52+
</div>
53+
)
54+
}
55+
const FileUploadStatus = () => {
56+
const {fileUploadState} = useContext(FileUploadContext);
57+
const thumbs = fileUploadState.files.map(file => {
58+
return(
59+
thumbFile(file)
60+
)
61+
});
62+
return (
63+
<div>
64+
{thumbs}
65+
</div>
66+
);
67+
}
68+
69+
export default FileUploadStatus;

src/Components/Screens/FileList.js

Lines changed: 33 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -2,16 +2,19 @@ import React, { useContext, useEffect, useState} from 'react';
22
import { Row, Modal, ModalHeader, ModalBody,
33
Pagination, PaginationItem, PaginationLink } from 'reactstrap';
44
import { FileContext } from '../../Context/Contexts/FileContext';
5+
import { FileUploadContext } from '../../Context/Contexts/FileUploadContext';
56
import * as FileActionCreators from '../../Context/ActionCreators/FileActionCreator';
67
import FileForm from '../FileComponents/FileForm';
78
import RenderFile from '../FileComponents/FileCard';
89
import { Loading } from '../Loading';
910
import FileDateFilter from '../FileComponents/FileDateFilter';
10-
11+
import FileUploadStatus from '../FileComponents/FileUploadStatus';
1112
const FileList = () => {
1213
const {fileState,fileDispatch} = useContext(FileContext);
14+
const {fileUploadState} = useContext(FileUploadContext);
1315
const [isFileFormOpen,setIsFileFormOpen] = useState(false);
1416
const [isFileDateFilterOpen, setIsFileDateFilterOpen] = useState(false);
17+
const [isFileUploadStatusModalOpen, setIsFileUploadStatusModalOpen] = useState(false);
1518
const [currentPage, setCurrentPage] = useState(fileState.currentPage);
1619
const [lastEKMap, setLastEKMap] = useState(fileState.lastEKMap);
1720
const [searchParam,setSearchParam] = useState(undefined);
@@ -45,11 +48,14 @@ const FileList = () => {
4548
}
4649

4750
const toggleFileFormModal = ()=>{
48-
setIsFileFormOpen(!isFileFormOpen)
51+
setIsFileFormOpen(!isFileFormOpen);
4952
}
5053
const toggleFileDateFilterModal = () =>{
5154
setIsFileDateFilterOpen(!isFileDateFilterOpen);
5255
}
56+
const toggleFileUploadStatusModal = () => {
57+
setIsFileUploadStatusModalOpen(!isFileUploadStatusModalOpen);
58+
}
5359
function goToNextPage(){
5460
setCurrentPage(fileState.currentPage+1);
5561
}
@@ -166,27 +172,46 @@ const FileList = () => {
166172
<div className="container">
167173
<h3 className="text-center pt-2">YOUR FILES</h3>
168174
<div className="d-flex justify-content-between align-items-center p-2">
169-
<div type="button" onClick={toggleFileFormModal}>
170-
<i class="fa fa-plus fa-lg"></i>
171-
</div>
175+
<div className="d-flex justify-content-between col-3">
176+
<div type="button" onClick={toggleFileFormModal}>
177+
<i class="fa fa-plus fa-lg"></i>
178+
</div>
179+
{fileUploadState.files.length>0?
180+
<div type="button" onClick={toggleFileUploadStatusModal}>
181+
<i class="fa fa-upload"></i>
182+
</div>
183+
:
184+
""
185+
}
186+
</div>
172187
<div>
173-
{renderFilters()}
188+
{renderFilters()}
174189
</div>
175190
</div>
176191
<Modal isOpen={isFileFormOpen} toggle={toggleFileFormModal} className="modal-dialog-centered">
177192
{/* <ModalHeader toggle={toggleFileFormModal}>Upload your files</ModalHeader> */}
178193
<ModalBody className="text-center modal-wrapper">
179-
<FileForm setCurrentPage={setCurrentPage}/>
194+
<FileForm
195+
setCurrentPage = {setCurrentPage}
196+
toggleFileFormModal = {toggleFileFormModal}
197+
toggleFileUploadStatusModal = {toggleFileUploadStatusModal}
198+
/>
180199
</ModalBody>
181200
</Modal>
182201
<Modal isOpen={isFileDateFilterOpen} toggle={toggleFileDateFilterModal}>
183-
<ModalHeader>Filter By Date</ModalHeader>
202+
<ModalHeader toggle={toggleFileDateFilterModal}>Filter By Date</ModalHeader>
184203
<ModalBody>
185204
<div className="text-center">
186205
<FileDateFilter toggle={toggleFileDateFilterModal}/>
187206
</div>
188207
</ModalBody>
189208
</Modal>
209+
<Modal isOpen={isFileUploadStatusModalOpen} toggle={toggleFileUploadStatusModal} className="modal-dialog-centered">
210+
<ModalHeader toggle={toggleFileUploadStatusModal}>File Uploads</ModalHeader>
211+
<ModalBody className="text-center modal-wrapper">
212+
<FileUploadStatus/>
213+
</ModalBody>
214+
</Modal>
190215
<div>
191216
{renderData()}
192217
</div>

src/Context/ActionCreators/FileUploadActionCreater.js

Lines changed: 0 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -1,18 +1,10 @@
11
import * as ActionTypes from '../ActionTypes';
2-
//import axios from 'axios';
3-
import axios from '../../utils/axios'
4-
import { toast } from 'react-toastify';
52

63
export const fileUploadStateAddFiles=(fileArray)=>({
74
type:ActionTypes.FILE_UPLOAD_STATE_ADD_FILES,
85
payload:fileArray
96
})
107

11-
export const fileUploadStateUpdateFiles=(fileArray)=>({
12-
type:ActionTypes.FILE_UPLOAD_STATE_UPDATE_FILES,
13-
payload:fileArray
14-
})
15-
168
export const fileUploadStateResetFiles = () => ({
179
type: ActionTypes.FILE_UPLOAD_STATE_RESET_FILES
1810
})

0 commit comments

Comments
 (0)