Proyectos de Subversion LeadersLinked - SPA

Rev

| Ultima modificación | Ver Log |

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