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;