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...
Redirecting to sign in...
You don't have permission to access this page. This page requires{' '} {requiredRole} role or higher.
You don't have the required permission to access this page.
( Component: React.ComponentType
,
options?: {
requiredRole?: UserRole
requiredPermission?: string
fallback?: React.ReactNode
redirectTo?: string
}
) {
return function AuthGuardedComponent(props: P) {
return (