@strapi/plugin-users-permissions 0.0.0-next.f45143c5e2a8a9d85691d0abf79a3f42024a0c71 → 0.0.0-next.f5b09a8e61e059f02784478e27c310c6290be088

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (69) hide show
  1. package/.eslintignore +1 -2
  2. package/.eslintrc +14 -0
  3. package/admin/src/components/BoundRoute/index.js +5 -3
  4. package/admin/src/components/FormModal/Input/index.js +6 -3
  5. package/admin/src/components/FormModal/index.js +13 -10
  6. package/admin/src/components/Permissions/PermissionRow/CheckboxWrapper.js +1 -1
  7. package/admin/src/components/Permissions/PermissionRow/SubCategory.js +26 -5
  8. package/admin/src/components/Permissions/PermissionRow/index.js +4 -2
  9. package/admin/src/components/Permissions/index.js +6 -5
  10. package/admin/src/components/Policies/index.js +3 -2
  11. package/admin/src/components/UsersPermissions/index.js +8 -5
  12. package/admin/src/{permissions.js → constants.js} +1 -3
  13. package/admin/src/contexts/UsersPermissionsContext/index.js +1 -0
  14. package/admin/src/index.js +19 -28
  15. package/admin/src/pages/AdvancedSettings/index.js +68 -52
  16. package/admin/src/pages/AdvancedSettings/utils/schema.js +1 -1
  17. package/admin/src/pages/EmailTemplates/components/EmailForm.js +14 -13
  18. package/admin/src/pages/EmailTemplates/components/EmailTable.js +9 -7
  19. package/admin/src/pages/EmailTemplates/index.js +77 -63
  20. package/admin/src/pages/EmailTemplates/utils/schema.js +1 -1
  21. package/admin/src/pages/Providers/index.js +91 -86
  22. package/admin/src/pages/Providers/utils/forms.js +1 -1
  23. package/admin/src/pages/Roles/{CreatePage/utils/schema.js → constants.js} +2 -4
  24. package/admin/src/pages/Roles/hooks/usePlugins.js +78 -0
  25. package/admin/src/pages/Roles/index.js +17 -11
  26. package/admin/src/pages/Roles/pages/CreatePage.js +199 -0
  27. package/admin/src/pages/Roles/pages/EditPage.js +220 -0
  28. package/admin/src/pages/Roles/{ListPage → pages/ListPage}/components/TableBody.js +46 -15
  29. package/admin/src/pages/Roles/{ListPage → pages/ListPage}/index.js +48 -47
  30. package/admin/src/pages/Roles/{ListPage → pages/ListPage}/utils/api.js +3 -4
  31. package/admin/src/translations/ru.json +50 -26
  32. package/admin/src/translations/zh-Hans.json +80 -80
  33. package/admin/src/utils/index.js +1 -2
  34. package/documentation/content-api.yaml +23 -15
  35. package/jest.config.front.js +2 -0
  36. package/package.json +47 -30
  37. package/packup.config.ts +42 -0
  38. package/server/bootstrap/index.js +36 -0
  39. package/server/controllers/auth.js +51 -14
  40. package/server/controllers/user.js +12 -1
  41. package/server/middlewares/rateLimit.js +41 -21
  42. package/server/register.js +7 -1
  43. package/server/services/providers-registry.js +1 -1
  44. package/server/strategies/users-permissions.js +1 -8
  45. package/.eslintrc.js +0 -14
  46. package/admin/src/hooks/index.js +0 -5
  47. package/admin/src/hooks/useFetchRole/index.js +0 -64
  48. package/admin/src/hooks/useFetchRole/reducer.js +0 -31
  49. package/admin/src/hooks/useForm/index.js +0 -70
  50. package/admin/src/hooks/useForm/reducer.js +0 -40
  51. package/admin/src/hooks/usePlugins/index.js +0 -67
  52. package/admin/src/hooks/usePlugins/init.js +0 -5
  53. package/admin/src/hooks/usePlugins/reducer.js +0 -34
  54. package/admin/src/hooks/useRolesList/index.js +0 -63
  55. package/admin/src/hooks/useRolesList/init.js +0 -5
  56. package/admin/src/hooks/useRolesList/reducer.js +0 -31
  57. package/admin/src/pages/AdvancedSettings/utils/api.js +0 -17
  58. package/admin/src/pages/EmailTemplates/utils/api.js +0 -17
  59. package/admin/src/pages/Providers/reducer.js +0 -54
  60. package/admin/src/pages/Providers/utils/api.js +0 -25
  61. package/admin/src/pages/Providers/utils/createProvidersArray.js +0 -21
  62. package/admin/src/pages/Roles/CreatePage/index.js +0 -182
  63. package/admin/src/pages/Roles/EditPage/index.js +0 -194
  64. package/admin/src/pages/Roles/EditPage/utils/schema.js +0 -9
  65. package/admin/src/pages/Roles/ProtectedCreatePage/index.js +0 -12
  66. package/admin/src/pages/Roles/ProtectedEditPage/index.js +0 -12
  67. package/admin/src/pages/Roles/ProtectedListPage/index.js +0 -15
  68. package/admin/src/utils/getRequestURL.js +0 -5
  69. package/strapi-admin.js +0 -3
@@ -1,25 +1,29 @@
1
- import React, { useMemo, useRef, useState } from 'react';
2
- import { useQuery, useMutation, useQueryClient } from 'react-query';
3
- import { useIntl } from 'react-intl';
1
+ import * as React from 'react';
2
+
3
+ import { ContentLayout, HeaderLayout, Main, useNotifyAT } from '@strapi/design-system';
4
4
  import {
5
+ CheckPagePermissions,
6
+ LoadingIndicatorPage,
5
7
  SettingsPageTitle,
6
- useTracking,
8
+ useAPIErrorHandler,
9
+ useFetchClient,
10
+ useFocusWhenNavigate,
7
11
  useNotification,
8
12
  useOverlayBlocker,
9
- CheckPagePermissions,
10
13
  useRBAC,
11
- useFocusWhenNavigate,
12
- LoadingIndicatorPage,
14
+ useTracking,
13
15
  } from '@strapi/helper-plugin';
14
- import { useNotifyAT, Main, ContentLayout, HeaderLayout } from '@strapi/design-system';
15
- import pluginPermissions from '../../permissions';
16
+ import { useIntl } from 'react-intl';
17
+ import { useMutation, useQuery, useQueryClient } from 'react-query';
18
+
19
+ import { PERMISSIONS } from '../../constants';
16
20
  import { getTrad } from '../../utils';
17
- import { fetchData, putEmailTemplate } from './utils/api';
18
- import EmailTable from './components/EmailTable';
21
+
19
22
  import EmailForm from './components/EmailForm';
23
+ import EmailTable from './components/EmailTable';
20
24
 
21
25
  const ProtectedEmailTemplatesPage = () => (
22
- <CheckPagePermissions permissions={pluginPermissions.readEmailTemplates}>
26
+ <CheckPagePermissions permissions={PERMISSIONS.readEmailTemplates}>
23
27
  <EmailTemplatesPage />
24
28
  </CheckPagePermissions>
25
29
  );
@@ -30,40 +34,46 @@ const EmailTemplatesPage = () => {
30
34
  const { notifyStatus } = useNotifyAT();
31
35
  const toggleNotification = useNotification();
32
36
  const { lockApp, unlockApp } = useOverlayBlocker();
33
- const trackUsageRef = useRef(trackUsage);
34
37
  const queryClient = useQueryClient();
35
- useFocusWhenNavigate();
38
+ const { get, put } = useFetchClient();
39
+ const { formatAPIError } = useAPIErrorHandler();
36
40
 
37
- const [isModalOpen, setIsModalOpen] = useState(false);
38
- const [templateToEdit, setTemplateToEdit] = useState(null);
41
+ useFocusWhenNavigate();
39
42
 
40
- const updatePermissions = useMemo(() => {
41
- return { update: pluginPermissions.updateEmailTemplates };
42
- }, []);
43
+ const [isModalOpen, setIsModalOpen] = React.useState(false);
44
+ const [templateToEdit, setTemplateToEdit] = React.useState(null);
43
45
 
44
46
  const {
45
47
  isLoading: isLoadingForPermissions,
46
48
  allowedActions: { canUpdate },
47
- } = useRBAC(updatePermissions);
48
-
49
- const { status: isLoadingData, data } = useQuery('email-templates', () => fetchData(), {
50
- onSuccess() {
51
- notifyStatus(
52
- formatMessage({
53
- id: getTrad('Email.template.data.loaded'),
54
- defaultMessage: 'Email templates has been loaded',
55
- })
56
- );
57
- },
58
- onError() {
59
- toggleNotification({
60
- type: 'warning',
61
- message: { id: 'notification.error', defaultMessage: 'An error occured' },
62
- });
49
+ } = useRBAC({ update: PERMISSIONS.updateEmailTemplates });
50
+
51
+ const { isLoading: isLoadingData, data } = useQuery(
52
+ ['users-permissions', 'email-templates'],
53
+ async () => {
54
+ const { data } = await get('/users-permissions/email-templates');
55
+
56
+ return data;
63
57
  },
64
- });
58
+ {
59
+ onSuccess() {
60
+ notifyStatus(
61
+ formatMessage({
62
+ id: getTrad('Email.template.data.loaded'),
63
+ defaultMessage: 'Email templates has been loaded',
64
+ })
65
+ );
66
+ },
67
+ onError(error) {
68
+ toggleNotification({
69
+ type: 'warning',
70
+ message: formatAPIError(error),
71
+ });
72
+ },
73
+ }
74
+ );
65
75
 
66
- const isLoading = isLoadingForPermissions || isLoadingData !== 'success';
76
+ const isLoading = isLoadingForPermissions || isLoadingData;
67
77
 
68
78
  const handleToggle = () => {
69
79
  setIsModalOpen((prev) => !prev);
@@ -74,34 +84,38 @@ const EmailTemplatesPage = () => {
74
84
  handleToggle();
75
85
  };
76
86
 
77
- const submitMutation = useMutation((body) => putEmailTemplate({ 'email-templates': body }), {
78
- async onSuccess() {
79
- await queryClient.invalidateQueries('email-templates');
80
-
81
- toggleNotification({
82
- type: 'success',
83
- message: { id: 'notification.success.saved', defaultMessage: 'Saved' },
84
- });
85
-
86
- trackUsageRef.current('didEditEmailTemplates');
87
-
88
- unlockApp();
89
- handleToggle();
90
- },
91
- onError() {
92
- toggleNotification({
93
- type: 'warning',
94
- message: { id: 'notification.error', defaultMessage: 'An error occured' },
95
- });
96
- unlockApp();
97
- },
98
- refetchActive: true,
99
- });
100
- const { isLoading: isSubmittingForm } = submitMutation;
87
+ const submitMutation = useMutation(
88
+ (body) => put('/users-permissions/email-templates', { 'email-templates': body }),
89
+ {
90
+ async onSuccess() {
91
+ await queryClient.invalidateQueries(['users-permissions', 'email-templates']);
92
+
93
+ toggleNotification({
94
+ type: 'success',
95
+ message: { id: 'notification.success.saved', defaultMessage: 'Saved' },
96
+ });
97
+
98
+ trackUsage('didEditEmailTemplates');
99
+
100
+ unlockApp();
101
+ handleToggle();
102
+ },
103
+ onError(error) {
104
+ toggleNotification({
105
+ type: 'warning',
106
+ message: formatAPIError(error),
107
+ });
108
+
109
+ unlockApp();
110
+ },
111
+ refetchActive: true,
112
+ }
113
+ );
101
114
 
102
115
  const handleSubmit = (body) => {
103
116
  lockApp();
104
- trackUsageRef.current('willEditEmailTemplates');
117
+
118
+ trackUsage('willEditEmailTemplates');
105
119
 
106
120
  const editedTemplates = { ...data, [templateToEdit]: body };
107
121
  submitMutation.mutate(editedTemplates);
@@ -130,7 +144,7 @@ const EmailTemplatesPage = () => {
130
144
  }
131
145
 
132
146
  return (
133
- <Main aria-busy={isSubmittingForm}>
147
+ <Main aria-busy={submitMutation.isLoading}>
134
148
  <SettingsPageTitle
135
149
  name={formatMessage({
136
150
  id: getTrad('HeaderNav.link.emailTemplates'),
@@ -1,5 +1,5 @@
1
- import * as yup from 'yup';
2
1
  import { translatedErrors } from '@strapi/helper-plugin';
2
+ import * as yup from 'yup';
3
3
 
4
4
  const schema = yup.object().shape({
5
5
  options: yup
@@ -1,128 +1,132 @@
1
- import React, { useMemo, useRef, useState } from 'react';
2
- import { useIntl } from 'react-intl';
3
- import {
4
- SettingsPageTitle,
5
- LoadingIndicatorPage,
6
- useTracking,
7
- useNotification,
8
- useOverlayBlocker,
9
- CheckPagePermissions,
10
- useRBAC,
11
- useFocusWhenNavigate,
12
- onRowClick,
13
- stopPropagation,
14
- } from '@strapi/helper-plugin';
15
- import has from 'lodash/has';
16
- import upperFirst from 'lodash/upperFirst';
1
+ import * as React from 'react';
2
+
17
3
  import {
4
+ ContentLayout,
18
5
  HeaderLayout,
6
+ IconButton,
19
7
  Layout,
20
- ContentLayout,
21
8
  Main,
22
- useNotifyAT,
23
9
  Table,
24
- Thead,
25
- Tr,
26
- Th,
27
10
  Tbody,
28
11
  Td,
12
+ Th,
13
+ Thead,
14
+ Tr,
29
15
  Typography,
30
- IconButton,
31
16
  VisuallyHidden,
32
17
  } from '@strapi/design-system';
18
+ import {
19
+ CheckPagePermissions,
20
+ LoadingIndicatorPage,
21
+ onRowClick,
22
+ SettingsPageTitle,
23
+ stopPropagation,
24
+ useAPIErrorHandler,
25
+ useCollator,
26
+ useFetchClient,
27
+ useFocusWhenNavigate,
28
+ useNotification,
29
+ useOverlayBlocker,
30
+ useRBAC,
31
+ useTracking,
32
+ } from '@strapi/helper-plugin';
33
33
  import { Pencil } from '@strapi/icons';
34
- import { useQuery, useMutation, useQueryClient } from 'react-query';
35
- import forms from './utils/forms';
36
- import { fetchData, putProvider } from './utils/api';
37
- import createProvidersArray from './utils/createProvidersArray';
38
- import { getTrad } from '../../utils';
39
- import pluginPermissions from '../../permissions';
34
+ import upperFirst from 'lodash/upperFirst';
35
+ import { useIntl } from 'react-intl';
36
+ import { useMutation, useQuery, useQueryClient } from 'react-query';
37
+
40
38
  import FormModal from '../../components/FormModal';
39
+ import { PERMISSIONS } from '../../constants';
40
+ import { getTrad } from '../../utils';
41
+
42
+ import forms from './utils/forms';
41
43
 
42
44
  export const ProvidersPage = () => {
43
- const { formatMessage } = useIntl();
44
- useFocusWhenNavigate();
45
- const { notifyStatus } = useNotifyAT();
45
+ const { formatMessage, locale } = useIntl();
46
46
  const queryClient = useQueryClient();
47
47
  const { trackUsage } = useTracking();
48
- const trackUsageRef = useRef(trackUsage);
49
- const [isOpen, setIsOpen] = useState(false);
50
- const [isSubmiting, setIsSubmiting] = useState(false);
51
- const [providerToEditName, setProviderToEditName] = useState(null);
48
+ const [isOpen, setIsOpen] = React.useState(false);
49
+ const [providerToEditName, setProviderToEditName] = React.useState(null);
52
50
  const toggleNotification = useNotification();
53
51
  const { lockApp, unlockApp } = useOverlayBlocker();
52
+ const { get, put } = useFetchClient();
53
+ const { formatAPIError } = useAPIErrorHandler();
54
+ const formatter = useCollator(locale, {
55
+ sensitivity: 'base',
56
+ });
54
57
 
55
- const updatePermissions = useMemo(() => {
56
- return { update: pluginPermissions.updateProviders };
57
- }, []);
58
+ useFocusWhenNavigate();
58
59
 
59
60
  const {
60
- isLoading: isLoadingForPermissions,
61
+ isLoading: isLoadingPermissions,
61
62
  allowedActions: { canUpdate },
62
- } = useRBAC(updatePermissions);
63
+ } = useRBAC({ update: PERMISSIONS.updateProviders });
63
64
 
64
- const {
65
- isLoading: isLoadingForData,
66
- data: modifiedData,
67
- isFetching,
68
- } = useQuery('get-providers', () => fetchData(toggleNotification), {
69
- onSuccess() {
70
- notifyStatus(
71
- formatMessage({
72
- id: getTrad('Providers.data.loaded'),
73
- defaultMessage: 'Providers have been loaded',
74
- })
75
- );
76
- },
77
- initialData: {},
78
- });
65
+ const { isLoading: isLoadingData, data } = useQuery(
66
+ ['users-permissions', 'get-providers'],
67
+ async () => {
68
+ const { data } = await get('/users-permissions/providers');
79
69
 
80
- const isLoading = isLoadingForData || isFetching;
70
+ return data;
71
+ },
72
+ {
73
+ initialData: {},
74
+ }
75
+ );
81
76
 
82
- const submitMutation = useMutation(putProvider, {
77
+ const submitMutation = useMutation((body) => put('/users-permissions/providers', body), {
83
78
  async onSuccess() {
84
- await queryClient.invalidateQueries('get-providers');
79
+ await queryClient.invalidateQueries(['users-permissions', 'providers']);
80
+
85
81
  toggleNotification({
86
- type: 'info',
82
+ type: 'success',
87
83
  message: { id: getTrad('notification.success.submit') },
88
84
  });
89
85
 
90
- trackUsageRef.current('didEditAuthenticationProvider');
91
- setIsSubmiting(false);
86
+ trackUsage('didEditAuthenticationProvider');
87
+
92
88
  handleToggleModal();
93
89
  unlockApp();
94
90
  },
95
- onError() {
91
+ onError(error) {
96
92
  toggleNotification({
97
93
  type: 'warning',
98
- message: { id: 'notification.error' },
94
+ message: formatAPIError(error),
99
95
  });
96
+
100
97
  unlockApp();
101
- setIsSubmiting(false);
102
98
  },
103
99
  refetchActive: false,
104
100
  });
105
101
 
106
- const providers = useMemo(() => createProvidersArray(modifiedData), [modifiedData]);
102
+ const providers = Object.entries(data)
103
+ .reduce((acc, [name, provider]) => {
104
+ const { icon, enabled, subdomain } = provider;
107
105
 
108
- const rowCount = providers.length;
106
+ acc.push({
107
+ name,
108
+ icon: icon === 'envelope' ? ['fas', 'envelope'] : ['fab', icon],
109
+ enabled,
110
+ subdomain,
111
+ });
112
+
113
+ return acc;
114
+ }, [])
115
+ .sort((a, b) => formatter.compare(a.name, b.name));
109
116
 
110
- const isProviderWithSubdomain = useMemo(() => {
117
+ const isLoading = isLoadingData || isLoadingPermissions;
118
+
119
+ const isProviderWithSubdomain = React.useMemo(() => {
111
120
  if (!providerToEditName) {
112
121
  return false;
113
122
  }
114
123
 
115
124
  const providerToEdit = providers.find((obj) => obj.name === providerToEditName);
116
125
 
117
- return has(providerToEdit, 'subdomain');
126
+ return !!providerToEdit?.subdomain;
118
127
  }, [providers, providerToEditName]);
119
128
 
120
- const pageTitle = formatMessage({
121
- id: getTrad('HeaderNav.link.providers'),
122
- defaultMessage: 'Providers',
123
- });
124
-
125
- const layoutToRender = useMemo(() => {
129
+ const layoutToRender = React.useMemo(() => {
126
130
  if (providerToEditName === 'email') {
127
131
  return forms.email;
128
132
  }
@@ -146,20 +150,21 @@ export const ProvidersPage = () => {
146
150
  };
147
151
 
148
152
  const handleSubmit = async (values) => {
149
- setIsSubmiting(true);
150
-
151
153
  lockApp();
152
154
 
153
- trackUsageRef.current('willEditAuthenticationProvider');
155
+ trackUsage('willEditAuthenticationProvider');
154
156
 
155
- const body = { ...modifiedData, [providerToEditName]: values };
156
-
157
- submitMutation.mutate({ providers: body });
157
+ submitMutation.mutate({ providers: { ...data, [providerToEditName]: values } });
158
158
  };
159
159
 
160
160
  return (
161
161
  <Layout>
162
- <SettingsPageTitle name={pageTitle} />
162
+ <SettingsPageTitle
163
+ name={formatMessage({
164
+ id: getTrad('HeaderNav.link.providers'),
165
+ defaultMessage: 'Providers',
166
+ })}
167
+ />
163
168
  <Main>
164
169
  <HeaderLayout
165
170
  title={formatMessage({
@@ -167,11 +172,11 @@ export const ProvidersPage = () => {
167
172
  defaultMessage: 'Providers',
168
173
  })}
169
174
  />
170
- {isLoading || isLoadingForPermissions ? (
175
+ {isLoading ? (
171
176
  <LoadingIndicatorPage />
172
177
  ) : (
173
178
  <ContentLayout>
174
- <Table colCount={3} rowCount={rowCount + 1}>
179
+ <Table colCount={3} rowCount={providers.length + 1}>
175
180
  <Thead>
176
181
  <Tr>
177
182
  <Th>
@@ -244,9 +249,9 @@ export const ProvidersPage = () => {
244
249
  )}
245
250
  </Main>
246
251
  <FormModal
247
- initialData={modifiedData[providerToEditName]}
252
+ initialData={data[providerToEditName]}
248
253
  isOpen={isOpen}
249
- isSubmiting={isSubmiting}
254
+ isSubmiting={submitMutation.isLoading}
250
255
  layout={layoutToRender}
251
256
  headerBreadcrumbs={[
252
257
  formatMessage({
@@ -264,7 +269,7 @@ export const ProvidersPage = () => {
264
269
  };
265
270
 
266
271
  const ProtectedProvidersPage = () => (
267
- <CheckPagePermissions permissions={pluginPermissions.readProviders}>
272
+ <CheckPagePermissions permissions={PERMISSIONS.readProviders}>
268
273
  <ProvidersPage />
269
274
  </CheckPagePermissions>
270
275
  );
@@ -1,5 +1,5 @@
1
- import * as yup from 'yup';
2
1
  import { translatedErrors } from '@strapi/helper-plugin';
2
+ import * as yup from 'yup';
3
3
 
4
4
  import { getTrad } from '../../../utils';
5
5
 
@@ -1,9 +1,7 @@
1
- import * as yup from 'yup';
2
1
  import { translatedErrors } from '@strapi/helper-plugin';
2
+ import * as yup from 'yup';
3
3
 
4
- const schema = yup.object().shape({
4
+ export const createRoleSchema = yup.object().shape({
5
5
  name: yup.string().required(translatedErrors.required),
6
6
  description: yup.string().required(translatedErrors.required),
7
7
  });
8
-
9
- export default schema;
@@ -0,0 +1,78 @@
1
+ import { useEffect } from 'react';
2
+
3
+ import { useNotification, useFetchClient, useAPIErrorHandler } from '@strapi/helper-plugin';
4
+ import { useQueries } from 'react-query';
5
+
6
+ import { cleanPermissions, getTrad } from '../../../utils';
7
+
8
+ export const usePlugins = () => {
9
+ const toggleNotification = useNotification();
10
+ const { get } = useFetchClient();
11
+ const { formatAPIError } = useAPIErrorHandler(getTrad);
12
+
13
+ const [
14
+ {
15
+ data: permissions,
16
+ isLoading: isLoadingPermissions,
17
+ error: permissionsError,
18
+ refetch: refetchPermissions,
19
+ },
20
+ { data: routes, isLoading: isLoadingRoutes, error: routesError, refetch: refetchRoutes },
21
+ ] = useQueries([
22
+ {
23
+ queryKey: ['users-permissions', 'permissions'],
24
+ async queryFn() {
25
+ const {
26
+ data: { permissions },
27
+ } = await get(`/users-permissions/permissions`);
28
+
29
+ return permissions;
30
+ },
31
+ },
32
+ {
33
+ queryKey: ['users-permissions', 'routes'],
34
+ async queryFn() {
35
+ const {
36
+ data: { routes },
37
+ } = await get(`/users-permissions/routes`);
38
+
39
+ return routes;
40
+ },
41
+ },
42
+ ]);
43
+
44
+ const refetchQueries = async () => {
45
+ await Promise.all([refetchPermissions(), refetchRoutes()]);
46
+ };
47
+
48
+ useEffect(() => {
49
+ if (permissionsError) {
50
+ toggleNotification({
51
+ type: 'warning',
52
+ message: formatAPIError(permissionsError),
53
+ });
54
+ }
55
+ }, [toggleNotification, permissionsError, formatAPIError]);
56
+
57
+ useEffect(() => {
58
+ if (routesError) {
59
+ toggleNotification({
60
+ type: 'warning',
61
+ message: formatAPIError(routesError),
62
+ });
63
+ }
64
+ }, [toggleNotification, routesError, formatAPIError]);
65
+
66
+ const isLoading = isLoadingPermissions || isLoadingRoutes;
67
+
68
+ return {
69
+ // TODO: these return values need to be memoized, otherwise
70
+ // they will create infinite rendering loops when used as
71
+ // effect dependencies
72
+ permissions: permissions ? cleanPermissions(permissions) : {},
73
+ routes: routes ?? {},
74
+
75
+ getData: refetchQueries,
76
+ isLoading,
77
+ };
78
+ };
@@ -1,23 +1,29 @@
1
1
  import React from 'react';
2
- import { Switch, Route } from 'react-router-dom';
3
- import { CheckPagePermissions, AnErrorOccurred } from '@strapi/helper-plugin';
4
- import pluginId from '../../pluginId';
5
- import pluginPermissions from '../../permissions';
6
- import ProtectedRolesListPage from './ProtectedListPage';
7
- import ProtectedRolesEditPage from './ProtectedEditPage';
8
- import ProtectedRolesCreatePage from './ProtectedCreatePage';
2
+
3
+ import { AnErrorOccurred, CheckPagePermissions } from '@strapi/helper-plugin';
4
+ import { Route, Switch } from 'react-router-dom';
5
+
6
+ import { PERMISSIONS } from '../../constants';
7
+
8
+ import { ProtectedRolesCreatePage } from './pages/CreatePage';
9
+ import { ProtectedRolesEditPage } from './pages/EditPage';
10
+ import { ProtectedRolesListPage } from './pages/ListPage';
9
11
 
10
12
  const Roles = () => {
11
13
  return (
12
- <CheckPagePermissions permissions={pluginPermissions.accessRoles}>
14
+ <CheckPagePermissions permissions={PERMISSIONS.accessRoles}>
13
15
  <Switch>
14
16
  <Route
15
- path={`/settings/${pluginId}/roles/new`}
17
+ path="/settings/users-permissions/roles/new"
16
18
  component={ProtectedRolesCreatePage}
17
19
  exact
18
20
  />
19
- <Route path={`/settings/${pluginId}/roles/:id`} component={ProtectedRolesEditPage} exact />
20
- <Route path={`/settings/${pluginId}/roles`} component={ProtectedRolesListPage} exact />
21
+ <Route
22
+ path="/settings/users-permissions/roles/:id"
23
+ component={ProtectedRolesEditPage}
24
+ exact
25
+ />
26
+ <Route path="/settings/users-permissions/roles" component={ProtectedRolesListPage} exact />
21
27
  <Route path="" component={AnErrorOccurred} />
22
28
  </Switch>
23
29
  </CheckPagePermissions>