Proyectos de Subversion LeadersLinked - SPA

Rev

Rev 3698 | Ir a la última revisión | | Comparar con el anterior | Ultima modificación | Ver Log |

Rev Autor Línea Nro. Línea
3704 stevensc 1
import React, { useState } from 'react';
3476 stevensc 2
import { useDropzone } from 'react-dropzone';
3697 stevensc 3
import { Typography } from '@mui/material';
3694 stevensc 4
import Delete from '@mui/icons-material/Delete';
3697 stevensc 5
import { DragAndDropContainer, PreviewContainer, CloseButton } from './FilePicker.styles';
3476 stevensc 6
 
7
const FILE_TYPES = {
8
  image: 'image/jpeg, image/png, image/jpg',
9
  file: 'application/pdf, application/vnd.openxmlformats-officedocument.presentationml.presentation',
3639 stevensc 10
  video: 'video/mp4, video/mpeg, video/webm, video/quicktime',
3670 stevensc 11
  audio: 'audio/mpeg, audio/mp3, audio/wav, audio/ogg'
3476 stevensc 12
};
13
 
14
export function FilePicker({
15
  type = 'image',
16
  multiple = false,
17
  maxFiles = 1,
18
  description = 'Arrastra el archivo aqui, o haga click para seleccionar',
19
  defaultFiles = null,
20
  onChange = () => {}
21
}) {
22
  const [errors, setErrors] = useState([]);
3670 stevensc 23
  const [previews, setPreviews] = useState([]);
3476 stevensc 24
 
3697 stevensc 25
  const handlePreviews = (files) => {
26
    const previews = files.map((file) => {
27
      const preview = {
28
        url: URL.createObjectURL(file),
29
        name: file.name,
30
        type: file.type
31
      };
32
 
33
      return preview;
34
    });
35
 
3670 stevensc 36
    setPreviews(previews);
3697 stevensc 37
  };
3476 stevensc 38
 
3697 stevensc 39
  const onDropAccepted = (files) => {
40
    handlePreviews(files);
41
    onChange(multiple ? files : files[0]);
42
  };
43
 
44
  const onDropRejected = (rejections) => {
45
    if (rejections.length === 0) return;
46
    const errors = rejections.map((rejection) => rejection.errors[0].message);
47
    setErrors(errors);
48
  };
49
 
3476 stevensc 50
  const { getRootProps, getInputProps } = useDropzone({
51
    accept: FILE_TYPES[type] ?? FILE_TYPES.image,
52
    multiple,
53
    maxFiles,
3697 stevensc 54
    onDropAccepted,
55
    onDropRejected
3476 stevensc 56
  });
57
 
58
  const removeFile = () => {
3670 stevensc 59
    setPreviews([]);
3476 stevensc 60
    setErrors([]);
61
  };
62
 
3670 stevensc 63
  const filePreviewTest = (preview) => {
3642 stevensc 64
    switch (type) {
3476 stevensc 65
      case 'image':
3698 stevensc 66
        return <img src={preview.url} alt={preview.name} />;
3476 stevensc 67
      case 'video':
3698 stevensc 68
        return <video src={preview.url} width='400' height='300' controls muted />;
3476 stevensc 69
      case 'file':
3698 stevensc 70
        return <object data={preview.url} type='application/pdf' width='400' height='200' />;
3639 stevensc 71
      case 'audio':
3698 stevensc 72
        return <audio src={preview.url} controls muted />;
3476 stevensc 73
      default:
74
        break;
75
    }
76
  };
77
 
3704 stevensc 78
  if (previews.length > 0) {
3476 stevensc 79
    return (
80
      <PreviewContainer>
3670 stevensc 81
        {previews.map((preview) => filePreviewTest(preview))}
3476 stevensc 82
        <CloseButton onClick={removeFile}>
83
          <Delete />
84
        </CloseButton>
85
      </PreviewContainer>
86
    );
87
  }
88
 
89
  return (
90
    <>
91
      <DragAndDropContainer {...getRootProps()}>
92
        <input {...getInputProps()} />
93
        <p>{description}</p>
94
      </DragAndDropContainer>
95
 
96
      {errors.map((error, index) => (
97
        <Typography key={index} variant='caption' color='red'>
98
          {error}
99
        </Typography>
100
      ))}
101
    </>
102
  );
103
}