'use client'; import { useEffect } from 'react'; import { useRouter } from 'next/navigation'; import { useAuth } from '@/lib/hooks/useAuth'; import { Permission, hasPermission, hasAnyPermission, isAdmin, isSuperAdmin } from '@/lib/auth/roles'; import { Role } from '@/types/auth'; interface ProtectedRouteProps { children: React.ReactNode; requiredPermissions?: Permission[]; anyPermission?: Permission[]; requireAdmin?: boolean; requireSuperAdmin?: boolean; fallback?: React.ReactNode; redirectTo?: string; } export function ProtectedRoute({ children, requiredPermissions, anyPermission, requireAdmin, requireSuperAdmin, fallback, redirectTo = '/dashboard', }: ProtectedRouteProps) { const { user, loading } = useAuth(); const router = useRouter(); const hasAccess = (): boolean => { if (!user) return false; const userRole = user.role as Role; if (requireSuperAdmin && !isSuperAdmin(userRole)) return false; if (requireAdmin && !isAdmin(userRole)) return false; if (requiredPermissions?.length) { const hasAll = requiredPermissions.every(p => hasPermission(userRole, p)); if (!hasAll) return false; } if (anyPermission?.length) { if (!hasAnyPermission(userRole, anyPermission)) return false; } return true; }; useEffect(() => { if (!loading && !hasAccess()) { router.push(redirectTo); } }, [user, loading, redirectTo, router]); if (loading) { return fallback || ; } if (!hasAccess()) { return fallback || null; } return <>{children}; } function LoadingSpinner() { return (
); }