"use client"; import { useEffect, useRef } from "react"; import { useRouter } from "next/navigation"; import { useAuth } from "@/hooks/useAuth"; import type { UserType } from "@/types/auth"; import { USER_TYPE_ROUTES, LOGIN_ROUTES, AUTH_STORAGE_KEYS, } from "@/types/auth"; interface ProtectedRouteProperties { children: React.ReactNode; requiredUserType?: UserType[]; } export default function ProtectedRoute({ children, requiredUserType, }: ProtectedRouteProperties) { const { authStatus, user } = useAuth(); const router = useRouter(); const isRedirecting = useRef(false); useEffect(() => { // Evitar múltiplos redirects if (isRedirecting.current) return; // Durante loading, não fazer nada if (authStatus === "loading") return; // Se não autenticado, redirecionar para login if (authStatus === "unauthenticated") { isRedirecting.current = true; console.log( "[PROTECTED-ROUTE] Usuário NÃO autenticado - redirecionando...", ); // Determinar página de login baseada no histórico let userType: UserType = "profissional"; if (typeof window !== "undefined") { try { const storedUserType = localStorage.getItem( AUTH_STORAGE_KEYS.USER_TYPE, ); if ( storedUserType && ["profissional", "paciente", "administrador"].includes( storedUserType, ) ) { userType = storedUserType as UserType; } } catch (error) { console.warn("[PROTECTED-ROUTE] Erro ao ler localStorage:", error); } } const loginRoute = LOGIN_ROUTES[userType]; console.log("[PROTECTED-ROUTE] Redirecionando para login:", { userType, loginRoute, timestamp: new Date().toLocaleTimeString(), }); router.push(loginRoute); return; } // Se autenticado mas não tem permissão para esta página if ( authStatus === "authenticated" && user && requiredUserType && !requiredUserType.includes(user.userType) ) { isRedirecting.current = true; console.log("[PROTECTED-ROUTE] Usuário SEM permissão para esta página", { userType: user.userType, requiredTypes: requiredUserType, }); const correctRoute = USER_TYPE_ROUTES[user.userType]; console.log( "[PROTECTED-ROUTE] Redirecionando para área correta:", correctRoute, ); router.push(correctRoute); return; } // Se chegou aqui, acesso está autorizado if (authStatus === "authenticated") { console.log("[PROTECTED-ROUTE] ACESSO AUTORIZADO!", { userType: user?.userType, email: user?.email, timestamp: new Date().toLocaleTimeString(), }); isRedirecting.current = false; } }, [authStatus, user, requiredUserType, router]); // Durante loading, mostrar spinner if (authStatus === "loading") { return (
Verificando autenticação...
Redirecionando...
Você não tem permissão para acessar esta página.
Tipo de acesso necessário: {requiredUserType.join(" ou ")}
Seu tipo de acesso: {user.userType}