Proyectos de Subversion LeadersLinked - SPA

Rev

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

import React, { useEffect, useState } from 'react'
import { connect } from 'react-redux'
import { Avatar } from '@mui/material'

import { axios } from '@app/utils'
import { addNotification } from '@app/redux/notification/notification.actions'

import Button from '@app/components/UI/buttons/Buttons'
import Widget from '@app/components/UI/Widget'
import Spinner from '@app/components/UI/Spinner'
import DropzoneComponent from '@app/components/dropzone/DropzoneComponent'
import FormErrorFeedback from '@app/components/UI/form/FormErrorFeedback'

const ChangeImage = ({ addNotification }) => {
  const [imageUrl, setImageUrl] = useState('')
  const [imageFile, setImageFile] = useState(null)
  const [loading, setLoading] = useState(false)
  const [error, setError] = useState('')

  const handleOnDropImage = (acceptedFile) => {
    if (!acceptedFile) {
      setImageUrl('')
      setImageFile(null)
      setError('')
      return
    }

    setError('')
    const newImgUrl = URL.createObjectURL(acceptedFile)
    setImageUrl(newImgUrl)
    setImageFile(acceptedFile)
  }

  const handleSubmit = async () => {
    if (!validate()) return

    setLoading(true)

    const formData = new FormData()
    formData.append('image', imageFile)

    axios
      .post('/account-settings/image/upload', formData)
      .then(({ data: responseData }) => {
        const { data, success } = responseData

        if (!success) {
          const errorMessage =
            typeof data === 'string'
              ? data
              : 'Ha ocurrido un error, Por favor intente más tarde'
          throw new Error(errorMessage)
        }

        sessionStorage.setItem('user_session_image', data)
        addNotification({
          style: 'success',
          msg: 'Imagen cambiada exitosamente'
        })
      })
      .catch((err) => addNotification({ style: 'danger', msg: err.message }))
      .finally(() => setLoading(false))
  }

  const validate = () => {
    let errorMsg = ''

    if (!imageFile) {
      errorMsg = 'Por favor ingrese una imagen'
      setError(errorMsg)
      return false
    }

    return true
  }

  const getUserImage = () => {
    setLoading(true)

    axios
      .get('/account-settings/image/upload')
      .then(({ data: responseData }) => {
        const { data, success } = responseData

        if (!success) {
          throw new Error(data)
        }

        setImageUrl(data)
      })
      .catch((err) => {
        addNotification({ style: 'danger', msg: err.message })
      })
      .finally(() => setLoading(false))
  }

  useEffect(() => {
    getUserImage()
  }, [])

  return (
    <Widget>
      <Widget.Header title='Cambiar Imagen' />

      <Widget.Body>
        {imageUrl && (
          <Avatar
            src={imageUrl}
            sx={{ width: 100, height: 100, margin: 'auto' }}
          />
        )}

        <DropzoneComponent onUploaded={handleOnDropImage} modalType='IMAGE' />
        {error ? <FormErrorFeedback>{error}</FormErrorFeedback> : null}

        {loading && <Spinner />}

        <Button
          variant='primary'
          onClick={handleSubmit}
          styles={{ marginTop: '1rem' }}
          fullWidth
        >
          Guardar
        </Button>
      </Widget.Body>
    </Widget>
  )
}

const mapDispatchToProps = {
  addNotification: (notification) => addNotification(notification)
}

export default connect(null, mapDispatchToProps)(ChangeImage)