![]() Server : Apache/2 System : Linux server-15-235-50-60 5.15.0-164-generic #174-Ubuntu SMP Fri Nov 14 20:25:16 UTC 2025 x86_64 User : gositeme ( 1004) PHP Version : 8.2.29 Disable Function : exec,system,passthru,shell_exec,proc_close,proc_open,dl,popen,show_source,posix_kill,posix_mkfifo,posix_getpwuid,posix_setpgid,posix_setsid,posix_setuid,posix_setgid,posix_seteuid,posix_setegid,posix_uname Directory : /home/gositeme/domains/lavocat.quebec/private_html/src/components/ |
import React from 'react';
import { useSession } from 'next-auth/react';
import { useRouter } from 'next/router';
import { USER_ROLES, UserRole, canAccessPage } from '../lib/auth-utils';
interface AccessControlProps {
children: React.ReactNode;
allowedRoles?: UserRole[];
allowedPages?: string[];
currentPage?: string;
redirectTo?: string;
fallback?: React.ReactNode;
}
const AccessControl: React.FC<AccessControlProps> = ({
children,
allowedRoles = [],
allowedPages = [],
currentPage,
redirectTo = '/',
fallback = null,
}) => {
const { data: session, status } = useSession();
const router = useRouter();
const [isChecking, setIsChecking] = React.useState(true);
const [hasAccess, setHasAccess] = React.useState(false);
React.useEffect(() => {
if (status === 'loading') return;
// If no session, redirect to login
if (!session || !session.user) {
router.push('/auth/login');
return;
}
const userRole = session.user.role as UserRole;
let accessGranted = false;
// Check role-based access
if (allowedRoles.length > 0) {
accessGranted = allowedRoles.includes(userRole);
}
// Check page-based access
if (allowedPages.length > 0 && currentPage) {
accessGranted = accessGranted || canAccessPage(userRole, currentPage);
}
// If no specific restrictions, allow access
if (allowedRoles.length === 0 && allowedPages.length === 0) {
accessGranted = true;
}
setHasAccess(accessGranted);
setIsChecking(false);
if (!accessGranted) {
router.push(redirectTo);
}
}, [session, status, router, allowedRoles, allowedPages, currentPage, redirectTo]);
if (status === 'loading' || isChecking) {
return (
<div className="flex items-center justify-center min-h-screen">
<div className="text-center">
<div className="animate-spin rounded-full h-12 w-12 border-b-2 border-primary mx-auto"></div>
<p className="mt-4 text-gray-600">Checking access...</p>
</div>
</div>
);
}
if (!hasAccess) {
return fallback ? (
<>{fallback}</>
) : (
<div className="flex items-center justify-center min-h-screen">
<div className="text-center">
<div className="text-red-500 text-6xl mb-4">🚫</div>
<h1 className="text-2xl font-bold text-gray-900 mb-2">Access Denied</h1>
<p className="text-gray-600 mb-4">
You don't have permission to access this page.
</p>
<button
onClick={() => router.push(redirectTo)}
className="bg-primary text-white px-4 py-2 rounded-lg hover:bg-primary-dark transition-colors"
>
Go Back
</button>
</div>
</div>
);
}
return <>{children}</>;
};
export default AccessControl;