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')
2786 stevensc 23
  const { data: values, isLoading } = useFetch('/account-settings/basic')
24
  const dispatch = useDispatch()
2781 stevensc 25
 
2786 stevensc 26
  const { control, handleSubmit, setValue, watch, errors } = useForm({
2784 stevensc 27
    defaultValues: {
28
      first_name: '',
29
      last_name: '',
30
      email: '',
31
      phone: '',
32
      gender: 'm',
33
      timezones: '',
34
      is_adult: 'n'
2786 stevensc 35
    },
36
    values
2784 stevensc 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)
2786 stevensc 46
      .then((response) => {
47
        dispatch(addNotification({ style: 'success', msg: response.data }))
2781 stevensc 48
      })
49
      .catch((err) => {
2786 stevensc 50
        dispatch(addNotification({ style: 'danger', msg: err.message }))
2781 stevensc 51
      })
2785 stevensc 52
  })
2781 stevensc 53
 
2782 stevensc 54
  if (isLoading) {
55
    return <Spinner />
2781 stevensc 56
  }
57
 
58
  return (
59
    <Widget>
60
      <Widget.Header title='Información básica' />
61
 
62
      <Widget.Body>
2785 stevensc 63
        <form onSubmit={onSubmit}>
2784 stevensc 64
          <Row>
65
            <Input
66
              label='Nombre'
67
              name='first_name'
68
              control={control}
69
              error={errors.first_name?.message}
70
              rules={{ required: 'Este campo es requerido' }}
71
            />
72
            <Input
73
              label='Apellido'
74
              name='last_name'
75
              control={control}
76
              error={errors.last_name?.message}
77
              rules={{ required: 'Este campo es requerido' }}
78
            />
79
          </Row>
2781 stevensc 80
 
2784 stevensc 81
          <Row>
82
            <Input
83
              label='Correo'
84
              name='email'
85
              control={control}
86
              error={errors.email?.message}
87
              rules={{ required: 'Este campo es requerido' }}
88
            />
89
            <Input
90
              label='Teléfono'
91
              name='phone'
92
              control={control}
93
              error={errors.phone?.message}
94
              rules={{
95
                required: 'Por favor ingrese su número de teléfono',
96
                pattern: {
97
                  message: 'Por favor ingrese un número de teléfono válido',
98
                  value:
99
                    /^\+[1-9]{1}[0-9]{0,2}[2-9]{1}[0-9]{2}[2-9]{1}[0-9]{2}[0-9]{4}$/
100
                }
101
              }}
102
            />
103
          </Row>
2781 stevensc 104
 
2784 stevensc 105
          <Row>
106
            <Select
107
              label='Género'
108
              name='gender'
109
              control={control}
2786 stevensc 110
              rules={{ required: 'Este campo es requerido' }}
2784 stevensc 111
              error={errors.gender?.message}
112
              options={[
113
                { name: 'Masculino', value: 'm' },
114
                { name: 'Femenino', value: 'f' }
115
              ]}
116
            />
117
            <Select
118
              label='Zona horaria'
119
              name='timezones'
120
              control={control}
2786 stevensc 121
              rules={{ required: 'Este campo es requerido' }}
2784 stevensc 122
              error={errors.timezones?.message}
123
              options={Object.entries(timezones).map(([key, value]) => ({
124
                name: key,
125
                value
126
              }))}
127
            />
128
          </Row>
2781 stevensc 129
 
2784 stevensc 130
          <SwitchInput
131
            label='Eres mayor de 18'
132
            isChecked={watchedIsAdult}
133
            setValue={(value) => setValue('is_adult', value ? 'y' : 'n')}
134
          />
2781 stevensc 135
 
2786 stevensc 136
          <Button variant='primary' type='submit' sx={{ marginTop: 1 }}>
2782 stevensc 137
            Guardar
2784 stevensc 138
          </Button>
2782 stevensc 139
        </form>
2781 stevensc 140
      </Widget.Body>
141
    </Widget>
142
  )
143
}
144
 
2786 stevensc 145
export default BasicSettings