// ARQUIVO COMPLETO E CORRIGIDO PARA: components/LoginForm.tsx "use client"; import type React from "react"; import { useState } from "react"; import { useRouter } from "next/navigation"; import { login, api } from "@/services/api.mjs"; 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(); const [userRoles, setUserRoles] = useState([]); // *** MUDANÇA 1: A função agora recebe o objeto 'user' como parâmetro *** const handleRoleSelection = (selectedDashboardRole: string, user: any) => { 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([]); return; } const roleInLowerCase = selectedDashboardRole.toLowerCase(); console.log("Salvando no localStorage com o perfil:", roleInLowerCase); const completeUserInfo = { ...user, user_metadata: { ...user.user_metadata, role: roleInLowerCase } }; localStorage.setItem("user_info", JSON.stringify(completeUserInfo)); let redirectPath = ""; switch (roleInLowerCase) { 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" }); } }; const handleSubmit = async (e: React.FormEvent) => { e.preventDefault(); setIsLoading(true); localStorage.removeItem("token"); localStorage.removeItem("user_info"); try { const authData = await login(form.email, form.password); const user = authData.user; if (!user || !user.id) { throw new Error("Resposta de autenticação inválida."); } const 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); // *** MUDANÇA 2: Passamos o objeto 'user' diretamente para a função de seleção *** const handleSelectionWithUser = (role: string) => handleRoleSelection(role, user); if (rolesFromApi.includes("admin")) { const allRoles = ["manager", "doctor", "secretary", "patient", "finance"]; setUserRoles(allRoles); // Atualizamos o onClick para usar a nova função que já tem o 'user' const roleButtons = allRoles.map((role) => ( )); // Precisamos de um estado para renderizar os botões setRoleSelectionUI(roleButtons); setIsLoading(false); return; } 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 "paciente": displayRoles.add("patient"); break; } }); const finalRoles = Array.from(displayRoles); if (finalRoles.length === 1) { handleSelectionWithUser(finalRoles[0]); } else { setUserRoles(finalRoles); // Atualizamos o onClick aqui também const roleButtons = finalRoles.map((role) => ( )); setRoleSelectionUI(roleButtons); setIsLoading(false); } } catch (error) { localStorage.removeItem("token"); localStorage.removeItem("user_info"); toast({ title: "Erro no Login", description: error instanceof Error ? error.message : "Ocorreu um erro inesperado.", variant: "destructive", }); setIsLoading(false); } }; // Estado para guardar os botões de seleção de perfil const [roleSelectionUI, setRoleSelectionUI] = useState(null); return ( {!roleSelectionUI ? (
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" />
) : (

Você tem múltiplos perfis

Selecione com qual perfil deseja entrar:

{roleSelectionUI}
)} {children}
); }