import * as React from 'react'; import { Redirect } from 'react-router-dom'; import { useNotification } from '../features/Notifications'; import { useRBACProvider } from '../features/RBAC'; import { hasPermissions } from '../utils/hasPermissions'; import { LoadingIndicatorPage } from './LoadingIndicatorPage'; import type { domain } from '@strapi/permissions'; type Permission = domain.permission.Permission; export interface CheckPagePermissions { children: React.ReactNode; permissions?: Permission[]; } const CheckPagePermissions = ({ permissions = [], children }: CheckPagePermissions) => { const abortController = new AbortController(); const { signal } = abortController; const { allPermissions } = useRBACProvider(); const toggleNotification = useNotification(); const [state, setState] = React.useState({ isLoading: true, canAccess: false }); const isMounted = React.useRef(true); React.useEffect(() => { const checkPermission = async () => { try { setState({ isLoading: true, canAccess: false }); const canAccess = await hasPermissions(allPermissions || [], permissions, signal); if (isMounted.current) { setState({ isLoading: false, canAccess }); } } catch (err) { if (isMounted.current) { console.error(err); toggleNotification?.({ type: 'warning', message: { id: 'notification.error' }, }); setState({ isLoading: false, canAccess: false }); } } }; checkPermission(); return () => { abortController.abort(); }; // eslint-disable-next-line react-hooks/exhaustive-deps }, [permissions]); React.useEffect(() => { return () => { isMounted.current = false; }; }, []); if (state.isLoading) { return ; } if (!state.canAccess) { return ; } return children; }; export { CheckPagePermissions };