Commit e7509ca5 authored by Omar Luna Hernández's avatar Omar Luna Hernández
Browse files

Se agrega un validador personalizado para los campos del inicio de sesión

parent 729a5fb6
Loading
Loading
Loading
Loading
+51 −6
Original line number Diff line number Diff line
import { SubmitHandler, useForm } from "react-hook-form"
import { FieldErrors, Resolver, SubmitHandler, useForm } from "react-hook-form"
import { LoginFormValues } from "../infraestructure/entities/login_form_values"
import { LoginRepositoryProd } from "../data/repositories/prod/login_repository";
import { LoginDatasourceProd } from "../data/datasources/prod/login_datasource";
import { useEffect } from "react";
import { Dispatch, SetStateAction, useEffect } from "react";
import { useNavigate } from "react-router-dom";
import { useAuth } from "../context/auth_context";
import axios, { AxiosError } from "axios";
const loginDatasource = new LoginDatasourceProd();
const loginRepository = new LoginRepositoryProd(loginDatasource);

export const useLogin = () => {
const resolver: Resolver<LoginFormValues> = async (data) => {
  const errors: FieldErrors<LoginFormValues> = {};

  if (!data.email) {
    errors.email = {
      type: "required",
      message: "El correo electronico es requerido"
    };
  }else{
    const emailPattern = /^[a-zA-Z0-9._%+-]+@[a-zA-Z0-9.-]+\.[a-zA-Z]{2,}$/;
    if (!emailPattern.test(data.email)) {
      errors.email = {
        type: "validate",
        message: "El correo electronico no es válido"
      };
    }
  }

  if (!data.password) {
    errors.password = {
      type: "required",
      message: "La contraseña es requerida"
    };
  }

  return {
    values: Object.keys(errors).length > 0 ? {} : data,
    errors: errors,
  };
};

export const useLogin = (setIsLoading : Dispatch<SetStateAction<boolean>>) => {
  const {login, user} = useAuth();
  const navigate = useNavigate();
  const {
@@ -16,17 +48,30 @@ export const useLogin = () => {
    handleSubmit,
    setError,
    formState: {errors},
  } = useForm<LoginFormValues>();
    clearErrors,
  } = useForm<LoginFormValues>({resolver});

  const onSubmit: SubmitHandler<LoginFormValues> = (data: LoginFormValues) => {
    const authenticate = async () => {
      setIsLoading(true);
      try{
        const {user, token } = await loginRepository.getToken(data);
        await login(user, token);
        navigate("/");
      }catch(error: any){

          if(axios.isAxiosError(error)){
            error as AxiosError;
            switch(error.code){
              case(axios.AxiosError.ERR_BAD_REQUEST):
                setError("root.serverError", {type: "401", message: "Correo electrónico o contraseña incorrectos"});
                break;
              case(axios.AxiosError.ERR_NETWORK):
              setError("root.serverError", {type: "500", message: "Conexión con el servidor fallida"});
              break;
            }
          }
      }
      setIsLoading(false);
    }
    authenticate();
  }
@@ -37,5 +82,5 @@ export const useLogin = () => {
    }
  }, []);

  return { register, handleSubmit, onSubmit, errors };
  return { register, handleSubmit, onSubmit, errors , clearErrors};
}
 No newline at end of file