Proyectos de Subversion LeadersLinked - SPA

Rev

Rev 3697 | | Comparar con el anterior | Ultima modificación | Ver Log |

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