Proyectos de Subversion LeadersLinked - SPA

Rev

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

Rev Autor Línea Nro. Línea
3416 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
 
3416 stevensc 6
import { useFetch } from "@hooks";
7
import { axios } from "@app/utils";
8
import { addNotification } from "@app/redux/notification/notification.actions";
2781 stevensc 9
 
3416 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
 
3416 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 = () => {
3416 stevensc 22
  const { data: timezones } = useFetch("/helpers/timezones");
23
  const { data: formValues, loading } = useFetch("/account-settings/basic");
24
  const dispatch = useDispatch();
2781 stevensc 25
 
2789 stevensc 26
  const {
27
    control,
28
    handleSubmit,
29
    watch,
30
    setValue,
3416 stevensc 31
    formState: { errors },
2789 stevensc 32
  } = useForm({
2784 stevensc 33
    defaultValues: {
3416 stevensc 34
      first_name: "",
35
      last_name: "",
36
      email: "",
37
      phone: "",
38
      gender: "m",
39
      timezone: "",
40
      is_adult: "n",
2789 stevensc 41
    },
3416 stevensc 42
    values: formValues,
43
  });
44
  const watchedIsAdult = watch("is_adult") === "y";
2781 stevensc 45
 
2785 stevensc 46
  const onSubmit = handleSubmit(async (data) => {
3416 stevensc 47
    const formData = new FormData();
48
    Object.entries(data).map(([key, value]) => formData.append(key, value));
2781 stevensc 49
 
2797 stevensc 50
    try {
3416 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) {
3416 stevensc 54
      dispatch(addNotification({ style: "danger", msg: error.message }));
2797 stevensc 55
    }
3416 stevensc 56
  });
2781 stevensc 57
 
3416 stevensc 58
  if (loading) {
59
    return <Spinner />;
2781 stevensc 60
  }
61
 
62
  return (
63
    <Widget>
3416 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
3416 stevensc 70
              label="Nombre"
71
              name="first_name"
2784 stevensc 72
              control={control}
73
              error={errors.first_name?.message}
3416 stevensc 74
              rules={{ required: "Este campo es requerido" }}
2784 stevensc 75
            />
76
            <Input
3416 stevensc 77
              label="Apellido"
78
              name="last_name"
2784 stevensc 79
              control={control}
80
              error={errors.last_name?.message}
3416 stevensc 81
              rules={{ required: "Este campo es requerido" }}
2784 stevensc 82
            />
83
          </Row>
2781 stevensc 84
 
2784 stevensc 85
          <Row>
86
            <Input
3416 stevensc 87
              label="Correo"
88
              name="email"
2784 stevensc 89
              control={control}
90
              error={errors.email?.message}
3416 stevensc 91
              rules={{ required: "Este campo es requerido" }}
2784 stevensc 92
            />
93
            <Input
3416 stevensc 94
              label="Teléfono"
95
              name="phone"
2784 stevensc 96
              control={control}
97
              error={errors.phone?.message}
98
              rules={{
3416 stevensc 99
                required: "Por favor ingrese su número de teléfono",
2784 stevensc 100
                pattern: {
3416 stevensc 101
                  message: "Por favor ingrese un número de teléfono válido",
2784 stevensc 102
                  value:
3416 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
3416 stevensc 111
              label="Género"
112
              name="gender"
2784 stevensc 113
              control={control}
3416 stevensc 114
              rules={{ required: "Este campo es requerido" }}
2784 stevensc 115
              error={errors.gender?.message}
116
              options={[
3416 stevensc 117
                { name: "Masculino", value: "m" },
118
                { name: "Femenino", value: "f" },
2784 stevensc 119
              ]}
120
            />
121
            <Select
3416 stevensc 122
              label="Zona horaria"
123
              name="timezone"
2784 stevensc 124
              control={control}
3416 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,
3416 stevensc 129
                value,
2784 stevensc 130
              }))}
131
            />
132
          </Row>
2781 stevensc 133
 
2784 stevensc 134
          <SwitchInput
3416 stevensc 135
            label="Eres mayor de 18"
2784 stevensc 136
            isChecked={watchedIsAdult}
3416 stevensc 137
            setValue={(value) => setValue("is_adult", value ? "y" : "n")}
2784 stevensc 138
          />
2781 stevensc 139
 
3416 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>
3416 stevensc 146
  );
147
};
2781 stevensc 148
 
3416 stevensc 149
export default BasicSettings;