// ** React Imports
import { ReactNode, useEffect } from 'react'
// ** Next Import
import { useRouter } from 'next/router'
// ** Types
import type { ACLObj, AppAbility } from 'src/configs/acl'
// ** Context Imports
import { AbilityContext } from 'src/layouts/components/acl/Can'
// ** Config Import
import { buildAbilityFor } from 'src/configs/acl'
// ** Component Import
import NotAuthorized from 'src/pages/401'
import Spinner from 'src/@core/components/spinner'
import BlankLayout from 'src/@core/layouts/BlankLayout'
// ** Hooks
import { useAuth } from 'src/hooks/useAuth'
// ** Util Import
import getHomeRoute from 'src/layouts/components/acl/getHomeRoute'
interface AclGuardProps {
children: ReactNode
authGuard?: boolean
guestGuard?: boolean
aclAbilities: ACLObj
}
const AclGuard = (props: AclGuardProps) => {
// ** Props
const { aclAbilities, children, guestGuard = false, authGuard = true } = props
// ** Hooks
const auth = useAuth()
const router = useRouter()
// ** Vars
let ability: AppAbility
useEffect(() => {
if (auth.user && auth.user.role && !guestGuard && router.route === '/') {
const homeRoute = getHomeRoute(auth.user.role)
router.replace(homeRoute||'/')
}
}, [auth.user, guestGuard, router])
// User is logged in, build ability for the user based on his role
if (auth.user && !ability) {
ability = buildAbilityFor(auth.user.role, aclAbilities.subject)
if (router.route === '/') {
return
}
}
// If guest guard or no guard is true or any error page
if (guestGuard || router.route === '/404' || router.route === '/500' || !authGuard) {
// If user is logged in and his ability is built
if (auth.user && ability) {
return {children}
} else {
// If user is not logged in (render pages like login, register etc..)
return <>{children}>
}
}
// Check the access of current user and render pages
if (ability && auth.user && ability.can(aclAbilities.action, aclAbilities.subject)) {
if (router.route === '/') {
return
}
return {children}
}
// Render Not Authorized component if the current user has limited access
return (
)
}
export default AclGuard