Login Component
import { useState } from 'react'
import { useLogin } from './useLogin'
import { Modal } from './modal'
export const LoginJSX = () => {
const [email, setEmail] = useState('')
const [password, setPassword] = useState('')
const { handleSubmitLogin, loginResponse } = useLogin()
const [showModal, setShowModal] = useState(false)
const handleSubmit = async (e) => {
e.preventDefault()
const data = { email, password }
handleSubmitLogin(data)
setShowModal(true)
}
return (
<div className="hero-content mx-auto max-w-sm">
<Modal
showModal={showModal}
handleShowModal={setShowModal}
respObject={loginResponse}
/>
{!showModal && (
<form onSubmit={handleSubmit} className="card w-full shadow-2xl bg-base-300">
<div className="card-body">
<div className="form-control">
<label className="label">
<span className="label-text">Email</span>
</label>
<input type="text"
placeholder="Ingresa tu email"
className="input input-bordered"
value={email}
onChange={(e) => setEmail(e.target.value)}
/>
</div>
<div className="form-control">
<label className="label">
<span className="label-text">Password</span>
</label>
<input type="password"
placeholder="Ingresa tu contraseña"
className="input input-bordered"
value={password}
onChange={(e) => setPassword(e.target.value)}
/>
<label className="label">
<a href="#" className="label-text-alt link link-hover">
¿Olvidaste tu contraseña?
</a>
</label>
</div>
<div className="form-control mt-6">
<button type="submit" className="btn btn-neutral">
Ingresar
</button>
</div>
</div>
</form>
)}
</div>
)}
export const Modal = ({ showModal, handleShowModal, respObject }) => {
return (
<>
{showModal && (
<>
<div className="bg-gray-900 opacity-50 fixed w-full h-full top-0 right-0 blur-lg z-10"></div>
<div className="relative text-start bg-white text-sm px-4 pb-4 rounded-xl
border border-gray-200 z-20 w-[40rem] max-w-lg">
<p className="font-bold"> Respuesta del Servidor: </p>
<div className="mt-2 break-words w-full h-30">
<div>
<span className="font-bold">isError: </span>
{respObject?.isError ? 'True' : 'False'}
</div>
<div>
<span className="font-bold">errors: </span>
{respObject?.errors &&
respObject?.errors.map((e, index) => (
<div key={index} className="pl-2">
<div>
<span className="font-bold">({index}) campo: </span>
{e.path}
</div>
<div>
<span className="pl-2 font-bold">mensaje: </span> {e.msg}
</div>
<div>
<span className="pl-2 font-bold">valor: </span>
{e.value ? e.value : 'vacio'}
</div>
</div>
))}
</div>
<div>
<span className="font-bold">message: </span>
{respObject?.message}
</div>
<div>
<span className="font-bold">userResponse: </span>
{JSON.stringify(respObject?.userResponse)}
</div>
<div>
<span className="font-bold">token: </span>
{respObject?.token ? respObject?.token : 'null'}
</div>
</div>
<button
className="absolute btn btn-sm top-1 right-1"
onClick={() => handleShowModal(false)}
> X </button>
</div>
</>
)}
</>
)
}
import { useState } from 'react'
import { loginService } from './loginService'
export const useLogin = () => {
const [loginResponse, setLoginResponse] = useState(null)
const handleSubmitLogin = async (data) => {
const resp = await loginService(data)
setLoginResponse(resp)
}
return { handleSubmitLogin, loginResponse }
}
const url = 'http://127.0.0.1:8126/users/login'
export const loginService = async (data) => {
try {
const resp = await fetch(url, {
method: 'POST',
headers: {
'Content-Type': 'application/json',
},
body: JSON.stringify(data),
})
const responseData = await resp.json()
return responseData
} catch (error) {
return {
error: true,
errors: null,
message: 'Error al enviar la solicitud',
token: null,
userResponse: {},
}
}
}