Spaces:
Sleeping
Sleeping
File size: 2,307 Bytes
c82f7c8 | 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 | import React, { useRef, useState } from 'react';
import './FileUpload.css';
function FileUpload({ label, onFileSelect, acceptedTypes, multiple, maxSize = 10 }) { // maxSize in MB
const fileInputRef = useRef(null);
const [dragActive, setDragActive] = useState(false);
const [error, setError] = useState('');
const validateFile = (file) => {
const sizeInMB = file.size / (1024 * 1024);
if (sizeInMB > maxSize) {
setError(`File size must be less than ${maxSize}MB`);
return false;
}
const fileType = file.type;
const validTypes = acceptedTypes.split(',').map(type => type.replace('.', 'application/'));
if (!validTypes.includes(fileType)) {
setError('Invalid file type');
return false;
}
setError('');
return true;
};
const handleFileChange = (e) => {
const files = Array.from(e.target.files);
if (multiple) {
const validFiles = files.filter(validateFile);
onFileSelect(validFiles);
} else {
const file = files[0];
if (validateFile(file)) {
onFileSelect(file);
}
}
};
const handleDrop = (e) => {
e.preventDefault();
setDragActive(false);
const files = Array.from(e.dataTransfer.files);
if (multiple) {
const validFiles = files.filter(validateFile);
onFileSelect(validFiles);
} else {
const file = files[0];
if (validateFile(file)) {
onFileSelect(file);
}
}
};
return (
<div className="file-upload">
<h3>{label}</h3>
<div
className={`drop-zone ${dragActive ? 'drag-active' : ''}`}
onClick={() => fileInputRef.current.click()}
onDrop={handleDrop}
onDragOver={(e) => {
e.preventDefault();
setDragActive(true);
}}
onDragLeave={() => setDragActive(false)}
>
<p>Drop files here or click to upload</p>
<p className="file-types">Accepted types: {acceptedTypes}</p>
<input
type="file"
ref={fileInputRef}
onChange={handleFileChange}
accept={acceptedTypes}
multiple={multiple}
style={{ display: 'none' }}
/>
</div>
{error && <p className="error-message">{error}</p>}
</div>
);
}
export default FileUpload; |