Proyectos de Subversion LeadersLinked - SPA

Rev

Rev 2784 | Autoría | Ultima modificación | Ver Log |

import React, { useEffect } from 'react'
import { connect } from 'react-redux'
import { useForm } from 'react-hook-form'
import { Button, styled } from '@mui/material'

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

import Widget from '@app/components/UI/Widget'
import Input from '@components/UI/inputs/Input'
import Select from '@components/UI/inputs/Select'
import Spinner from '@app/components/UI/Spinner'
import SwitchInput from '@app/components/UI/SwitchInput'

const Row = styled('div')(({ theme }) => ({
  display: 'flex',
  gap: theme.spacing(0.5)
}))

const BasicSettings = ({
  addNotification = function () {} // Redux action
}) => {
  const { data: timezones } = useFetch('/helpers/timezones')
  const { data, isLoading } = useFetch('/account-settings/basic')

  const { register, control, handleSubmit, setValue, watch, errors } = useForm({
    defaultValues: {
      first_name: '',
      last_name: '',
      email: '',
      phone: '',
      gender: 'm',
      timezones: '',
      is_adult: 'n'
    }
  })
  const watchedIsAdult = watch('is_adult') === 'y'

  const onSubmit = handleSubmit(async (data) => {
    const formData = new FormData()
    Object.entries(data).map(([key, value]) => formData.append(key, value))

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

        if (!success) {
          const errorMessage =
            typeof data === 'string'
              ? data
              : Object.entries(data)
                  .map(([key, value]) => `${key}: ${value}`)
                  .join(', ')

          throw new Error(errorMessage)
        }

        addNotification({ style: 'success', msg: data })
      })
      .catch((err) => {
        addNotification({ style: 'danger', msg: err.message })
      })
  })

  useEffect(() => {
    register('first_name')
    register('last_name')
    register('email')
    register('phone')
    register('gender')
    register('timezones')
  }, [])

  useEffect(() => {
    Object.entries(data).forEach(([key, value]) => {
      setValue(key, key === 'is_adult' ? value === 'y' : value)
    })
  }, [data])

  if (isLoading) {
    return <Spinner />
  }

  return (
    <Widget>
      <Widget.Header title='Información básica' />

      <Widget.Body>
        <form onSubmit={onSubmit}>
          <Row>
            <Input
              label='Nombre'
              name='first_name'
              control={control}
              error={errors.first_name?.message}
              rules={{ required: 'Este campo es requerido' }}
            />
            <Input
              label='Apellido'
              name='last_name'
              control={control}
              error={errors.last_name?.message}
              rules={{ required: 'Este campo es requerido' }}
            />
          </Row>

          <Row>
            <Input
              label='Correo'
              name='email'
              control={control}
              error={errors.email?.message}
              rules={{ required: 'Este campo es requerido' }}
            />
            <Input
              label='Teléfono'
              name='phone'
              control={control}
              error={errors.phone?.message}
              rules={{
                required: 'Por favor ingrese su número de teléfono',
                pattern: {
                  message: 'Por favor ingrese un número de teléfono válido',
                  value:
                    /^\+[1-9]{1}[0-9]{0,2}[2-9]{1}[0-9]{2}[2-9]{1}[0-9]{2}[0-9]{4}$/
                }
              }}
            />
          </Row>

          <Row>
            <Select
              label='Género'
              name='gender'
              control={control}
              error={errors.gender?.message}
              options={[
                { name: 'Masculino', value: 'm' },
                { name: 'Femenino', value: 'f' }
              ]}
            />
            <Select
              label='Zona horaria'
              name='timezones'
              control={control}
              error={errors.timezones?.message}
              options={Object.entries(timezones).map(([key, value]) => ({
                name: key,
                value
              }))}
            />
          </Row>

          <SwitchInput
            label='Eres mayor de 18'
            isChecked={watchedIsAdult}
            setValue={(value) => setValue('is_adult', value ? 'y' : 'n')}
          />

          <Button variant='primary' type='submit'>
            Guardar
          </Button>
        </form>
      </Widget.Body>
    </Widget>
  )
}

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

export default connect(null, mapDispatchToProps)(BasicSettings)