Proyectos de Subversion LeadersLinked - SPA

Rev

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