'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 = ({ 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 (

Loading...

); } if (authorizationMode === 'page' && !isAuthorized) { return (

You are not authorized to access this page

); } return <>{isAuthorized && children}; }; export default AdminAuthorization;