/** * Página de Callback do Magic Link * Processa o token do magic link e autentica o usuário */ import { useEffect, useState } from "react"; import { useNavigate } from "react-router-dom"; import { supabase } from "../lib/supabase"; import { Loader2, CheckCircle, XCircle } from "lucide-react"; import { useAuth } from "../hooks/useAuth"; import toast from "react-hot-toast"; export default function AuthCallback() { const navigate = useNavigate(); const { loginComEmailSenha } = useAuth(); const [status, setStatus] = useState<"loading" | "success" | "error">( "loading" ); const [message, setMessage] = useState("Processando autenticação..."); useEffect(() => { const handleCallback = async () => { try { console.log("[AuthCallback] Iniciando processamento"); // Verificar se é um token de recovery const hash = window.location.hash; const hashParams = new URLSearchParams(hash.substring(1)); const accessToken = hashParams.get("access_token"); const type = hashParams.get("type"); console.log("[AuthCallback] Hash:", hash); console.log("[AuthCallback] Type:", type); console.log("[AuthCallback] Access Token presente:", !!accessToken); // Se for recovery, redirecionar para página de reset if (type === "recovery" && accessToken) { console.log( "[AuthCallback] ✅ Token de recovery detectado, redirecionando para /reset-password" ); setStatus("success"); setMessage("Redirecionando para página de redefinição de senha..."); // Redirecionar preservando o hash com o token setTimeout(() => { navigate(`/reset-password${hash}`, { replace: true }); }, 1000); return; } console.log("[AuthCallback] Processando magic link normal"); // Supabase automaticamente processa os query params const { data: { session }, error, } = await supabase.auth.getSession(); if (error) { console.error("[AuthCallback] Erro ao obter sessão:", error); throw error; } if (!session) { throw new Error( "Nenhuma sessão encontrada. O link pode ter expirado." ); } console.log("[AuthCallback] Sessão obtida:", { user: session.user.email, role: session.user.role, }); // Fazer login no contexto da aplicação const loginOk = await loginComEmailSenha(session.user.email!, ""); if (!loginOk) { throw new Error("Erro ao processar login no sistema"); } setStatus("success"); setMessage("Autenticado com sucesso! Redirecionando..."); toast.success("Login realizado com sucesso!"); // Redirecionar baseado no contexto salvo ou role do usuário setTimeout(() => { // Verificar se há redirecionamento salvo do magic link const savedRedirect = localStorage.getItem("magic_link_redirect"); if (savedRedirect) { console.log("[AuthCallback] Redirecionando para:", savedRedirect); localStorage.removeItem("magic_link_redirect"); // Limpar após uso navigate(savedRedirect, { replace: true }); return; } // Fallback: redirecionar baseado no role const userRole = session.user.user_metadata?.role || "paciente"; console.log("[AuthCallback] Redirecionando baseado no role:", userRole); switch (userRole) { case "medico": navigate("/painel-medico", { replace: true }); break; case "secretaria": navigate("/painel-secretaria", { replace: true }); break; case "paciente": default: navigate("/acompanhamento", { replace: true }); break; } }, 1500); } catch (err: any) { console.error("[AuthCallback] Erro:", err); setStatus("error"); setMessage(err.message || "Erro ao processar autenticação"); toast.error(err.message || "Erro na autenticação"); } }; handleCallback(); }, [navigate, loginComEmailSenha]); return (
{status === "loading" && ( <>

Autenticando

{message}

)} {status === "success" && ( <>

Sucesso!

{message}

)} {status === "error" && ( <>

Erro na Autenticação

{message}

)}
); }