// 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"; import { usersService } from "@/services/usersApi.mjs"; 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([]); const [authenticatedUser, setAuthenticatedUser] = useState(null); /** * --- NOVA FUNÇÃO --- * Finaliza o login com o perfil de dashboard escolhido e redireciona. */ 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 (selectedDashboardRole) { case "gestor": redirectPath = "/manager/dashboard"; break; case "admin": redirectPath = "/manager/dashboard"; break; case "medico": redirectPath = "/doctor/dashboard"; break; case "secretaria": redirectPath = "/secretary/dashboard"; break; case "paciente": redirectPath = "/patient/dashboard"; 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` ); const me = await usersService.getMeSimple(); console.log(me.roles); if (!me.roles || me.roles.length === 0) { throw new Error( "Nenhum perfil de acesso foi encontrado para este usuário." ); } handleRoleSelection(me.roles[0], user); } 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 focus-visible:ring-blue-600 focus-visible:ring-2" required disabled={isLoading} autoComplete="username" />
setForm({ ...form, password: e.target.value }) } className="pl-10 pr-12 h-11 focus-visible:ring-blue-600 focus-visible:ring-2" required disabled={isLoading} autoComplete="current-password" />
) : (

Você tem múltiplos perfis

Selecione com qual perfil deseja entrar:

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