From ef55d9bb24430610b60c1b77821307cd72c08c55 Mon Sep 17 00:00:00 2001 From: zwlucas Date: Sat, 25 Jul 2026 18:23:29 -0300 Subject: feat: upload of the project Signed-off-by: zwlucas --- web/src/pages/LoginPage.tsx | 124 ++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 124 insertions(+) create mode 100644 web/src/pages/LoginPage.tsx (limited to 'web/src/pages/LoginPage.tsx') diff --git a/web/src/pages/LoginPage.tsx b/web/src/pages/LoginPage.tsx new file mode 100644 index 0000000..73f355b --- /dev/null +++ b/web/src/pages/LoginPage.tsx @@ -0,0 +1,124 @@ +/** + * LoginPage.tsx + * Página de autenticação — ponto de entrada da aplicação. + */ + +import { useState, type FormEvent } from 'react'; +import { useNavigate, Link } from 'react-router-dom'; +import { useMutation } from '@tanstack/react-query'; +import { api } from '@/lib/api'; +import { useAuth } from '@/context/AuthContext'; +import { useToast } from '@/context/ToastContext'; +import styles from './LoginPage.module.css'; + +export default function LoginPage() { + const navigate = useNavigate(); + const { login } = useAuth(); + const { addToast } = useToast(); + + const [email, setEmail] = useState(''); + const [password, setPassword] = useState(''); + const [showPass, setShowPass] = useState(false); + + const { mutate, isPending, isError, error } = useMutation({ + mutationFn: () => api.auth.login({ email, password }), + onSuccess: ({ token, user }) => { + login(token, user); + addToast('Login realizado com sucesso!', 'success'); + navigate('/dashboard', { replace: true }); + }, + onError: (err: any) => { + addToast(err.message || 'Erro ao realizar login', 'error'); + } + }); + + function handleSubmit(e: FormEvent) { + e.preventDefault(); + mutate(); + } + + const errorMsg = isError && error instanceof Error ? error.message : null; + + return ( +
+
+ + {/* Logo */} +
+ +
+

Helpdesk TI

+

Central de Chamados

+
+
+ +

Entrar na sua conta

+ +
+
+ + setEmail(e.target.value)} + required + autoComplete="email" + disabled={isPending} + /> +
+ +
+ +
+ setPassword(e.target.value)} + required + autoComplete="current-password" + disabled={isPending} + /> + +
+
+ + {errorMsg && ( +
{errorMsg}
+ )} + + +
+ +

+ Não tem conta?{' '} + Solicite acesso ao administrador +

+
+
+ ); +} -- cgit v1.2.3