import { useEffect } from 'react' import { useRouter } from 'next/router' import { useAuth } from '@/lib/auth/useAuth' import { UserRole } from '@/lib/auth/types' import { hasRole, hasPermission } from '@/lib/auth/permissions' interface AuthGuardProps { children: React.ReactNode requiredRole?: UserRole requiredPermission?: string fallback?: React.ReactNode redirectTo?: string } export function AuthGuard({ children, requiredRole, requiredPermission, fallback, redirectTo = '/auth/signin', }: AuthGuardProps) { const router = useRouter() const { user, isAuthenticated, isLoading } = useAuth() useEffect(() => { if (!isLoading && !isAuthenticated) { const returnUrl = encodeURIComponent(router.asPath) router.push(`${redirectTo}?callbackUrl=${returnUrl}`) } }, [isLoading, isAuthenticated, router, redirectTo]) // Show loading state if (isLoading) { return ( fallback || (

Loading...

) ) } // Not authenticated if (!isAuthenticated) { return ( fallback || (

Redirecting to sign in...

) ) } // Check role requirement if (requiredRole && user) { if (!hasRole(user.role, requiredRole)) { return (
403

Access Denied

You don't have permission to access this page. This page requires{' '} {requiredRole} role or higher.

) } } // Check permission requirement if (requiredPermission && user) { if (!hasPermission(user.role, requiredPermission)) { return (
403

Access Denied

You don't have the required permission to access this page.

) } } return <>{children} } // Higher-order component version export function withAuthGuard

( Component: React.ComponentType

, options?: { requiredRole?: UserRole requiredPermission?: string fallback?: React.ReactNode redirectTo?: string } ) { return function AuthGuardedComponent(props: P) { return ( ) } } export default AuthGuard