Proyectos de Subversion LeadersLinked - Antes de SPA

Rev

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

Rev Autor Línea Nro. Línea
3193 stevensc 1
/* eslint-disable react/prop-types */
5289 stevensc 2
import React, { useState, useCallback, useEffect } from 'react'
3
import { useDropzone } from 'react-dropzone'
4
import { shareModalTypes } from '../../redux/share-modal/shareModal.types'
5
import FormErrorFeedback from '../form-error-feedback/FormErrorFeedback'
6019 stevensc 6
import IconButton from '@mui/material/IconButton'
7
import CloseIcon from '@mui/icons-material/Close'
6021 stevensc 8
import styled from 'styled-components'
9
 
10
const DragAndDropContainer = styled.div`
11
  display: flex;
12
  flex-direction: column;
13
  align-items: center;
14
  padding: 2rem 0;
15
  border-width: 2;
16
  border-radius: 2;
17
  border-color: #eeeeee;
18
  border-style: dashed;
19
  background-color: #fafafa;
20
  color: #bdbdbd;
21
  outline: none;
22
  transition: border 0.24s ease-in-out;
23
  margin-top: 1rem;
24
  cursor: pointer;
25
`
26
 
27
const PreviewContainer = styled.div`
28
  display: flex;
29
  margin-top: 16px;
30
  position: relative;
31
  justify-content: center;
32
 
33
  img {
34
    width: auto;
35
    height: 100%;
36
    max-height: 200px;
37
    max-width: 350px;
38
    object-fit: contain;
39
  }
40
`
41
 
42
const CloseButton = styled(IconButton)`
43
  position: absolute;
44
  background-color: #000;
45
  color: #fff;
46
`
47
 
1 www 48
const areEqual = (prevProps, nextProps) => {
5289 stevensc 49
  return prevProps.settedFile === nextProps.settedFile
50
}
1 www 51
 
6021 stevensc 52
const DropzoneComponent = ({
53
  modalType,
54
  onUploaded,
55
  settedFile,
56
  recomendationText,
57
}) => {
5289 stevensc 58
  const [errors, setErrors] = useState([])
59
  const [files, setFiles] = useState([])
1 www 60
 
6021 stevensc 61
  const acceptedMimeTypes = () => {
62
    switch (modalType) {
63
      case shareModalTypes.IMAGE:
64
        return 'image/jpeg, image/png, image/jpg'
65
      case shareModalTypes.FILE:
66
        return 'application/pdf, application/vnd.openxmlformats-officedocument.presentationml.presentation'
67
      case shareModalTypes.VIDEO:
68
        return 'video/mp4, video/mpeg, video/webm'
69
      case shareModalTypes.CHAT:
70
        return 'video/mp4, video/mpeg, video/webm, application/pdf, image/jpeg, image/png, image/jpg'
71
      default:
72
        return null
73
    }
74
  }
75
 
1 www 76
  const onDropRejected = useCallback((rejectedFiles) => {
77
    rejectedFiles.map((fileRejection) => {
78
      switch (fileRejection.errors[0].code) {
5289 stevensc 79
        case 'too-many-files':
80
          setErrors([...errors, 'solo puedes agregar 1 archivo'])
81
          break
82
        case 'file-invalid-type':
83
          setErrors([...errors, 'por favor seleccione un archivo valido'])
84
          break
1 www 85
        default:
5289 stevensc 86
          setErrors(errors)
87
          break
1 www 88
      }
5289 stevensc 89
    })
90
  }, [])
1 www 91
 
6019 stevensc 92
  const { getRootProps, getInputProps } = useDropzone({
93
    accept: acceptedMimeTypes(),
94
    multiple: false,
95
    onDrop: (acceptedFiles) => {
96
      onUploaded(acceptedFiles[0])
97
      setFiles(acceptedFiles.map((file) => file))
98
    },
99
    onDropRejected,
100
    onDropAccepted: () => {
101
      setErrors([])
102
    },
103
    maxFiles: 1,
104
  })
105
 
1 www 106
  const onDeleteFileHandler = (index) => {
5289 stevensc 107
    onUploaded('')
6019 stevensc 108
    setFiles([])
5289 stevensc 109
  }
1 www 110
 
6021 stevensc 111
  useEffect(() => {
112
    if (!settedFile) return
113
    setFiles([settedFile])
114
  }, [settedFile])
115
 
6019 stevensc 116
  const filePreviewTest = (file) => {
1 www 117
    switch (modalType) {
118
      case shareModalTypes.IMAGE:
6021 stevensc 119
        return <img src={URL.createObjectURL(file)} />
1 www 120
      case shareModalTypes.FILE:
5290 stevensc 121
        switch (file.type) {
122
          case 'application/vnd.openxmlformats-officedocument.presentationml.presentation':
123
            return (
124
              <iframe
5918 stevensc 125
                src={`https://view.officeapps.live.com/op/embed.aspx?src=${encodeURIComponent(
126
                  file
127
                )}`}
5290 stevensc 128
                width="100%"
129
                height="600px"
5292 stevensc 130
              />
5290 stevensc 131
            )
132
          case 'application/pdf':
133
            return (
6019 stevensc 134
              <object data={URL.createObjectURL(file)} type="application/pdf" />
5290 stevensc 135
            )
6019 stevensc 136
          case shareModalTypes.VIDEO:
137
            return (
1 www 138
              <video
139
                src={URL.createObjectURL(file)}
140
                width="400"
141
                height="300"
142
                controls
143
                autoPlay
144
                muted
145
              />
6019 stevensc 146
            )
147
          case shareModalTypes.CHAT:
148
            switch (file.type) {
149
              case 'video/mp4':
150
              case 'video/mpeg':
151
              case 'video/webm':
152
                return (
1 www 153
                  <video
154
                    src={URL.createObjectURL(file)}
155
                    width="400"
156
                    height="300"
157
                    controls
158
                    autoPlay
159
                    muted
160
                  />
6019 stevensc 161
                )
162
              case 'image/jpeg':
163
              case 'image/png':
164
              case 'image/jpg':
6021 stevensc 165
                return <img src={URL.createObjectURL(file)} />
6019 stevensc 166
              case 'application/pdf':
167
                return (
3259 stevensc 168
                  <object
169
                    data={URL.createObjectURL(file)}
170
                    type="application/pdf"
171
                    width="400"
172
                    height="200"
1 www 173
                  />
6019 stevensc 174
                )
175
              default:
176
                break
177
            }
178
            break
1 www 179
          default:
5289 stevensc 180
            break
1 www 181
        }
182
    }
5289 stevensc 183
  }
1 www 184
 
185
  return (
5918 stevensc 186
    <>
6020 stevensc 187
      {!files.length ? (
6021 stevensc 188
        <DragAndDropContainer {...getRootProps({ className: 'dropzone' })}>
1 www 189
          <input {...getInputProps()} />
190
          <p>Arrastra el archivo aqui, o haga click para seleccionar</p>
191
          {recomendationText}
6021 stevensc 192
        </DragAndDropContainer>
6020 stevensc 193
      ) : (
6021 stevensc 194
        <PreviewContainer>
195
          {files.map((file) => filePreviewTest(file))}
196
          <CloseButton className="close" onClick={() => onDeleteFileHandler()}>
6020 stevensc 197
            <CloseIcon />
6021 stevensc 198
          </CloseButton>
199
        </PreviewContainer>
5918 stevensc 200
      )}
201
      {errors.map((error, index) => (
202
        <FormErrorFeedback key={index}>{error}</FormErrorFeedback>
203
      ))}
204
    </>
5289 stevensc 205
  )
206
}
1 www 207
 
5289 stevensc 208
export default React.memo(DropzoneComponent, areEqual)