Proyectos de Subversion LeadersLinked - SPA

Rev

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

Rev Autor Línea Nro. Línea
3432 stevensc 1
import React from 'react'
2
import { useDispatch } from 'react-redux'
3
import { useForm } from 'react-hook-form'
4
import { Button, styled } from '@mui/material'
2781 stevensc 5
 
3432 stevensc 6
import { useFetch } from '@hooks'
7
import { axios } from '@app/utils'
8
import { addNotification } from '@app/redux/notification/notification.actions'
2781 stevensc 9
 
3432 stevensc 10
import Widget from '@components/UI/Widget'
11
import Input from '@components/UI/inputs/Input'
12
import Select from '@components/UI/inputs/Select'
13
import Spinner from '@components/UI/Spinner'
14
import SwitchInput from '@components/UI/SwitchInput'
2781 stevensc 15
 
3432 stevensc 16
const Row = styled('div')(({ theme }) => ({
17
  display: 'flex',
18
  gap: theme.spacing(0.5)
19
}))
2784 stevensc 20
 
2786 stevensc 21
const BasicSettings = () => {
3432 stevensc 22
  const { data: timezones } = useFetch('/helpers/timezones')
23
  const { data: formValues, isLoading } = useFetch('/account-settings/basic')
24
  const dispatch = useDispatch()
2781 stevensc 25
 
2789 stevensc 26
  const {
27
    control,
28
    handleSubmit,
29
    watch,
30
    setValue,
3432 stevensc 31
    formState: { errors }
2789 stevensc 32
  } = useForm({
2784 stevensc 33
    defaultValues: {
3432 stevensc 34
      first_name: '',
35
      last_name: '',
36
      email: '',
37
      phone: '',
38
      gender: 'm',
39
      timezone: '',
40
      is_adult: 'n'
2789 stevensc 41
    },
3432 stevensc 42
    values: formValues
43
  })
44
  const watchedIsAdult = watch('is_adult') === 'y'
2781 stevensc 45
 
2785 stevensc 46
  const onSubmit = handleSubmit(async (data) => {
3432 stevensc 47
    const formData = new FormData()
48
    Object.entries(data).map(([key, value]) => formData.append(key, value))
2781 stevensc 49
 
2797 stevensc 50
    try {
3432 stevensc 51
      const response = await axios.post('/account-settings/basic', formData)
52
      dispatch(addNotification({ style: 'success', msg: response.data.data }))
2797 stevensc 53
    } catch (error) {
3432 stevensc 54
      dispatch(addNotification({ style: 'danger', msg: error.message }))
2797 stevensc 55
    }
3432 stevensc 56
  })
2781 stevensc 57
 
3432 stevensc 58
  if (isLoading) {
59
    return <Spinner />
2781 stevensc 60
  }
61
 
62
  return (
63
    <Widget>
3432 stevensc 64
      <Widget.Header title='Información básica' />
2781 stevensc 65
 
66
      <Widget.Body>
2785 stevensc 67
        <form onSubmit={onSubmit}>
2784 stevensc 68
          <Row>
69
            <Input
3432 stevensc 70
              label='Nombre'
71
              name='first_name'
2784 stevensc 72
              control={control}
73
              error={errors.first_name?.message}
3432 stevensc 74
              rules={{ required: 'Este campo es requerido' }}
2784 stevensc 75
            />
76
            <Input
3432 stevensc 77
              label='Apellido'
78
              name='last_name'
2784 stevensc 79
              control={control}
80
              error={errors.last_name?.message}
3432 stevensc 81
              rules={{ required: 'Este campo es requerido' }}
2784 stevensc 82
            />
83
          </Row>
2781 stevensc 84
 
2784 stevensc 85
          <Row>
86
            <Input
3432 stevensc 87
              label='Correo'
88
              name='email'
2784 stevensc 89
              control={control}
90
              error={errors.email?.message}
3432 stevensc 91
              rules={{ required: 'Este campo es requerido' }}
2784 stevensc 92
            />
93
            <Input
3432 stevensc 94
              label='Teléfono'
95
              name='phone'
2784 stevensc 96
              control={control}
97
              error={errors.phone?.message}
98
              rules={{
3432 stevensc 99
                required: 'Por favor ingrese su número de teléfono',
2784 stevensc 100
                pattern: {
3432 stevensc 101
                  message: 'Por favor ingrese un número de teléfono válido',
2784 stevensc 102
                  value:
3432 stevensc 103
                    /^\+[1-9]{1}[0-9]{0,2}[2-9]{1}[0-9]{2}[2-9]{1}[0-9]{2}[0-9]{4}$/
104
                }
2784 stevensc 105
              }}
106
            />
107
          </Row>
2781 stevensc 108
 
2784 stevensc 109
          <Row>
110
            <Select
3432 stevensc 111
              label='Género'
112
              name='gender'
2784 stevensc 113
              control={control}
3432 stevensc 114
              rules={{ required: 'Este campo es requerido' }}
2784 stevensc 115
              error={errors.gender?.message}
116
              options={[
3432 stevensc 117
                { name: 'Masculino', value: 'm' },
118
                { name: 'Femenino', value: 'f' }
2784 stevensc 119
              ]}
120
            />
121
            <Select
3432 stevensc 122
              label='Zona horaria'
123
              name='timezone'
2784 stevensc 124
              control={control}
3432 stevensc 125
              rules={{ required: 'Este campo es requerido' }}
2791 stevensc 126
              error={errors.timezone?.message}
2784 stevensc 127
              options={Object.entries(timezones).map(([key, value]) => ({
128
                name: key,
3432 stevensc 129
                value
2784 stevensc 130
              }))}
131
            />
132
          </Row>
2781 stevensc 133
 
2784 stevensc 134
          <SwitchInput
3432 stevensc 135
            label='Eres mayor de 18'
2784 stevensc 136
            isChecked={watchedIsAdult}
3432 stevensc 137
            setValue={(value) => setValue('is_adult', value ? 'y' : 'n')}
2784 stevensc 138
          />
2781 stevensc 139
 
3432 stevensc 140
          <Button color='primary' type='submit' sx={{ marginTop: 1 }}>
2782 stevensc 141
            Guardar
2784 stevensc 142
          </Button>
2782 stevensc 143
        </form>
2781 stevensc 144
      </Widget.Body>
145
    </Widget>
3432 stevensc 146
  )
147
}
2781 stevensc 148
 
3432 stevensc 149
export default BasicSettings