// Caminho: components/LoginForm.tsx "use client" import type React from "react" import { useState } from "react" import { useRouter } from "next/navigation" import Cookies from "js-cookie" import { cn } from "@/lib/utils" // Nossos serviços de API centralizados import { autenticacaoApi } from '@/services/autenticacaoApi'; import api from '@/services/api'; import { Button } from "@/components/ui/button"; import { Input } from "@/components/ui/input"; import { Label } from "@/components/ui/label"; import { Card, CardContent } from "@/components/ui/card"; import { useToast } from "@/hooks/use-toast"; import { Eye, EyeOff, Mail, Lock, Loader2 } from "lucide-react"; interface LoginFormProps { children?: React.ReactNode } interface FormState { email: string password: string } export function LoginForm({ children }: LoginFormProps) { const [form, setForm] = useState({ email: "", password: "" }) const [showPassword, setShowPassword] = useState(false) const [isLoading, setIsLoading] = useState(false) const router = useRouter() const { toast } = useToast() // --- ESTADOS PARA CONTROLE DE MÚLTIPLOS PERFIS --- const [userRoles, setUserRoles] = useState([]); const [authenticatedUser, setAuthenticatedUser] = useState(null); /** * Finaliza o login com o perfil de dashboard escolhido e redireciona. * Esta função agora recebe o nome do "dashboard" (ex: 'manager', 'doctor') e não o 'role' da API. */ const handleRoleSelection = (selectedDashboardRole: string) => { const user = authenticatedUser; if (!user) { toast({ title: "Erro de Sessão", description: "Não foi possível encontrar os dados do usuário. Tente novamente.", variant: "destructive" }); setUserRoles([]); // Volta para a tela de login return; } // Salva o perfil escolhido para uso futuro na aplicação const completeUserInfo = { ...user, user_metadata: { ...user.user_metadata, role: selectedDashboardRole } }; localStorage.setItem('user_info', JSON.stringify(completeUserInfo)); let redirectPath = ""; // O switch agora lida com os nomes dos dashboards, não com os roles da API switch (selectedDashboardRole) { case "manager": redirectPath = "/manager/home"; break; case "doctor": redirectPath = "/doctor/medicos"; break; case "secretary": redirectPath = "/secretary/pacientes"; break; case "patient": redirectPath = "/patient/dashboard"; break; case "finance": redirectPath = "/finance/home"; break; } if (redirectPath) { toast({ title: `Entrando como ${selectedDashboardRole}...` }); router.push(redirectPath); } else { toast({ title: "Erro", description: "Perfil selecionado inválido.", variant: "destructive" }); } }; /** * Lida com a submissão do formulário, busca os perfis e decide o próximo passo. * Contém a nova lógica para os casos de 'admin' e 'gestor'. */ const handleSubmit = async (e: React.FormEvent) => { e.preventDefault(); setIsLoading(true); localStorage.removeItem("user_info"); Cookies.remove("access_token"); try { const authResponse = await autenticacaoApi.loginWithEmailAndPassword(form.email, form.password); const { user, access_token: accessToken } = authResponse; if (!user || !user.id) { throw new Error("Resposta de autenticação inválida."); } // Armazena o token para as próximas requisições autenticadas Cookies.set("access_token", accessToken, { expires: 1 }); setAuthenticatedUser(user); // Armazena o usuário para uso posterior const { data: rolesData } = await api.get(`/rest/v1/user_roles?user_id=eq.${user.id}&select=role`); if (!rolesData || rolesData.length === 0) { throw new Error("Nenhum perfil de acesso foi encontrado para este usuário."); } const rolesFromApi: string[] = rolesData.map((r: any) => r.role); // --- NOVA LÓGICA DE DECISÃO --- // Caso 1: Usuário é ADMIN, mostra todos os perfis de dashboard possíveis. if (rolesFromApi.includes('admin')) { setUserRoles(["manager", "doctor", "secretary", "patient", "finance"]); return; // Para a execução para mostrar a tela de seleção } // Mapeia os roles da API para os perfis de dashboard const displayRoles = new Set(); rolesFromApi.forEach(role => { switch (role) { case 'gestor': displayRoles.add('manager'); displayRoles.add('finance'); break; case 'medico': displayRoles.add('doctor'); break; case 'secretaria': displayRoles.add('secretary'); break; case 'user': // Mapeamento de 'user' para 'patient' displayRoles.add('patient'); break; // 'admin' já foi tratado, outros roles podem ser adicionados aqui } }); const finalRoles = Array.from(displayRoles); // Caso 2: Após o mapeamento, se resultar em apenas um perfil, redireciona direto. if (finalRoles.length === 1) { handleRoleSelection(finalRoles[0]); } // Caso 3: Se resultar em múltiplos perfis (ex: 'gestor' sozinho ou combinado), mostra a seleção. else { setUserRoles(finalRoles); } } catch (error) { localStorage.removeItem("user_info"); Cookies.remove("access_token"); toast({ title: "Erro no Login", description: error instanceof Error ? error.message : "Ocorreu um erro inesperado.", variant: "destructive", }); } finally { setIsLoading(false); } }; return ( {userRoles.length === 0 ? ( // VISÃO 1: Formulário de Login (se nenhum perfil foi carregado ainda)
setForm({ ...form, email: e.target.value })} className="pl-10 h-11" required disabled={isLoading} autoComplete="username" />
setForm({ ...form, password: e.target.value })} className="pl-10 pr-12 h-11" required disabled={isLoading} autoComplete="current-password" />
) : ( // VISÃO 2: Tela de Seleção de Perfil (se múltiplos perfis foram encontrados)

Você tem múltiplos perfis

Selecione com qual perfil deseja entrar:

{userRoles.map((role) => ( ))}
)} {children}
) }