@@ -17,23 +17,28 @@ import {
17
17
import {
18
18
Block as BlockIcon ,
19
19
CheckCircle as CheckCircleIcon ,
20
+ Queue as QueueIcon ,
20
21
} from '@material-ui/icons' ;
21
22
22
23
import * as StringUtils from '../utils/String' ;
23
24
import { LinearDeterminate } from './Loaders' ;
24
25
25
26
const getFileStatusClass = status => {
26
27
switch ( status ) {
28
+ case 'queued' :
29
+ return 'fileQueued' ;
30
+ break ;
31
+
27
32
case 'uploaded' :
28
- return 'fileSuccess ' ;
33
+ return 'fileUploaded ' ;
29
34
break ;
30
35
31
36
case 'rejected' :
32
- return 'fileError ' ;
37
+ return 'fileRejected ' ;
33
38
break ;
34
39
35
40
default :
36
- return 'filePrimary ' ;
41
+ return 'fileUploading ' ;
37
42
break ;
38
43
}
39
44
} ;
@@ -42,12 +47,21 @@ let FileIcon = props => {
42
47
const { classes, status } = props ;
43
48
44
49
switch ( status ) {
50
+ case 'queued' :
51
+ return < QueueIcon className = { classes . queued } fontSize = "large" /> ;
52
+ break ;
53
+
45
54
case 'uploaded' :
46
- return < CheckCircleIcon color = "primary" fontSize = "large" /> ;
55
+ return (
56
+ < CheckCircleIcon
57
+ className = { classes . uploaded }
58
+ fontSize = "large"
59
+ />
60
+ ) ;
47
61
break ;
48
62
49
63
case 'rejected' :
50
- return < BlockIcon className = { classes . error } fontSize = "large" /> ;
64
+ return < BlockIcon className = { classes . rejected } fontSize = "large" /> ;
51
65
break ;
52
66
53
67
default :
@@ -60,15 +74,20 @@ let FileIcon = props => {
60
74
61
75
FileIcon . propTypes = {
62
76
classes : PropTypes . object . isRequired ,
63
- status : PropTypes . oneOf ( [ 'uploading' , 'uploaded' , 'rejected' ] ) . isRequired ,
77
+ status : PropTypes . oneOf ( [ 'queued' , 'uploading' , 'uploaded' , 'rejected' ] )
78
+ . isRequired ,
64
79
} ;
65
80
66
81
FileIcon = withStyles ( theme => ( {
67
- success : {
82
+ queued : {
83
+ color : theme . palette . grey [ 500 ] ,
84
+ } ,
85
+
86
+ uploaded : {
68
87
color : colors . green [ 600 ] ,
69
88
} ,
70
89
71
- error : {
90
+ rejected : {
72
91
color : theme . palette . error . light ,
73
92
} ,
74
93
@@ -82,11 +101,17 @@ FileIcon = withStyles(theme => ({
82
101
} ) ) ( FileIcon ) ;
83
102
84
103
function Dropzone ( props ) {
85
- const { classes, acceptedFileTypes, maxFiles, maxFileSize } = props ;
104
+ const {
105
+ classes,
106
+ acceptedFileTypes,
107
+ maxFiles,
108
+ maxFileSize,
109
+ handleUpload,
110
+ } = props ;
86
111
87
112
const [ files , setFiles ] = useState ( [ ] ) ;
88
113
89
- const getFileErrorMessage = file => {
114
+ const getfileRejectedMessage = file => {
90
115
let errors = [ ] ;
91
116
92
117
if (
@@ -116,7 +141,8 @@ function Dropzone(props) {
116
141
acceptedFiles = acceptedFiles . map ( file =>
117
142
Object . assign ( file , {
118
143
url : URL . createObjectURL ( file ) ,
119
- status : 'uploading' ,
144
+ status : 'queued' ,
145
+ message : 'File is on the waiting queue.' ,
120
146
} ) ,
121
147
) ;
122
148
@@ -126,11 +152,21 @@ function Dropzone(props) {
126
152
status : 'rejected' ,
127
153
message : file . hasOwnProperty ( 'message' )
128
154
? file . message
129
- : getFileErrorMessage ( file ) ,
155
+ : getfileRejectedMessage ( file ) ,
130
156
} ) ,
131
157
) ;
132
158
133
- setFiles ( files . concat ( acceptedFiles , rejectedFiles ) ) ;
159
+ setFiles (
160
+ files . concat ( acceptedFiles , rejectedFiles ) . map ( ( file , key ) => {
161
+ if ( key === 0 && file . status === 'queued' ) {
162
+ file . status = 'uploading' ;
163
+
164
+ return file ;
165
+ }
166
+
167
+ return file ;
168
+ } ) ,
169
+ ) ;
134
170
} ,
135
171
noClick : true ,
136
172
noKeyboard : true ,
@@ -143,9 +179,9 @@ function Dropzone(props) {
143
179
files . forEach ( file => {
144
180
// Make sure to revoke the data uris to avoid memory leaks.
145
181
URL . revokeObjectURL ( file . preview ) ;
146
-
147
- // Process uploading here.
148
182
} ) ;
183
+
184
+ // If there aren't any one being uploaded, pick one from the queue.
149
185
} ,
150
186
[ files ] ,
151
187
) ;
@@ -321,9 +357,9 @@ function Dropzone(props) {
321
357
322
358
Dropzone . propTypes = {
323
359
acceptedFileTypes : PropTypes . array ,
324
- onDrop : PropTypes . func ,
325
360
maxFiles : PropTypes . number ,
326
361
maxFileSize : PropTypes . number ,
362
+ handleUpload : PropTypes . func . isRequired ,
327
363
} ;
328
364
329
365
Dropzone . defaultProps = {
@@ -401,16 +437,20 @@ const styles = theme => ({
401
437
} ,
402
438
} ,
403
439
404
- fileSuccess : {
405
- border : `2px solid ${ colors . green [ 600 ] } ` ,
440
+ fileQueued : {
441
+ border : `2px solid ${ theme . palette . grey [ 500 ] } ` ,
406
442
} ,
407
443
408
- fileError : {
409
- border : `2px solid ${ theme . palette . error . light } ` ,
444
+ fileUploading : {
445
+ border : `2px solid ${ theme . palette . primary . main } ` ,
410
446
} ,
411
447
412
- filePrimary : {
413
- border : `2px solid ${ theme . palette . primary . main } ` ,
448
+ fileUploaded : {
449
+ border : `2px solid ${ colors . green [ 600 ] } ` ,
450
+ } ,
451
+
452
+ fileRejected : {
453
+ border : `2px solid ${ theme . palette . error . light } ` ,
414
454
} ,
415
455
416
456
fileAdd : {
0 commit comments