Loading web/src/hooks/useLogin.tsx +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 { Loading @@ -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(); } Loading @@ -37,5 +82,5 @@ export const useLogin = () => { } }, []); return { register, handleSubmit, onSubmit, errors }; return { register, handleSubmit, onSubmit, errors , clearErrors}; } No newline at end of file Loading
web/src/hooks/useLogin.tsx +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 { Loading @@ -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(); } Loading @@ -37,5 +82,5 @@ export const useLogin = () => { } }, []); return { register, handleSubmit, onSubmit, errors }; return { register, handleSubmit, onSubmit, errors , clearErrors}; } No newline at end of file