Proyectos de Subversion LeadersLinked - Antes de SPA

Rev

Rev 5490 | | Comparar con el anterior | Ultima modificación | Ver Log |

Rev Autor Línea Nro. Línea
5490 stevensc 1
/* eslint-disable react/prop-types */
2
import React, { useState, useEffect } from 'react'
3
import { axios } from '../../utils'
4
import { useForm } from 'react-hook-form'
5
import { useDispatch } from 'react-redux'
6
import { Button, Modal } from 'react-bootstrap'
7
import { addNotification } from '../../redux/notification/notification.actions'
8
import { coverTypes } from './cover.types'
9
 
10
import Spinner from '../loading-spinner/Spinner'
11
import DropzoneComponent from '../dropzone/DropzoneComponent'
12
import FormErrorFeedback from '../form-error-feedback/FormErrorFeedback'
13
 
14
const CoverModal = ({ isOpen, type, size, id, onClose, onComplete }) => {
15
  const {
16
    register,
17
    errors,
18
    handleSubmit,
19
    setValue,
20
    clearErrors,
21
    setError,
22
    getValues,
23
  } = useForm()
24
  const [loading, setLoading] = useState(false)
25
  const dispatch = useDispatch()
26
 
27
  const postPath = {
28
    [coverTypes.USER]: `/profile/my-profiles/cover/${id}/operation/upload`,
29
    [coverTypes.COMPANY]: `/my-company/${id}/profile/cover/upload`,
30
    [coverTypes.GROUP]: `/group/my-groups/cover/${id}/operation/upload`,
31
  }
32
 
33
  const onUploadedHandler = (files) => {
34
    setValue('cover', files)
35
    clearErrors('cover')
36
  }
37
 
38
  const onSubmitHandler = async (data) => {
39
    setLoading(true)
40
 
41
    const formData = new FormData()
42
    Object.entries(data).map(([key, value]) => formData.append(key, value))
43
 
44
    await axios.post(postPath[type], formData).then((response) => {
45
      const resData = response.data
46
      if (resData.success) {
47
        setLoading(false)
5492 stevensc 48
        onComplete(resData.data)
5490 stevensc 49
        setValue('cover', '')
50
        onClose()
51
      } else {
52
        const resError = resData.data
53
        if (resError.constructor.name === 'Object') {
54
          Object.entries(resError).map(([key, value]) => {
55
            if (key in getValues()) {
56
              setError(key, {
57
                type: 'manual',
58
                message: Array.isArray(value) ? value[0] : value,
59
              })
60
            }
61
          })
62
        } else {
63
          dispatch(addNotification({ style: 'danger', msg: resError }))
64
        }
65
      }
66
    })
67
    setLoading(false)
68
  }
69
 
70
  useEffect(() => {
71
    register('cover', {
72
      required: { value: 'true', message: 'El campo es requerido' },
73
    })
74
  }, [])
75
 
76
  return (
77
    <Modal show={isOpen} onHide={onClose}>
78
      <form onSubmit={handleSubmit(onSubmitHandler)}>
79
        <Modal.Header closeButton>
80
          <Modal.Title>Portada</Modal.Title>
81
        </Modal.Header>
82
        <Modal.Body>
83
          {loading && <Spinner />}
84
          <DropzoneComponent
85
            modalType="IMAGE"
86
            onUploaded={onUploadedHandler}
87
            recomendationText={`Imágenes recomendadas de ${size}`}
88
          />
89
          {errors.cover && (
90
            <FormErrorFeedback>{errors.cover.message}</FormErrorFeedback>
91
          )}
92
        </Modal.Body>
93
        <Modal.Footer>
94
          <Button size="sm" type="submit">
95
            Enviar
96
          </Button>
97
          <Button size="sm" variant="danger" onClick={onClose}>
98
            Cancelar
99
          </Button>
100
        </Modal.Footer>
101
      </form>
102
    </Modal>
103
  )
104
}
105
 
106
export default CoverModal