Skip to content

Commit 32fb16d

Browse files
author
Jovert Lota Palonpon
committed
wip - Dropzone Component #23
1 parent 60528e2 commit 32fb16d

File tree

4 files changed

+69
-25
lines changed

4 files changed

+69
-25
lines changed

app/Http/Controllers/Api/V1/UsersController.php

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -137,7 +137,7 @@ public function restore(Request $request, $id)
137137
*/
138138
public function storeAvatar(Request $request, User $user) : JsonResponse
139139
{
140-
return response()->json();
140+
return response()->json($user);
141141
}
142142

143143
/**

app/Traits/UploadsFiles.php

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,7 @@
22

33
namespace App\Traits;
44

5-
use Uploader;
5+
use App\Utils\Uploader;
66
use Illuminate\Http\UploadedFile;
77

88
trait UploadsFiles

resources/js/ui/Dropzone.js

Lines changed: 62 additions & 22 deletions
Original file line numberDiff line numberDiff line change
@@ -17,23 +17,28 @@ import {
1717
import {
1818
Block as BlockIcon,
1919
CheckCircle as CheckCircleIcon,
20+
Queue as QueueIcon,
2021
} from '@material-ui/icons';
2122

2223
import * as StringUtils from '../utils/String';
2324
import { LinearDeterminate } from './Loaders';
2425

2526
const getFileStatusClass = status => {
2627
switch (status) {
28+
case 'queued':
29+
return 'fileQueued';
30+
break;
31+
2732
case 'uploaded':
28-
return 'fileSuccess';
33+
return 'fileUploaded';
2934
break;
3035

3136
case 'rejected':
32-
return 'fileError';
37+
return 'fileRejected';
3338
break;
3439

3540
default:
36-
return 'filePrimary';
41+
return 'fileUploading';
3742
break;
3843
}
3944
};
@@ -42,12 +47,21 @@ let FileIcon = props => {
4247
const { classes, status } = props;
4348

4449
switch (status) {
50+
case 'queued':
51+
return <QueueIcon className={classes.queued} fontSize="large" />;
52+
break;
53+
4554
case 'uploaded':
46-
return <CheckCircleIcon color="primary" fontSize="large" />;
55+
return (
56+
<CheckCircleIcon
57+
className={classes.uploaded}
58+
fontSize="large"
59+
/>
60+
);
4761
break;
4862

4963
case 'rejected':
50-
return <BlockIcon className={classes.error} fontSize="large" />;
64+
return <BlockIcon className={classes.rejected} fontSize="large" />;
5165
break;
5266

5367
default:
@@ -60,15 +74,20 @@ let FileIcon = props => {
6074

6175
FileIcon.propTypes = {
6276
classes: PropTypes.object.isRequired,
63-
status: PropTypes.oneOf(['uploading', 'uploaded', 'rejected']).isRequired,
77+
status: PropTypes.oneOf(['queued', 'uploading', 'uploaded', 'rejected'])
78+
.isRequired,
6479
};
6580

6681
FileIcon = withStyles(theme => ({
67-
success: {
82+
queued: {
83+
color: theme.palette.grey[500],
84+
},
85+
86+
uploaded: {
6887
color: colors.green[600],
6988
},
7089

71-
error: {
90+
rejected: {
7291
color: theme.palette.error.light,
7392
},
7493

@@ -82,11 +101,17 @@ FileIcon = withStyles(theme => ({
82101
}))(FileIcon);
83102

84103
function Dropzone(props) {
85-
const { classes, acceptedFileTypes, maxFiles, maxFileSize } = props;
104+
const {
105+
classes,
106+
acceptedFileTypes,
107+
maxFiles,
108+
maxFileSize,
109+
handleUpload,
110+
} = props;
86111

87112
const [files, setFiles] = useState([]);
88113

89-
const getFileErrorMessage = file => {
114+
const getfileRejectedMessage = file => {
90115
let errors = [];
91116

92117
if (
@@ -116,7 +141,8 @@ function Dropzone(props) {
116141
acceptedFiles = acceptedFiles.map(file =>
117142
Object.assign(file, {
118143
url: URL.createObjectURL(file),
119-
status: 'uploading',
144+
status: 'queued',
145+
message: 'File is on the waiting queue.',
120146
}),
121147
);
122148

@@ -126,11 +152,21 @@ function Dropzone(props) {
126152
status: 'rejected',
127153
message: file.hasOwnProperty('message')
128154
? file.message
129-
: getFileErrorMessage(file),
155+
: getfileRejectedMessage(file),
130156
}),
131157
);
132158

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+
);
134170
},
135171
noClick: true,
136172
noKeyboard: true,
@@ -143,9 +179,9 @@ function Dropzone(props) {
143179
files.forEach(file => {
144180
// Make sure to revoke the data uris to avoid memory leaks.
145181
URL.revokeObjectURL(file.preview);
146-
147-
// Process uploading here.
148182
});
183+
184+
// If there aren't any one being uploaded, pick one from the queue.
149185
},
150186
[files],
151187
);
@@ -321,9 +357,9 @@ function Dropzone(props) {
321357

322358
Dropzone.propTypes = {
323359
acceptedFileTypes: PropTypes.array,
324-
onDrop: PropTypes.func,
325360
maxFiles: PropTypes.number,
326361
maxFileSize: PropTypes.number,
362+
handleUpload: PropTypes.func.isRequired,
327363
};
328364

329365
Dropzone.defaultProps = {
@@ -401,16 +437,20 @@ const styles = theme => ({
401437
},
402438
},
403439

404-
fileSuccess: {
405-
border: `2px solid ${colors.green[600]}`,
440+
fileQueued: {
441+
border: `2px solid ${theme.palette.grey[500]}`,
406442
},
407443

408-
fileError: {
409-
border: `2px solid ${theme.palette.error.light}`,
444+
fileUploading: {
445+
border: `2px solid ${theme.palette.primary.main}`,
410446
},
411447

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}`,
414454
},
415455

416456
fileAdd: {

resources/js/views/__backoffice/users/Forms/Avatar.js

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -14,7 +14,11 @@ const Avatar = props => {
1414
Avatar Upload
1515
</Typography>
1616

17-
<Dropzone maxFiles={2} maxFileSize={2} />
17+
<Dropzone
18+
maxFiles={2}
19+
maxFileSize={2}
20+
handleUpload={file => console.log(file)}
21+
/>
1822

1923
<div className={classes.sectionSpacer} />
2024

0 commit comments

Comments
 (0)