mirror of
https://github.com/rzmk/learnhouse.git
synced 2025-12-19 04:19:25 +00:00
88 lines
2.5 KiB
TypeScript
88 lines
2.5 KiB
TypeScript
'use client';
|
|
import React, { useEffect, useState, useCallback, useMemo } from 'react';
|
|
import { useOrg } from '@components/Contexts/OrgContext';
|
|
import { useLHSession } from '@components/Contexts/LHSessionContext';
|
|
import useAdminStatus from '@components/Hooks/useAdminStatus';
|
|
import { usePathname, useRouter } from 'next/navigation';
|
|
|
|
type AuthorizationProps = {
|
|
children: React.ReactNode;
|
|
authorizationMode: 'component' | 'page';
|
|
};
|
|
|
|
const ADMIN_PATHS = [
|
|
'/dash/org/*',
|
|
'/dash/org',
|
|
'/dash/users/*',
|
|
'/dash/users',
|
|
'/dash/courses/*',
|
|
'/dash/courses',
|
|
'/dash/org/settings/general',
|
|
];
|
|
|
|
const AdminAuthorization: React.FC<AuthorizationProps> = ({ children, authorizationMode }) => {
|
|
const session = useLHSession() as any;
|
|
const pathname = usePathname();
|
|
const router = useRouter();
|
|
const { isAdmin, loading } = useAdminStatus() as any
|
|
const [isAuthorized, setIsAuthorized] = useState(false);
|
|
|
|
const isUserAuthenticated = useMemo(() => session.status === 'authenticated', [session.status]);
|
|
|
|
const checkPathname = useCallback((pattern: string, pathname: string) => {
|
|
const regexPattern = new RegExp(`^${pattern.replace(/\//g, '\\/').replace(/\*/g, '.*')}$`);
|
|
return regexPattern.test(pathname);
|
|
}, []);
|
|
|
|
const isAdminPath = useMemo(() => ADMIN_PATHS.some(path => checkPathname(path, pathname)), [pathname, checkPathname]);
|
|
|
|
const authorizeUser = useCallback(() => {
|
|
if (loading) {
|
|
return; // Wait until the admin status is determined
|
|
}
|
|
|
|
if (!isUserAuthenticated) {
|
|
router.push('/login');
|
|
return;
|
|
}
|
|
|
|
if (authorizationMode === 'page') {
|
|
if (isAdminPath) {
|
|
if (isAdmin) {
|
|
setIsAuthorized(true);
|
|
} else {
|
|
setIsAuthorized(false);
|
|
router.push('/dash');
|
|
}
|
|
} else {
|
|
setIsAuthorized(true);
|
|
}
|
|
} else if (authorizationMode === 'component') {
|
|
setIsAuthorized(isAdmin);
|
|
}
|
|
}, [loading, isUserAuthenticated, isAdmin, isAdminPath, authorizationMode, router]);
|
|
|
|
useEffect(() => {
|
|
authorizeUser();
|
|
}, [authorizeUser]);
|
|
|
|
if (loading) {
|
|
return (
|
|
<div className="flex justify-center items-center h-screen">
|
|
<h1 className="text-2xl">Loading...</h1>
|
|
</div>
|
|
);
|
|
}
|
|
|
|
if (authorizationMode === 'page' && !isAuthorized) {
|
|
return (
|
|
<div className="flex justify-center items-center h-screen">
|
|
<h1 className="text-2xl">You are not authorized to access this page</h1>
|
|
</div>
|
|
);
|
|
}
|
|
|
|
return <>{isAuthorized && children}</>;
|
|
};
|
|
|
|
export default AdminAuthorization;
|