Proyectos de Subversion LeadersLinked - SPA

Rev

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

import React from "react";
import { useDispatch } from "react-redux";
import { useForm } from "react-hook-form";
import { Button, styled } from "@mui/material";

import { useFetch } from "@hooks";
import { axios } from "@app/utils";
import { addNotification } from "@app/redux/notification/notification.actions";

import Widget from "@components/UI/Widget";
import Input from "@components/UI/inputs/Input";
import Select from "@components/UI/inputs/Select";
import Spinner from "@components/UI/Spinner";
import SwitchInput from "@components/UI/SwitchInput";

const Row = styled("div")(({ theme }) => ({
  display: "flex",
  gap: theme.spacing(0.5),
}));

const BasicSettings = () => {
  const { data: timezones } = useFetch("/helpers/timezones");
  const { data: formValues, loading } = useFetch("/account-settings/basic");
  const dispatch = useDispatch();

  const {
    control,
    handleSubmit,
    watch,
    setValue,
    formState: { errors },
  } = useForm({
    defaultValues: {
      first_name: "",
      last_name: "",
      email: "",
      phone: "",
      gender: "m",
      timezone: "",
      is_adult: "n",
    },
    values: formValues,
  });
  const watchedIsAdult = watch("is_adult") === "y";

  const onSubmit = handleSubmit(async (data) => {
    const formData = new FormData();
    Object.entries(data).map(([key, value]) => formData.append(key, value));

    try {
      const response = await axios.post("/account-settings/basic", formData);
      dispatch(addNotification({ style: "success", msg: response.data.data }));
    } catch (error) {
      dispatch(addNotification({ style: "danger", msg: error.message }));
    }
  });

  if (loading) {
    return <Spinner />;
  }

  return (
    <Widget>
      <Widget.Header title="Información básica" />

      <Widget.Body>
        <form onSubmit={onSubmit}>
          <Row>
            <Input
              label="Nombre"
              name="first_name"
              control={control}
              error={errors.first_name?.message}
              rules={{ required: "Este campo es requerido" }}
            />
            <Input
              label="Apellido"
              name="last_name"
              control={control}
              error={errors.last_name?.message}
              rules={{ required: "Este campo es requerido" }}
            />
          </Row>

          <Row>
            <Input
              label="Correo"
              name="email"
              control={control}
              error={errors.email?.message}
              rules={{ required: "Este campo es requerido" }}
            />
            <Input
              label="Teléfono"
              name="phone"
              control={control}
              error={errors.phone?.message}
              rules={{
                required: "Por favor ingrese su número de teléfono",
                pattern: {
                  message: "Por favor ingrese un número de teléfono válido",
                  value:
                    /^\+[1-9]{1}[0-9]{0,2}[2-9]{1}[0-9]{2}[2-9]{1}[0-9]{2}[0-9]{4}$/,
                },
              }}
            />
          </Row>

          <Row>
            <Select
              label="Género"
              name="gender"
              control={control}
              rules={{ required: "Este campo es requerido" }}
              error={errors.gender?.message}
              options={[
                { name: "Masculino", value: "m" },
                { name: "Femenino", value: "f" },
              ]}
            />
            <Select
              label="Zona horaria"
              name="timezone"
              control={control}
              rules={{ required: "Este campo es requerido" }}
              error={errors.timezone?.message}
              options={Object.entries(timezones).map(([key, value]) => ({
                name: key,
                value,
              }))}
            />
          </Row>

          <SwitchInput
            label="Eres mayor de 18"
            isChecked={watchedIsAdult}
            setValue={(value) => setValue("is_adult", value ? "y" : "n")}
          />

          <Button color="primary" type="submit" sx={{ marginTop: 1 }}>
            Guardar
          </Button>
        </form>
      </Widget.Body>
    </Widget>
  );
};

export default BasicSettings;