Proyectos de Subversion LeadersLinked - SPA

Rev

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

Rev Autor Línea Nro. Línea
1214 stevensc 1
import React, { useEffect } from 'react'
5 stevensc 2
import { useForm } from 'react-hook-form'
1214 stevensc 3
import { useDispatch } from 'react-redux'
4
 
5 stevensc 5
import { axios } from '../../utils'
6
import { addNotification } from '../../redux/notification/notification.actions'
1215 stevensc 7
import { handleApiError } from 'utils/errors'
5 stevensc 8
 
1384 stevensc 9
import Modal from 'components/UI/modal/Modal'
1214 stevensc 10
import DropzoneComponent from '../dropzone/DropzoneComponent'
1437 stevensc 11
import FormErrorFeedback from '../UI/form/FormErrorFeedback'
5 stevensc 12
 
13
const ImageModal = ({ show, onClose, sizes, id, onComplete }) => {
14
  const dispatch = useDispatch()
15
 
1979 stevensc 16
  const { register, errors, handleSubmit, setValue, clearErrors, setError, watch } =
17
    useForm()
5 stevensc 18
 
19
  const onUploadedHandler = (files) => {
20
    setValue('image', files)
21
    clearErrors('image')
22
  }
23
 
1214 stevensc 24
  const onSubmitHandler = handleSubmit(({ image }) => {
5 stevensc 25
    const type = window.location.pathname.split('/')[1]
26
    const typesUrl = {
27
      profile: `/profile/my-profiles/image/${id}/operation/upload`,
28
      company: `/my-company/${id}/profile/image/upload`,
1214 stevensc 29
      group: `/group/my-groups/image/${id}/operation/upload`
5 stevensc 30
    }
31
 
1979 stevensc 32
    const formData = new FormData()
33
    formData.append('image', image)
34
 
1215 stevensc 35
    axios
1979 stevensc 36
      .post(typesUrl[type], formData)
1215 stevensc 37
      .then(({ data: response }) => {
38
        const { data, success } = response
5 stevensc 39
 
1215 stevensc 40
        if (!success) {
41
          throw new Error(data)
5 stevensc 42
        }
43
 
1215 stevensc 44
        const newImage = data.profile ?? data
5 stevensc 45
 
1215 stevensc 46
        if (data.update_navbar) {
47
          sessionStorage.setItem('user_session_image', data.user)
48
        }
5 stevensc 49
 
1215 stevensc 50
        onComplete(newImage)
5 stevensc 51
 
1215 stevensc 52
        setValue('image', '')
53
        dispatch(
54
          addNotification({ style: 'success', msg: 'Registro actualizado' })
55
        )
56
        onClose()
57
      })
58
      .catch((err) => {
59
        const error = handleApiError(err)
60
 
61
        Array.isArray(error)
62
          ? error.forEach(({ key, message }) => setError(key, { message }))
63
          : addNotification({ style: 'error', msg: error })
64
      })
1214 stevensc 65
  })
5 stevensc 66
 
67
  useEffect(() => {
68
    register('image', {
1214 stevensc 69
      required: { value: 'true', message: 'El campo es requerido' }
5 stevensc 70
    })
71
  }, [])
72
 
73
  return (
1214 stevensc 74
    <Modal
75
      show={show}
76
      title='Imagen'
77
      onClose={onClose}
1426 stevensc 78
      onReject={onClose}
1214 stevensc 79
      onAccept={onSubmitHandler}
80
    >
81
      <DropzoneComponent
82
        modalType='IMAGE'
83
        onUploaded={onUploadedHandler}
1931 stevensc 84
        settedFile={watch('image')}
1214 stevensc 85
        recomendationText={`Imágenes recomendadas de ${sizes}`}
86
      />
87
 
88
      {errors.image && (
89
        <FormErrorFeedback>{errors.image.message}</FormErrorFeedback>
90
      )}
5 stevensc 91
    </Modal>
92
  )
93
}
94
 
95
export default ImageModal