Proyectos de Subversion LeadersLinked - SPA

Rev

| Ultima modificación | Ver Log |

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