From fb0c6e4ef20c146dd71ec29e4ffbac6eb68fc5b0 Mon Sep 17 00:00:00 2001 From: soupette Date: Mon, 24 May 2021 14:46:22 +0200 Subject: [PATCH] Init renaming hook useUser Signed-off-by: soupette --- .../getstarted/api/taaaaa/config/routes.json | 52 ++++++++ .../api/taaaaa/controllers/taaaaa.js | 8 ++ .../getstarted/api/taaaaa/models/taaaaa.js | 8 ++ .../api/taaaaa/models/taaaaa.settings.json | 18 +++ .../getstarted/api/taaaaa/services/taaaaa.js | 8 ++ .../getstarted/api/tata/config/routes.json | 52 ++++++++ .../getstarted/api/tata/controllers/tata.js | 8 ++ examples/getstarted/api/tata/models/tata.js | 8 ++ .../api/tata/models/tata.settings.json | 22 +++ examples/getstarted/api/tata/services/tata.js | 8 ++ .../admin-test-utils/lib/fixtures/index.js | 14 ++ .../fixtures/permissions/admin-permissions.js | 125 ++++++++++++++++++ .../content-manager-permissions.js | 63 +++++++++ .../content-type-builder-permissions.js | 42 ++++++ packages/admin-test-utils/lib/index.js | 7 + packages/admin-test-utils/package.json | 12 ++ .../components/LeftMenu/useMenuSections.js | 11 +- .../src/components/RBACProvider/index.js | 15 ++- .../src/components/RBACProvider/reducer.js | 2 - .../RBACProvider/tests/reducer.test.js | 96 ++++++++++++++ .../containers/DataManagerProvider/index.js | 6 +- .../components/CheckPagePermissions/index.js | 7 +- .../src/components/CheckPermissions/index.js | 7 +- .../lib/src/contexts/RBACProviderContext.js | 12 ++ .../lib/src/hooks/useRBACProvider/index.js | 12 ++ .../lib/src/hooks/useUserPermissions/index.js | 6 +- packages/core/helper-plugin/lib/src/index.js | 2 + .../admin/src/components/ModalCreate/index.js | 6 +- 28 files changed, 608 insertions(+), 29 deletions(-) create mode 100644 examples/getstarted/api/taaaaa/config/routes.json create mode 100644 examples/getstarted/api/taaaaa/controllers/taaaaa.js create mode 100644 examples/getstarted/api/taaaaa/models/taaaaa.js create mode 100644 examples/getstarted/api/taaaaa/models/taaaaa.settings.json create mode 100644 examples/getstarted/api/taaaaa/services/taaaaa.js create mode 100644 examples/getstarted/api/tata/config/routes.json create mode 100644 examples/getstarted/api/tata/controllers/tata.js create mode 100644 examples/getstarted/api/tata/models/tata.js create mode 100644 examples/getstarted/api/tata/models/tata.settings.json create mode 100644 examples/getstarted/api/tata/services/tata.js create mode 100644 packages/admin-test-utils/lib/fixtures/index.js create mode 100644 packages/admin-test-utils/lib/fixtures/permissions/admin-permissions.js create mode 100644 packages/admin-test-utils/lib/fixtures/permissions/content-manager-permissions.js create mode 100644 packages/admin-test-utils/lib/fixtures/permissions/content-type-builder-permissions.js create mode 100644 packages/admin-test-utils/lib/index.js create mode 100644 packages/admin-test-utils/package.json create mode 100644 packages/core/admin/admin/src/components/RBACProvider/tests/reducer.test.js create mode 100644 packages/core/helper-plugin/lib/src/contexts/RBACProviderContext.js create mode 100644 packages/core/helper-plugin/lib/src/hooks/useRBACProvider/index.js diff --git a/examples/getstarted/api/taaaaa/config/routes.json b/examples/getstarted/api/taaaaa/config/routes.json new file mode 100644 index 0000000000..b13ddd97cb --- /dev/null +++ b/examples/getstarted/api/taaaaa/config/routes.json @@ -0,0 +1,52 @@ +{ + "routes": [ + { + "method": "GET", + "path": "/taaaaas", + "handler": "taaaaa.find", + "config": { + "policies": [] + } + }, + { + "method": "GET", + "path": "/taaaaas/count", + "handler": "taaaaa.count", + "config": { + "policies": [] + } + }, + { + "method": "GET", + "path": "/taaaaas/:id", + "handler": "taaaaa.findOne", + "config": { + "policies": [] + } + }, + { + "method": "POST", + "path": "/taaaaas", + "handler": "taaaaa.create", + "config": { + "policies": [] + } + }, + { + "method": "PUT", + "path": "/taaaaas/:id", + "handler": "taaaaa.update", + "config": { + "policies": [] + } + }, + { + "method": "DELETE", + "path": "/taaaaas/:id", + "handler": "taaaaa.delete", + "config": { + "policies": [] + } + } + ] +} diff --git a/examples/getstarted/api/taaaaa/controllers/taaaaa.js b/examples/getstarted/api/taaaaa/controllers/taaaaa.js new file mode 100644 index 0000000000..e860895393 --- /dev/null +++ b/examples/getstarted/api/taaaaa/controllers/taaaaa.js @@ -0,0 +1,8 @@ +'use strict'; + +/** + * Read the documentation (https://strapi.io/documentation/developer-docs/latest/development/backend-customization.html#core-controllers) + * to customize this controller + */ + +module.exports = {}; diff --git a/examples/getstarted/api/taaaaa/models/taaaaa.js b/examples/getstarted/api/taaaaa/models/taaaaa.js new file mode 100644 index 0000000000..0054d33c1e --- /dev/null +++ b/examples/getstarted/api/taaaaa/models/taaaaa.js @@ -0,0 +1,8 @@ +'use strict'; + +/** + * Read the documentation (https://strapi.io/documentation/developer-docs/latest/development/backend-customization.html#lifecycle-hooks) + * to customize this model + */ + +module.exports = {}; diff --git a/examples/getstarted/api/taaaaa/models/taaaaa.settings.json b/examples/getstarted/api/taaaaa/models/taaaaa.settings.json new file mode 100644 index 0000000000..799b747af1 --- /dev/null +++ b/examples/getstarted/api/taaaaa/models/taaaaa.settings.json @@ -0,0 +1,18 @@ +{ + "kind": "collectionType", + "collectionName": "taaaaas", + "info": { + "name": "taaaaa" + }, + "options": { + "increments": true, + "timestamps": true, + "draftAndPublish": true + }, + "pluginOptions": {}, + "attributes": { + "eee": { + "type": "string" + } + } +} diff --git a/examples/getstarted/api/taaaaa/services/taaaaa.js b/examples/getstarted/api/taaaaa/services/taaaaa.js new file mode 100644 index 0000000000..6538a8c86b --- /dev/null +++ b/examples/getstarted/api/taaaaa/services/taaaaa.js @@ -0,0 +1,8 @@ +'use strict'; + +/** + * Read the documentation (https://strapi.io/documentation/developer-docs/latest/development/backend-customization.html#core-services) + * to customize this service + */ + +module.exports = {}; diff --git a/examples/getstarted/api/tata/config/routes.json b/examples/getstarted/api/tata/config/routes.json new file mode 100644 index 0000000000..459dcb2b4c --- /dev/null +++ b/examples/getstarted/api/tata/config/routes.json @@ -0,0 +1,52 @@ +{ + "routes": [ + { + "method": "GET", + "path": "/tatas", + "handler": "tata.find", + "config": { + "policies": [] + } + }, + { + "method": "GET", + "path": "/tatas/count", + "handler": "tata.count", + "config": { + "policies": [] + } + }, + { + "method": "GET", + "path": "/tatas/:id", + "handler": "tata.findOne", + "config": { + "policies": [] + } + }, + { + "method": "POST", + "path": "/tatas", + "handler": "tata.create", + "config": { + "policies": [] + } + }, + { + "method": "PUT", + "path": "/tatas/:id", + "handler": "tata.update", + "config": { + "policies": [] + } + }, + { + "method": "DELETE", + "path": "/tatas/:id", + "handler": "tata.delete", + "config": { + "policies": [] + } + } + ] +} diff --git a/examples/getstarted/api/tata/controllers/tata.js b/examples/getstarted/api/tata/controllers/tata.js new file mode 100644 index 0000000000..e860895393 --- /dev/null +++ b/examples/getstarted/api/tata/controllers/tata.js @@ -0,0 +1,8 @@ +'use strict'; + +/** + * Read the documentation (https://strapi.io/documentation/developer-docs/latest/development/backend-customization.html#core-controllers) + * to customize this controller + */ + +module.exports = {}; diff --git a/examples/getstarted/api/tata/models/tata.js b/examples/getstarted/api/tata/models/tata.js new file mode 100644 index 0000000000..0054d33c1e --- /dev/null +++ b/examples/getstarted/api/tata/models/tata.js @@ -0,0 +1,8 @@ +'use strict'; + +/** + * Read the documentation (https://strapi.io/documentation/developer-docs/latest/development/backend-customization.html#lifecycle-hooks) + * to customize this model + */ + +module.exports = {}; diff --git a/examples/getstarted/api/tata/models/tata.settings.json b/examples/getstarted/api/tata/models/tata.settings.json new file mode 100644 index 0000000000..90116b2b71 --- /dev/null +++ b/examples/getstarted/api/tata/models/tata.settings.json @@ -0,0 +1,22 @@ +{ + "kind": "collectionType", + "collectionName": "tatas", + "info": { + "name": "tata", + "description": "" + }, + "options": { + "increments": true, + "timestamps": true, + "draftAndPublish": true + }, + "pluginOptions": {}, + "attributes": { + "eee": { + "type": "string" + }, + "eeee": { + "type": "string" + } + } +} diff --git a/examples/getstarted/api/tata/services/tata.js b/examples/getstarted/api/tata/services/tata.js new file mode 100644 index 0000000000..6538a8c86b --- /dev/null +++ b/examples/getstarted/api/tata/services/tata.js @@ -0,0 +1,8 @@ +'use strict'; + +/** + * Read the documentation (https://strapi.io/documentation/developer-docs/latest/development/backend-customization.html#core-services) + * to customize this service + */ + +module.exports = {}; diff --git a/packages/admin-test-utils/lib/fixtures/index.js b/packages/admin-test-utils/lib/fixtures/index.js new file mode 100644 index 0000000000..026fd76c27 --- /dev/null +++ b/packages/admin-test-utils/lib/fixtures/index.js @@ -0,0 +1,14 @@ +'use strict'; + +const adminPermissions = require('./permissions/admin-permissions'); +const cmPermissions = require('./permissions/content-manager-permissions'); +const ctbPermissions = require('./permissions/content-type-builder-permissions'); + +const permissions = [...adminPermissions, ...cmPermissions, ...ctbPermissions]; + +module.exports = { + adminPermissions, + cmPermissions, + ctbPermissions, + permissions, +}; diff --git a/packages/admin-test-utils/lib/fixtures/permissions/admin-permissions.js b/packages/admin-test-utils/lib/fixtures/permissions/admin-permissions.js new file mode 100644 index 0000000000..6f045f51e5 --- /dev/null +++ b/packages/admin-test-utils/lib/fixtures/permissions/admin-permissions.js @@ -0,0 +1,125 @@ +'use strict'; + +const adminPermissions = [ + { + id: 169, + action: 'admin::provider-login.read', + subject: null, + properties: {}, + conditions: [], + }, + { + id: 170, + action: 'admin::provider-login.update', + subject: null, + properties: {}, + conditions: [], + }, + { + id: 171, + action: 'admin::marketplace.read', + subject: null, + properties: {}, + conditions: [], + }, + { + id: 172, + action: 'admin::marketplace.plugins.install', + subject: null, + properties: {}, + conditions: [], + }, + { + id: 173, + action: 'admin::marketplace.plugins.uninstall', + subject: null, + properties: {}, + conditions: [], + }, + { + id: 174, + action: 'admin::webhooks.create', + subject: null, + properties: {}, + conditions: [], + }, + { + id: 175, + action: 'admin::webhooks.read', + subject: null, + properties: {}, + conditions: [], + }, + { + id: 176, + action: 'admin::webhooks.update', + subject: null, + properties: {}, + conditions: [], + }, + { + id: 177, + action: 'admin::webhooks.delete', + subject: null, + properties: {}, + conditions: [], + }, + { + id: 178, + action: 'admin::users.create', + subject: null, + properties: {}, + conditions: [], + }, + { + id: 179, + action: 'admin::users.read', + subject: null, + properties: {}, + conditions: [], + }, + { + id: 180, + action: 'admin::users.update', + subject: null, + properties: {}, + conditions: [], + }, + { + id: 181, + action: 'admin::users.delete', + subject: null, + properties: {}, + conditions: [], + }, + { + id: 182, + action: 'admin::roles.create', + subject: null, + properties: {}, + conditions: [], + }, + { + id: 183, + action: 'admin::roles.read', + subject: null, + properties: {}, + conditions: [], + }, + { + id: 184, + action: 'admin::roles.update', + subject: null, + properties: {}, + conditions: [], + }, + { + id: 185, + action: 'admin::roles.delete', + subject: null, + properties: {}, + conditions: [], + }, +]; + +module.exports = adminPermissions; diff --git a/packages/admin-test-utils/lib/fixtures/permissions/content-manager-permissions.js b/packages/admin-test-utils/lib/fixtures/permissions/content-manager-permissions.js new file mode 100644 index 0000000000..52dea1fef4 --- /dev/null +++ b/packages/admin-test-utils/lib/fixtures/permissions/content-manager-permissions.js @@ -0,0 +1,63 @@ +'use strict'; + +const cmPermissions = [ + { + id: 2817, + action: 'plugins::content-manager.single-types.configure-view', + subject: null, + properties: {}, + conditions: [], + }, + { + id: 2818, + action: 'plugins::content-manager.collection-types.configure-view', + subject: null, + properties: {}, + conditions: [], + }, + { + id: 2819, + action: 'plugins::content-manager.components.configure-layout', + subject: null, + properties: {}, + conditions: [], + }, + { + action: 'plugins::content-manager.explorer.create', + subject: 'foo', + properties: { + fields: ['f1'], + }, + conditions: [], + }, + { + action: 'plugins::content-manager.explorer.create', + subject: 'foo', + properties: { + fields: ['f2'], + }, + conditions: [], + }, + { + action: 'plugins::content-manager.explorer.read', + subject: 'foo', + properties: { + fields: ['f1'], + }, + conditions: [], + }, + { + action: 'plugins::content-manager.explorer.delete', + subject: 'bar', + }, + { + action: 'plugins::content-manager.explorer.update', + subject: 'bar', + properties: { + fields: ['f1'], + }, + conditions: [], + }, +]; + +module.exports = cmPermissions; diff --git a/packages/admin-test-utils/lib/fixtures/permissions/content-type-builder-permissions.js b/packages/admin-test-utils/lib/fixtures/permissions/content-type-builder-permissions.js new file mode 100644 index 0000000000..5ff34907fe --- /dev/null +++ b/packages/admin-test-utils/lib/fixtures/permissions/content-type-builder-permissions.js @@ -0,0 +1,42 @@ +'use strict'; + +const ctbPermissions = [ + { + id: 2820, + action: 'plugins::content-type-builder.read', + subject: null, + properties: {}, + conditions: [], + }, + { id: 2821, action: 'plugins::upload.read', subject: null, properties: {}, conditions: [] }, + { + id: 2822, + action: 'plugins::upload.assets.create', + subject: null, + properties: {}, + conditions: [], + }, + { + id: 2823, + action: 'plugins::upload.assets.update', + subject: null, + properties: {}, + conditions: [], + }, + { + id: 2824, + action: 'plugins::upload.assets.download', + subject: null, + properties: {}, + conditions: [], + }, + { + id: 2825, + action: 'plugins::upload.assets.copy-link', + subject: null, + properties: {}, + conditions: [], + }, +]; + +module.exports = ctbPermissions; diff --git a/packages/admin-test-utils/lib/index.js b/packages/admin-test-utils/lib/index.js new file mode 100644 index 0000000000..6fb0644136 --- /dev/null +++ b/packages/admin-test-utils/lib/index.js @@ -0,0 +1,7 @@ +'use strict'; + +const fixtures = require('./fixtures'); + +module.exports = { + fixtures, +}; diff --git a/packages/admin-test-utils/package.json b/packages/admin-test-utils/package.json new file mode 100644 index 0000000000..7844ae95ec --- /dev/null +++ b/packages/admin-test-utils/package.json @@ -0,0 +1,12 @@ +{ + "name": "@strapi/admin-test-utils", + "version": "1.0.0", + "private": true, + "description": "Test utilities for the Strapi administration panel", + "main": "lib/index.js", + "scripts": { + "test": "echo \"Error: no test specified\" && exit 1" + }, + "author": "Strapi Team", + "license": "MIT" +} diff --git a/packages/core/admin/admin/src/components/LeftMenu/useMenuSections.js b/packages/core/admin/admin/src/components/LeftMenu/useMenuSections.js index 583304332c..17408ae8f0 100644 --- a/packages/core/admin/admin/src/components/LeftMenu/useMenuSections.js +++ b/packages/core/admin/admin/src/components/LeftMenu/useMenuSections.js @@ -1,5 +1,5 @@ import { useEffect, useRef } from 'react'; -import { useUser, useNotification } from '@strapi/helper-plugin'; +import { useNotification, useRBACProvider } from '@strapi/helper-plugin'; import { useSelector, useDispatch } from 'react-redux'; import getCtOrStLinks from './utils/getCtOrStLinks'; @@ -14,7 +14,8 @@ const useMenuSections = (plugins, shouldUpdateStrapi) => { const toggleNotification = useNotification(); const state = useSelector(selectMenuLinks); const dispatch = useDispatch(); - const { userPermissions } = useUser(); + const { allPermissions } = useRBACProvider(); + const { menu: settingsMenu } = useSettingsMenu(true); // We are using a ref because we don't want our effect to have this in its dependencies array const generalSectionLinksRef = useRef(state.generalSectionLinks); @@ -29,7 +30,7 @@ const useMenuSections = (plugins, shouldUpdateStrapi) => { const toggleLoading = () => dispatch(toggleIsLoading()); - const resolvePermissions = async (permissions = userPermissions) => { + const resolvePermissions = async (permissions = allPermissions) => { const pluginsSectionLinks = toPluginLinks(pluginsRef.current); const { authorizedCtLinks, authorizedStLinks, contentTypes } = await getCtOrStLinks( permissions, @@ -56,8 +57,8 @@ const useMenuSections = (plugins, shouldUpdateStrapi) => { const resolvePermissionsRef = useRef(resolvePermissions); useEffect(() => { - resolvePermissionsRef.current(userPermissions); - }, [userPermissions, dispatch]); + resolvePermissionsRef.current(allPermissions); + }, [allPermissions, dispatch]); return { state, generateMenu: resolvePermissionsRef.current, toggleLoading }; }; diff --git a/packages/core/admin/admin/src/components/RBACProvider/index.js b/packages/core/admin/admin/src/components/RBACProvider/index.js index b04d7551d9..5d2b5ffc00 100644 --- a/packages/core/admin/admin/src/components/RBACProvider/index.js +++ b/packages/core/admin/admin/src/components/RBACProvider/index.js @@ -1,16 +1,13 @@ import React, { useEffect } from 'react'; import { useDispatch, useSelector } from 'react-redux'; -import { LoadingIndicatorPage } from '@strapi/helper-plugin'; +import { LoadingIndicatorPage, RBACProviderContext } from '@strapi/helper-plugin'; import PropTypes from 'prop-types'; import { resetStore, setPermissions } from './actions'; // TODO -const RBACProvider = ({ - children, - permissions, - // refetchPermissions -}) => { +const RBACProvider = ({ children, permissions, refetchPermissions }) => { const { allPermissions } = useSelector(state => state.rbacProvider); + const dispatch = useDispatch(); useEffect(() => { @@ -25,7 +22,11 @@ const RBACProvider = ({ return ; } - return children; + return ( + + {children} + + ); }; RBACProvider.propTypes = { diff --git a/packages/core/admin/admin/src/components/RBACProvider/reducer.js b/packages/core/admin/admin/src/components/RBACProvider/reducer.js index f0826ad174..9f28fd9871 100644 --- a/packages/core/admin/admin/src/components/RBACProvider/reducer.js +++ b/packages/core/admin/admin/src/components/RBACProvider/reducer.js @@ -13,9 +13,7 @@ import { RESET_STORE, SET_PERMISSIONS } from './constants'; const initialState = { allPermissions: null, - adminPermissions: {}, collectionTypesRelatedPermissions: {}, - pluginsPermissions: {}, }; const reducer = (state = initialState, action) => diff --git a/packages/core/admin/admin/src/components/RBACProvider/tests/reducer.test.js b/packages/core/admin/admin/src/components/RBACProvider/tests/reducer.test.js new file mode 100644 index 0000000000..b4dde7df9b --- /dev/null +++ b/packages/core/admin/admin/src/components/RBACProvider/tests/reducer.test.js @@ -0,0 +1,96 @@ +import { permissions } from '../../../../../../../admin-test-utils/lib/fixtures'; + +import { setPermissions, resetStore } from '../actions'; +import rbacProviderReducer, { initialState } from '../reducer'; + +describe('rbacProviderReducer', () => { + let state; + + beforeEach(() => { + state = { + allPermissions: null, + collectionTypesRelatedPermissions: {}, + }; + }); + + it('returns the initial state', () => { + const expected = state; + + expect(rbacProviderReducer(undefined, {})).toEqual(expected); + }); + + describe('resetStore', () => { + it('should reset the state to its initial value', () => { + state.allPermissions = true; + state.collectionTypesRelatedPermissions = true; + + expect(rbacProviderReducer(state, resetStore())).toEqual(initialState); + }); + }); + + describe('setPermissions', () => { + it('should set the allPermissions value correctly', () => { + const permissions = [{ action: 'test', subject: null }]; + const expected = { ...state, allPermissions: permissions }; + + expect(rbacProviderReducer(state, setPermissions(permissions))).toEqual(expected); + }); + + it('should set the collectionTypesRelatedPermissions correctly', () => { + const expected = { + foo: { + 'plugins::content-manager.explorer.create': [ + { + action: 'plugins::content-manager.explorer.create', + subject: 'foo', + properties: { + fields: ['f1'], + }, + conditions: [], + }, + { + action: 'plugins::content-manager.explorer.create', + subject: 'foo', + properties: { + fields: ['f2'], + }, + conditions: [], + }, + ], + 'plugins::content-manager.explorer.read': [ + { + action: 'plugins::content-manager.explorer.read', + subject: 'foo', + properties: { + fields: ['f1'], + }, + conditions: [], + }, + ], + }, + bar: { + 'plugins::content-manager.explorer.delete': [ + { + action: 'plugins::content-manager.explorer.delete', + subject: 'bar', + }, + ], + 'plugins::content-manager.explorer.update': [ + { + action: 'plugins::content-manager.explorer.update', + subject: 'bar', + properties: { + fields: ['f1'], + }, + conditions: [], + }, + ], + }, + }; + + expect( + rbacProviderReducer(state, setPermissions(permissions)).collectionTypesRelatedPermissions + ).toEqual(expected); + }); + }); +}); diff --git a/packages/core/content-type-builder/admin/src/containers/DataManagerProvider/index.js b/packages/core/content-type-builder/admin/src/containers/DataManagerProvider/index.js index 38632f08c5..d6aff58571 100644 --- a/packages/core/content-type-builder/admin/src/containers/DataManagerProvider/index.js +++ b/packages/core/content-type-builder/admin/src/containers/DataManagerProvider/index.js @@ -8,9 +8,9 @@ import { PopUpWarning, useNotification, useStrapiApp, - useUser, useAutoReloadOverlayBlocker, useAppInfos, + useRBACProvider, } from '@strapi/helper-plugin'; import { useIntl } from 'react-intl'; import { useHistory, useLocation, useRouteMatch, Redirect } from 'react-router-dom'; @@ -77,7 +77,7 @@ const DataManagerProvider = ({ const { autoReload } = useAppInfos(); const { formatMessage } = useIntl(); const { emitEvent } = useGlobalContext(); - const { fetchUserPermissions } = useUser(); + const { refetchPermissions } = useRBACProvider(); const { pathname } = useLocation(); const { push } = useHistory(); @@ -518,7 +518,7 @@ const DataManagerProvider = ({ }; const updatePermissions = async () => { - await fetchUserPermissions(); + await refetchPermissions(); }; const updateSchema = (data, schemaType, componentUID) => { diff --git a/packages/core/helper-plugin/lib/src/components/CheckPagePermissions/index.js b/packages/core/helper-plugin/lib/src/components/CheckPagePermissions/index.js index d46e326d41..16bb9e4acc 100644 --- a/packages/core/helper-plugin/lib/src/components/CheckPagePermissions/index.js +++ b/packages/core/helper-plugin/lib/src/components/CheckPagePermissions/index.js @@ -2,14 +2,15 @@ import React, { useEffect, useRef, useState } from 'react'; import { Redirect } from 'react-router-dom'; import PropTypes from 'prop-types'; import useNotification from '../../hooks/useNotification'; -import useUser from '../../hooks/useUser'; + import hasPermissions from '../../utils/hasPermissions'; import LoadingIndicatorPage from '../LoadingIndicatorPage'; +import useRBACProvider from '../../hooks/useRBACProvider'; const CheckPagePermissions = ({ permissions, children }) => { const abortController = new AbortController(); const { signal } = abortController; - const { userPermissions } = useUser(); + const { allPermissions } = useRBACProvider(); const toggleNotification = useNotification(); const [state, setState] = useState({ isLoading: true, canAccess: false }); @@ -20,7 +21,7 @@ const CheckPagePermissions = ({ permissions, children }) => { try { setState({ isLoading: true, canAccess: false }); - const canAccess = await hasPermissions(userPermissions, permissions, signal); + const canAccess = await hasPermissions(allPermissions, permissions, signal); if (isMounted.current) { setState({ isLoading: false, canAccess }); diff --git a/packages/core/helper-plugin/lib/src/components/CheckPermissions/index.js b/packages/core/helper-plugin/lib/src/components/CheckPermissions/index.js index 91162c8e86..5efa328317 100644 --- a/packages/core/helper-plugin/lib/src/components/CheckPermissions/index.js +++ b/packages/core/helper-plugin/lib/src/components/CheckPermissions/index.js @@ -1,14 +1,15 @@ import { useEffect, useRef, useState } from 'react'; import PropTypes from 'prop-types'; import useNotification from '../../hooks/useNotification'; -import useUser from '../../hooks/useUser'; + import hasPermissions from '../../utils/hasPermissions'; +import useRBACProvider from '../../hooks/useRBACProvider'; // NOTE: this component is very similar to the CheckPagePermissions // except that it does not handle redirections nor loading state const CheckPermissions = ({ permissions, children }) => { - const { userPermissions } = useUser(); + const { allPermissions } = useRBACProvider(); const toggleNotification = useNotification(); const [state, setState] = useState({ isLoading: true, canAccess: false }); const isMounted = useRef(true); @@ -20,7 +21,7 @@ const CheckPermissions = ({ permissions, children }) => { try { setState({ isLoading: true, canAccess: false }); - const canAccess = await hasPermissions(userPermissions, permissions, signal); + const canAccess = await hasPermissions(allPermissions, permissions, signal); if (isMounted.current) { setState({ isLoading: false, canAccess }); diff --git a/packages/core/helper-plugin/lib/src/contexts/RBACProviderContext.js b/packages/core/helper-plugin/lib/src/contexts/RBACProviderContext.js new file mode 100644 index 0000000000..9077188541 --- /dev/null +++ b/packages/core/helper-plugin/lib/src/contexts/RBACProviderContext.js @@ -0,0 +1,12 @@ +/** + * + * RBACProviderContext + * + * + */ + +import { createContext } from 'react'; + +const RBACProviderContext = createContext(); + +export default RBACProviderContext; diff --git a/packages/core/helper-plugin/lib/src/hooks/useRBACProvider/index.js b/packages/core/helper-plugin/lib/src/hooks/useRBACProvider/index.js new file mode 100644 index 0000000000..75c5ee87d8 --- /dev/null +++ b/packages/core/helper-plugin/lib/src/hooks/useRBACProvider/index.js @@ -0,0 +1,12 @@ +/** + * + * useRBACProvider + * + */ + +import { useContext } from 'react'; +import RBACProviderContext from '../../contexts/RBACProviderContext'; + +const useRBACProvider = () => useContext(RBACProviderContext); + +export default useRBACProvider; diff --git a/packages/core/helper-plugin/lib/src/hooks/useUserPermissions/index.js b/packages/core/helper-plugin/lib/src/hooks/useUserPermissions/index.js index 13bf209824..b9c410783f 100644 --- a/packages/core/helper-plugin/lib/src/hooks/useUserPermissions/index.js +++ b/packages/core/helper-plugin/lib/src/hooks/useUserPermissions/index.js @@ -1,10 +1,10 @@ import { useCallback, useEffect, useMemo, useReducer, useRef } from 'react'; import hasPermissions from '../../utils/hasPermissions'; -import useUser from '../useUser'; import generateResultsObject from './utils/generateResultsObject'; import reducer from './reducer'; import init from './init'; +import useRBACProvider from '../useRBACProvider'; const useUserPermissions = (pluginPermissions, permissions) => { const abortController = new AbortController(); @@ -14,8 +14,8 @@ const useUserPermissions = (pluginPermissions, permissions) => { const permissionNames = useMemo(() => { return Object.keys(pluginPermissions); }, [pluginPermissions]); - const { userPermissions } = useUser(); - const currentUserPermissions = permissions || userPermissions; + const { allPermissions } = useRBACProvider(); + const currentUserPermissions = permissions || allPermissions; const [state, dispatch] = useReducer(reducer, {}, () => init(permissionNames)); const checkPermissionsRef = useRef(); const generateArrayOfPromisesRef = useRef(); diff --git a/packages/core/helper-plugin/lib/src/index.js b/packages/core/helper-plugin/lib/src/index.js index 335b685eab..114c0d7ebb 100644 --- a/packages/core/helper-plugin/lib/src/index.js +++ b/packages/core/helper-plugin/lib/src/index.js @@ -113,6 +113,7 @@ export { default as OverlayBlockerContext } from './contexts/OverlayBlockerConte export { GlobalContext, GlobalContextProvider, useGlobalContext } from './contexts/GlobalContext'; export { default as UserContext } from './contexts/UserContext'; export { default as ContentManagerEditViewDataManagerContext } from './contexts/ContentManagerEditViewDataManagerContext'; +export { default as RBACProviderContext } from './contexts/RBACProviderContext'; // Hooks export { default as useAppInfos } from './hooks/useAppInfos'; @@ -126,6 +127,7 @@ export { default as useUserPermissions } from './hooks/useUserPermissions'; export { default as useQueryParams } from './hooks/useQueryParams'; export { default as useOverlayBlocker } from './hooks/useOverlayBlocker'; export { default as useAutoReloadOverlayBlocker } from './hooks/useAutoReloadOverlayBlocker'; +export { default as useRBACProvider } from './hooks/useRBACProvider'; // Providers export { default as LibraryProvider } from './providers/LibraryProvider'; diff --git a/packages/plugins/i18n/admin/src/components/ModalCreate/index.js b/packages/plugins/i18n/admin/src/components/ModalCreate/index.js index ad8840ab94..cecc1a708d 100644 --- a/packages/plugins/i18n/admin/src/components/ModalCreate/index.js +++ b/packages/plugins/i18n/admin/src/components/ModalCreate/index.js @@ -1,6 +1,6 @@ import React, { useRef } from 'react'; import PropTypes from 'prop-types'; -import { Modal, ModalFooter, TabPanel, useUser } from '@strapi/helper-plugin'; +import { Modal, ModalFooter, TabPanel, useRBACProvider } from '@strapi/helper-plugin'; import { useIntl } from 'react-intl'; import { Button } from '@buffetjs/core'; import { Formik } from 'formik'; @@ -16,8 +16,8 @@ const ModalCreate = ({ alreadyUsedLocales, onClose, isOpened }) => { const { defaultLocales, isLoading } = useDefaultLocales(); const { isAdding, addLocale } = useAddLocale(); const { formatMessage } = useIntl(); + const { refetchPermissions } = useRBACProvider(); - const { fetchUserPermissions } = useUser(); const shouldUpdatePermissions = useRef(false); if (isLoading) { @@ -32,7 +32,7 @@ const ModalCreate = ({ alreadyUsedLocales, onClose, isOpened }) => { const handleClosed = async () => { if (shouldUpdatePermissions.current) { - await fetchUserPermissions(); + await refetchPermissions(); } shouldUpdatePermissions.current = true;