Esta refatoração unifica todo o sistema de login e logout da aplicação, resolvendo inconsistências e eliminando código duplicado.
Problema Anterior:
- A lógica de login estava espalhada por múltiplos componentes e páginas (`/doctor/login`, `/patient/login`, etc.).
- Cada layout de área restrita (`DoctorLayout`, `PatientLayout`, etc.) tinha sua própria lógica de verificação de segurança e logout, resultando em bugs (ex: uso de Cookies vs. localStorage).
Solução Aplicada:
- Foi criado um componente `LoginForm` unificado e inteligente, responsável por toda a interação de login.
- Toda a lógica de comunicação com a API de autenticação foi centralizada no serviço `api.mjs`, incluindo uma nova função `api.logout()`.
- Todos os layouts de áreas restritas (`DoctorLayout`, `PatientLayout`, etc.) foram padronizados para usar `localStorage.getItem('token')` para verificação e para chamar `api.logout()` ao sair.
- As páginas de login específicas de cada perfil foram atualizadas para usar o novo `LoginForm` genérico.
46 lines
2.2 KiB
TypeScript
46 lines
2.2 KiB
TypeScript
// Caminho: app/patient/login/page.tsx
|
|
|
|
import Link from "next/link";
|
|
import { LoginForm } from "@/components/LoginForm";
|
|
import { Button } from "@/components/ui/button";
|
|
import { ArrowLeft } from "lucide-react";
|
|
|
|
export default function PatientLoginPage() {
|
|
// NOTA: Esta página de login específica para pacientes se tornou obsoleta
|
|
// com a criação da nossa página de login central em /login.
|
|
// Mantemos este arquivo por enquanto para evitar quebrar outras partes do código,
|
|
// mas o ideal no futuro seria deletar esta página e redirecionar
|
|
// /patient/login para /login.
|
|
|
|
return (
|
|
<div className="min-h-screen bg-gradient-to-br from-slate-50 via-blue-50 to-indigo-50 flex flex-col items-center justify-center p-4">
|
|
<div className="w-full max-w-md">
|
|
<div className="mb-8">
|
|
<Link href="/" className="inline-flex items-center text-muted-foreground hover:text-primary transition-colors duration-200 font-medium">
|
|
<ArrowLeft className="w-4 h-4 mr-2" />
|
|
Voltar ao início
|
|
</Link>
|
|
</div>
|
|
|
|
{/* --- ALTERAÇÃO PRINCIPAL AQUI --- */}
|
|
{/* Removemos as props desnecessárias (title, description, role, etc.) */}
|
|
{/* O novo LoginForm é autônomo e não precisa mais delas. */}
|
|
<LoginForm>
|
|
{/* Este bloco é passado como 'children' para o LoginForm */}
|
|
<div className="mt-6 text-center text-sm">
|
|
<span className="text-muted-foreground">Não tem uma conta? </span>
|
|
<Link href="/patient/register">
|
|
<span className="font-semibold text-primary hover:underline cursor-pointer">
|
|
Crie uma agora
|
|
</span>
|
|
</Link>
|
|
</div>
|
|
</LoginForm>
|
|
|
|
<div className="mt-8 text-center">
|
|
<p className="text-sm text-muted-foreground">Problemas para acessar? Entre em contato conosco</p>
|
|
</div>
|
|
</div>
|
|
</div>
|
|
);
|
|
} |