'use client' import { useOrg } from '@components/Contexts/OrgContext' import { useSession } from '@components/Contexts/SessionContext' import { usePathname, useRouter } from 'next/navigation' import React from 'react' type AuthorizationProps = { children: React.ReactNode // Authorize components rendering or page rendering authorizationMode: 'component' | 'page' } const ADMIN_PATHS = [ '/dash/org/*', '/dash/org', '/dash/users/*', '/dash/users', '/dash/courses/*', '/dash/courses', '/dash/org/settings/general', ] function AdminAuthorization(props: AuthorizationProps) { const session = useSession() as any const org = useOrg() as any const pathname = usePathname() const router = useRouter() // States const [isLoading, setIsLoading] = React.useState(true) const [isAuthorized, setIsAuthorized] = React.useState(false) // Verify if the user is authenticated const isUserAuthenticated = () => { if (session.isAuthenticated === true) { return true } else { return false } } // Verify if the user is an Admin (1), Maintainer (2) or Member (3) of the organization const isUserAdmin = () => { const isAdmin = session.roles.some((role: any) => { return ( role.org.id === org.id && (role.role.id === 1 || role.role.id === 2 || role.role.role_uuid === 'role_global_admin' || role.role.role_uuid === 'role_global_maintainer') ) }) return isAdmin } function checkPathname(pattern: string, pathname: string) { // Escape special characters in the pattern and replace '*' with a regex pattern const regexPattern = new RegExp( `^${pattern.replace(/\//g, '\\/').replace(/\*/g, '.*')}$` ) // Test if the pathname matches the regex pattern const isMatch = regexPattern.test(pathname) return isMatch } const Authorize = () => { if (props.authorizationMode === 'page') { // Check if user is in an admin path if (ADMIN_PATHS.some((path) => checkPathname(path, pathname))) { console.log('Admin path') if (isUserAuthenticated()) { // Check if the user is an Admin if (isUserAdmin()) { setIsAuthorized(true) } else { setIsAuthorized(false) router.push('/dash') } } else { router.push('/login') } } else { if (isUserAuthenticated()) { setIsAuthorized(true) } else { setIsAuthorized(false) router.push('/login') } } } if (props.authorizationMode === 'component') { // Component mode if (isUserAuthenticated() && isUserAdmin()) { setIsAuthorized(true) } else { setIsAuthorized(false) } } } React.useEffect(() => { if (session.isLoading) { return } Authorize() setIsLoading(false) }, [session, org, pathname]) return ( <> {props.authorizationMode === 'component' && isAuthorized === true && props.children} {props.authorizationMode === 'page' && isAuthorized === true && !isLoading && props.children} {props.authorizationMode === 'page' && isAuthorized === false && !isLoading && (