@strapi/plugin-users-permissions 0.0.0-next.de5394e73076ccf7aca1e28dc68894e3c43f8b91 → 0.0.0-next.de77e236e318525454da54a1a2617d86742e6e6c

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 (184) hide show
  1. package/.eslintignore +1 -2
  2. package/.eslintrc +17 -0
  3. package/admin/src/components/Permissions/{index.js → index.jsx} +2 -4
  4. package/admin/src/{permissions.js → constants.js} +1 -3
  5. package/admin/src/index.js +17 -28
  6. package/admin/src/pages/AdvancedSettings/{index.js → index.jsx} +48 -35
  7. package/admin/src/pages/EmailTemplates/{index.js → index.jsx} +66 -55
  8. package/admin/src/pages/Providers/{index.js → index.jsx} +66 -64
  9. package/admin/src/{hooks → pages/Roles/hooks}/usePlugins.js +15 -8
  10. package/admin/src/pages/Roles/index.jsx +33 -0
  11. package/admin/src/pages/Roles/pages/CreatePage.jsx +199 -0
  12. package/admin/src/pages/Roles/pages/EditPage.jsx +220 -0
  13. package/admin/src/pages/Roles/{ListPage/components/TableBody.js → pages/ListPage/components/TableBody.jsx} +44 -14
  14. package/admin/src/pages/Roles/{ListPage/index.js → pages/ListPage/index.jsx} +31 -32
  15. package/admin/src/pages/Roles/{ListPage → pages/ListPage}/utils/api.js +2 -4
  16. package/admin/src/translations/zh-Hans.json +80 -80
  17. package/admin/src/utils/index.js +0 -1
  18. package/dist/_chunks/ar-MvD8Ghac.mjs +44 -0
  19. package/dist/_chunks/ar-MvD8Ghac.mjs.map +1 -0
  20. package/dist/_chunks/ar-t5qTFaAD.js +44 -0
  21. package/dist/_chunks/ar-t5qTFaAD.js.map +1 -0
  22. package/dist/_chunks/cs-BMuXwxA1.mjs +50 -0
  23. package/dist/_chunks/cs-BMuXwxA1.mjs.map +1 -0
  24. package/dist/_chunks/cs-I8N4u-Sd.js +50 -0
  25. package/dist/_chunks/cs-I8N4u-Sd.js.map +1 -0
  26. package/dist/_chunks/de-YTjtq89K.js +62 -0
  27. package/dist/_chunks/de-YTjtq89K.js.map +1 -0
  28. package/dist/_chunks/de-zs2qqc0W.mjs +62 -0
  29. package/dist/_chunks/de-zs2qqc0W.mjs.map +1 -0
  30. package/dist/_chunks/dk-HctVBMsG.mjs +86 -0
  31. package/dist/_chunks/dk-HctVBMsG.mjs.map +1 -0
  32. package/dist/_chunks/dk-TF-dWjzl.js +86 -0
  33. package/dist/_chunks/dk-TF-dWjzl.js.map +1 -0
  34. package/dist/_chunks/en-CE3wEy_c.mjs +86 -0
  35. package/dist/_chunks/en-CE3wEy_c.mjs.map +1 -0
  36. package/dist/_chunks/en-m608rMZx.js +86 -0
  37. package/dist/_chunks/en-m608rMZx.js.map +1 -0
  38. package/dist/_chunks/es-9381tih_.mjs +86 -0
  39. package/dist/_chunks/es-9381tih_.mjs.map +1 -0
  40. package/dist/_chunks/es-XBQsB8_9.js +86 -0
  41. package/dist/_chunks/es-XBQsB8_9.js.map +1 -0
  42. package/dist/_chunks/fr-6cz3U-IF.js +50 -0
  43. package/dist/_chunks/fr-6cz3U-IF.js.map +1 -0
  44. package/dist/_chunks/fr-CMSc77If.mjs +50 -0
  45. package/dist/_chunks/fr-CMSc77If.mjs.map +1 -0
  46. package/dist/_chunks/id-RJ934rq-.js +62 -0
  47. package/dist/_chunks/id-RJ934rq-.js.map +1 -0
  48. package/dist/_chunks/id-SDuyIkZa.mjs +62 -0
  49. package/dist/_chunks/id-SDuyIkZa.mjs.map +1 -0
  50. package/dist/_chunks/index-6EnldfNI.mjs +615 -0
  51. package/dist/_chunks/index-6EnldfNI.mjs.map +1 -0
  52. package/dist/_chunks/index-6GwHcGdL.js +249 -0
  53. package/dist/_chunks/index-6GwHcGdL.js.map +1 -0
  54. package/dist/_chunks/index-BJ2dBu2N.mjs +250 -0
  55. package/dist/_chunks/index-BJ2dBu2N.mjs.map +1 -0
  56. package/dist/_chunks/index-KNxvhY9E.js +1191 -0
  57. package/dist/_chunks/index-KNxvhY9E.js.map +1 -0
  58. package/dist/_chunks/index-U1clXdiG.mjs +1159 -0
  59. package/dist/_chunks/index-U1clXdiG.mjs.map +1 -0
  60. package/dist/_chunks/index-V7crIIIK.js +320 -0
  61. package/dist/_chunks/index-V7crIIIK.js.map +1 -0
  62. package/dist/_chunks/index-jpgayepG.js +407 -0
  63. package/dist/_chunks/index-jpgayepG.js.map +1 -0
  64. package/dist/_chunks/index-ko6yRyEd.js +638 -0
  65. package/dist/_chunks/index-ko6yRyEd.js.map +1 -0
  66. package/dist/_chunks/index-wDWfjd3v.mjs +385 -0
  67. package/dist/_chunks/index-wDWfjd3v.mjs.map +1 -0
  68. package/dist/_chunks/index-xcuiqIT8.mjs +301 -0
  69. package/dist/_chunks/index-xcuiqIT8.mjs.map +1 -0
  70. package/dist/_chunks/it-YhZOlM2X.js +62 -0
  71. package/dist/_chunks/it-YhZOlM2X.js.map +1 -0
  72. package/dist/_chunks/it-bvH7DgQo.mjs +62 -0
  73. package/dist/_chunks/it-bvH7DgQo.mjs.map +1 -0
  74. package/dist/_chunks/ja-o_-JPvQv.mjs +48 -0
  75. package/dist/_chunks/ja-o_-JPvQv.mjs.map +1 -0
  76. package/dist/_chunks/ja-xssHUXFv.js +48 -0
  77. package/dist/_chunks/ja-xssHUXFv.js.map +1 -0
  78. package/dist/_chunks/ko-C3mHUSJa.js +86 -0
  79. package/dist/_chunks/ko-C3mHUSJa.js.map +1 -0
  80. package/dist/_chunks/ko-XJbPSez_.mjs +86 -0
  81. package/dist/_chunks/ko-XJbPSez_.mjs.map +1 -0
  82. package/dist/_chunks/ms-II5Ea73J.mjs +49 -0
  83. package/dist/_chunks/ms-II5Ea73J.mjs.map +1 -0
  84. package/dist/_chunks/ms-d0hfg65Z.js +49 -0
  85. package/dist/_chunks/ms-d0hfg65Z.js.map +1 -0
  86. package/dist/_chunks/nl-TA7TfK_5.js +48 -0
  87. package/dist/_chunks/nl-TA7TfK_5.js.map +1 -0
  88. package/dist/_chunks/nl-vEy6TN0K.mjs +48 -0
  89. package/dist/_chunks/nl-vEy6TN0K.mjs.map +1 -0
  90. package/dist/_chunks/pl-0pUL9hdA.js +86 -0
  91. package/dist/_chunks/pl-0pUL9hdA.js.map +1 -0
  92. package/dist/_chunks/pl-2VowaFGt.mjs +86 -0
  93. package/dist/_chunks/pl-2VowaFGt.mjs.map +1 -0
  94. package/dist/_chunks/pt-BR-WNOhafR4.js +44 -0
  95. package/dist/_chunks/pt-BR-WNOhafR4.js.map +1 -0
  96. package/dist/_chunks/pt-BR-sS1Xp3Jt.mjs +44 -0
  97. package/dist/_chunks/pt-BR-sS1Xp3Jt.mjs.map +1 -0
  98. package/dist/_chunks/pt-Rf9W51IO.mjs +48 -0
  99. package/dist/_chunks/pt-Rf9W51IO.mjs.map +1 -0
  100. package/dist/_chunks/pt-guNR9Gax.js +48 -0
  101. package/dist/_chunks/pt-guNR9Gax.js.map +1 -0
  102. package/dist/_chunks/ru-X3BMXDds.js +86 -0
  103. package/dist/_chunks/ru-X3BMXDds.js.map +1 -0
  104. package/dist/_chunks/ru-qKHnd5or.mjs +86 -0
  105. package/dist/_chunks/ru-qKHnd5or.mjs.map +1 -0
  106. package/dist/_chunks/sk-NWPw1oTN.js +50 -0
  107. package/dist/_chunks/sk-NWPw1oTN.js.map +1 -0
  108. package/dist/_chunks/sk-_Ryr-eTT.mjs +50 -0
  109. package/dist/_chunks/sk-_Ryr-eTT.mjs.map +1 -0
  110. package/dist/_chunks/sv-76NnbB__.js +86 -0
  111. package/dist/_chunks/sv-76NnbB__.js.map +1 -0
  112. package/dist/_chunks/sv-BqzScFXS.mjs +86 -0
  113. package/dist/_chunks/sv-BqzScFXS.mjs.map +1 -0
  114. package/dist/_chunks/th-WsknMEpq.mjs +60 -0
  115. package/dist/_chunks/th-WsknMEpq.mjs.map +1 -0
  116. package/dist/_chunks/th-cbppX21D.js +60 -0
  117. package/dist/_chunks/th-cbppX21D.js.map +1 -0
  118. package/dist/_chunks/tr-6mm_Fmz7.js +85 -0
  119. package/dist/_chunks/tr-6mm_Fmz7.js.map +1 -0
  120. package/dist/_chunks/tr-_DB1F1GW.mjs +85 -0
  121. package/dist/_chunks/tr-_DB1F1GW.mjs.map +1 -0
  122. package/dist/_chunks/uk-sI2I1ogF.js +49 -0
  123. package/dist/_chunks/uk-sI2I1ogF.js.map +1 -0
  124. package/dist/_chunks/uk-yxMSQAwI.mjs +49 -0
  125. package/dist/_chunks/uk-yxMSQAwI.mjs.map +1 -0
  126. package/dist/_chunks/vi-A3zJxaiI.js +50 -0
  127. package/dist/_chunks/vi-A3zJxaiI.js.map +1 -0
  128. package/dist/_chunks/vi-xY0zCW3d.mjs +50 -0
  129. package/dist/_chunks/vi-xY0zCW3d.mjs.map +1 -0
  130. package/dist/_chunks/zh-72SpmFXa.js +86 -0
  131. package/dist/_chunks/zh-72SpmFXa.js.map +1 -0
  132. package/dist/_chunks/zh-Hans-ArWWtyP4.js +86 -0
  133. package/dist/_chunks/zh-Hans-ArWWtyP4.js.map +1 -0
  134. package/dist/_chunks/zh-Hans-E84cu4kP.mjs +86 -0
  135. package/dist/_chunks/zh-Hans-E84cu4kP.mjs.map +1 -0
  136. package/dist/_chunks/zh-OFeldzbX.mjs +86 -0
  137. package/dist/_chunks/zh-OFeldzbX.mjs.map +1 -0
  138. package/dist/admin/index.js +5 -0
  139. package/dist/admin/index.js.map +1 -0
  140. package/dist/admin/index.mjs +6 -0
  141. package/dist/admin/index.mjs.map +1 -0
  142. package/documentation/content-api.yaml +1 -1
  143. package/jest.config.front.js +1 -1
  144. package/package.json +37 -17
  145. package/packup.config.ts +22 -0
  146. package/server/bootstrap/grant-config.js +9 -0
  147. package/server/bootstrap/index.js +36 -0
  148. package/server/controllers/auth.js +51 -14
  149. package/server/controllers/user.js +12 -1
  150. package/server/middlewares/rateLimit.js +41 -21
  151. package/server/services/providers-registry.js +15 -0
  152. package/.eslintrc.js +0 -14
  153. package/admin/src/hooks/index.js +0 -5
  154. package/admin/src/hooks/useFetchRole/index.js +0 -67
  155. package/admin/src/hooks/useFetchRole/reducer.js +0 -31
  156. package/admin/src/hooks/useForm/index.js +0 -70
  157. package/admin/src/hooks/useForm/reducer.js +0 -40
  158. package/admin/src/hooks/useRolesList/index.js +0 -65
  159. package/admin/src/hooks/useRolesList/init.js +0 -5
  160. package/admin/src/hooks/useRolesList/reducer.js +0 -31
  161. package/admin/src/pages/AdvancedSettings/utils/api.js +0 -18
  162. package/admin/src/pages/EmailTemplates/utils/api.js +0 -18
  163. package/admin/src/pages/Providers/reducer.js +0 -54
  164. package/admin/src/pages/Providers/utils/api.js +0 -26
  165. package/admin/src/pages/Providers/utils/createProvidersArray.js +0 -21
  166. package/admin/src/pages/Roles/CreatePage.js +0 -185
  167. package/admin/src/pages/Roles/EditPage.js +0 -197
  168. package/admin/src/pages/Roles/ProtectedCreatePage.js +0 -15
  169. package/admin/src/pages/Roles/ProtectedEditPage.js +0 -15
  170. package/admin/src/pages/Roles/ProtectedListPage.js +0 -17
  171. package/admin/src/pages/Roles/index.js +0 -30
  172. package/admin/src/utils/getRequestURL.js +0 -5
  173. package/strapi-admin.js +0 -3
  174. /package/admin/src/components/BoundRoute/{index.js → index.jsx} +0 -0
  175. /package/admin/src/components/FormModal/Input/{index.js → index.jsx} +0 -0
  176. /package/admin/src/components/FormModal/{index.js → index.jsx} +0 -0
  177. /package/admin/src/components/Permissions/PermissionRow/{CheckboxWrapper.js → CheckboxWrapper.jsx} +0 -0
  178. /package/admin/src/components/Permissions/PermissionRow/{SubCategory.js → SubCategory.jsx} +0 -0
  179. /package/admin/src/components/Permissions/PermissionRow/{index.js → index.jsx} +0 -0
  180. /package/admin/src/components/Policies/{index.js → index.jsx} +0 -0
  181. /package/admin/src/components/UsersPermissions/{index.js → index.jsx} +0 -0
  182. /package/admin/src/contexts/UsersPermissionsContext/{index.js → index.jsx} +0 -0
  183. /package/admin/src/pages/EmailTemplates/components/{EmailForm.js → EmailForm.jsx} +0 -0
  184. /package/admin/src/pages/EmailTemplates/components/{EmailTable.js → EmailTable.jsx} +0 -0
package/.eslintignore CHANGED
@@ -1,2 +1 @@
1
- node_modules/
2
- .eslintrc.js
1
+ dist
package/.eslintrc ADDED
@@ -0,0 +1,17 @@
1
+ {
2
+ "root": true,
3
+ "overrides": [
4
+ {
5
+ "files": ["admin/**/*"],
6
+ "extends": ["custom/front"],
7
+ "rules": {
8
+ "import/extensions": "off"
9
+ }
10
+ },
11
+ {
12
+ "files": ["**/*"],
13
+ "excludedFiles": ["admin/**/*"],
14
+ "extends": ["custom/back"]
15
+ }
16
+ ]
17
+ }
@@ -1,6 +1,6 @@
1
1
  import React, { useReducer } from 'react';
2
2
 
3
- import { Accordion, AccordionContent, AccordionToggle, Box, Flex } from '@strapi/design-system';
3
+ import { Accordion, AccordionContent, AccordionToggle, Flex } from '@strapi/design-system';
4
4
  import { useIntl } from 'react-intl';
5
5
 
6
6
  import { useUsersPermissions } from '../../contexts/UsersPermissionsContext';
@@ -44,9 +44,7 @@ const Permissions = () => {
44
44
  variant={index % 2 ? 'primary' : 'secondary'}
45
45
  />
46
46
  <AccordionContent>
47
- <Box>
48
- <PermissionRow permissions={modifiedData[collapse.name]} name={collapse.name} />
49
- </Box>
47
+ <PermissionRow permissions={modifiedData[collapse.name]} name={collapse.name} />
50
48
  </AccordionContent>
51
49
  </Accordion>
52
50
  ))}
@@ -1,4 +1,4 @@
1
- const pluginPermissions = {
1
+ export const PERMISSIONS = {
2
2
  // Roles
3
3
  accessRoles: [
4
4
  { action: 'plugin::users-permissions.roles.create', subject: null },
@@ -27,5 +27,3 @@ const pluginPermissions = {
27
27
  readProviders: [{ action: 'plugin::users-permissions.providers.read', subject: null }],
28
28
  updateProviders: [{ action: 'plugin::users-permissions.providers.update', subject: null }],
29
29
  };
30
-
31
- export default pluginPermissions;
@@ -8,8 +8,7 @@ import { prefixPluginTranslations } from '@strapi/helper-plugin';
8
8
 
9
9
  import pluginPkg from '../../package.json';
10
10
 
11
- import pluginPermissions from './permissions';
12
- import pluginId from './pluginId';
11
+ import { PERMISSIONS } from './constants';
13
12
  import getTrad from './utils/getTrad';
14
13
 
15
14
  const name = pluginPkg.strapi.name;
@@ -19,7 +18,7 @@ export default {
19
18
  // Create the plugin's settings section
20
19
  app.createSettingSection(
21
20
  {
22
- id: pluginId,
21
+ id: 'users-permissions',
23
22
  intlLabel: {
24
23
  id: getTrad('Settings.section-label'),
25
24
  defaultMessage: 'Users & Permissions plugin',
@@ -32,15 +31,13 @@ export default {
32
31
  defaultMessage: 'Roles',
33
32
  },
34
33
  id: 'roles',
35
- to: `/settings/${pluginId}/roles`,
34
+ to: `/settings/users-permissions/roles`,
36
35
  async Component() {
37
- const component = await import(
38
- /* webpackChunkName: "users-roles-settings-page" */ './pages/Roles'
39
- );
36
+ const component = await import('./pages/Roles');
40
37
 
41
38
  return component;
42
39
  },
43
- permissions: pluginPermissions.accessRoles,
40
+ permissions: PERMISSIONS.accessRoles,
44
41
  },
45
42
  {
46
43
  intlLabel: {
@@ -48,15 +45,13 @@ export default {
48
45
  defaultMessage: 'Providers',
49
46
  },
50
47
  id: 'providers',
51
- to: `/settings/${pluginId}/providers`,
48
+ to: `/settings/users-permissions/providers`,
52
49
  async Component() {
53
- const component = await import(
54
- /* webpackChunkName: "users-providers-settings-page" */ './pages/Providers'
55
- );
50
+ const component = await import('./pages/Providers');
56
51
 
57
52
  return component;
58
53
  },
59
- permissions: pluginPermissions.readProviders,
54
+ permissions: PERMISSIONS.readProviders,
60
55
  },
61
56
  {
62
57
  intlLabel: {
@@ -64,15 +59,13 @@ export default {
64
59
  defaultMessage: 'Email templates',
65
60
  },
66
61
  id: 'email-templates',
67
- to: `/settings/${pluginId}/email-templates`,
62
+ to: `/settings/users-permissions/email-templates`,
68
63
  async Component() {
69
- const component = await import(
70
- /* webpackChunkName: "users-email-settings-page" */ './pages/EmailTemplates'
71
- );
64
+ const component = await import('./pages/EmailTemplates');
72
65
 
73
66
  return component;
74
67
  },
75
- permissions: pluginPermissions.readEmailTemplates,
68
+ permissions: PERMISSIONS.readEmailTemplates,
76
69
  },
77
70
  {
78
71
  intlLabel: {
@@ -80,21 +73,19 @@ export default {
80
73
  defaultMessage: 'Advanced Settings',
81
74
  },
82
75
  id: 'advanced-settings',
83
- to: `/settings/${pluginId}/advanced-settings`,
76
+ to: `/settings/users-permissions/advanced-settings`,
84
77
  async Component() {
85
- const component = await import(
86
- /* webpackChunkName: "users-advanced-settings-page" */ './pages/AdvancedSettings'
87
- );
78
+ const component = await import('./pages/AdvancedSettings');
88
79
 
89
80
  return component;
90
81
  },
91
- permissions: pluginPermissions.readAdvancedSettings,
82
+ permissions: PERMISSIONS.readAdvancedSettings,
92
83
  },
93
84
  ]
94
85
  );
95
86
 
96
87
  app.registerPlugin({
97
- id: pluginId,
88
+ id: 'users-permissions',
98
89
  name,
99
90
  });
100
91
  },
@@ -102,12 +93,10 @@ export default {
102
93
  async registerTrads({ locales }) {
103
94
  const importedTrads = await Promise.all(
104
95
  locales.map((locale) => {
105
- return import(
106
- /* webpackChunkName: "users-permissions-translation-[request]" */ `./translations/${locale}.json`
107
- )
96
+ return import(`./translations/${locale}.json`)
108
97
  .then(({ default: data }) => {
109
98
  return {
110
- data: prefixPluginTranslations(data, pluginId),
99
+ data: prefixPluginTranslations(data, 'users-permissions'),
111
100
  locale,
112
101
  };
113
102
  })
@@ -1,4 +1,4 @@
1
- import React, { useMemo } from 'react';
1
+ import React from 'react';
2
2
 
3
3
  import {
4
4
  Box,
@@ -20,6 +20,8 @@ import {
20
20
  GenericInput,
21
21
  LoadingIndicatorPage,
22
22
  SettingsPageTitle,
23
+ useAPIErrorHandler,
24
+ useFetchClient,
23
25
  useFocusWhenNavigate,
24
26
  useNotification,
25
27
  useOverlayBlocker,
@@ -30,15 +32,14 @@ import { Formik } from 'formik';
30
32
  import { useIntl } from 'react-intl';
31
33
  import { useMutation, useQuery, useQueryClient } from 'react-query';
32
34
 
33
- import pluginPermissions from '../../permissions';
35
+ import { PERMISSIONS } from '../../constants';
34
36
  import { getTrad } from '../../utils';
35
37
 
36
- import { fetchData, putAdvancedSettings } from './utils/api';
37
38
  import layout from './utils/layout';
38
39
  import schema from './utils/schema';
39
40
 
40
41
  const ProtectedAdvancedSettingsPage = () => (
41
- <CheckPagePermissions permissions={pluginPermissions.readAdvancedSettings}>
42
+ <CheckPagePermissions permissions={PERMISSIONS.readAdvancedSettings}>
42
43
  <AdvancedSettingsPage />
43
44
  </CheckPagePermissions>
44
45
  );
@@ -49,39 +50,47 @@ const AdvancedSettingsPage = () => {
49
50
  const { lockApp, unlockApp } = useOverlayBlocker();
50
51
  const { notifyStatus } = useNotifyAT();
51
52
  const queryClient = useQueryClient();
53
+ const { get, put } = useFetchClient();
54
+ const { formatAPIError } = useAPIErrorHandler();
55
+
52
56
  useFocusWhenNavigate();
53
57
 
54
- const updatePermissions = useMemo(
55
- () => ({ update: pluginPermissions.updateAdvancedSettings }),
56
- []
57
- );
58
58
  const {
59
59
  isLoading: isLoadingForPermissions,
60
60
  allowedActions: { canUpdate },
61
- } = useRBAC(updatePermissions);
62
-
63
- const { status: isLoadingData, data } = useQuery('advanced', () => fetchData(), {
64
- onSuccess() {
65
- notifyStatus(
66
- formatMessage({
67
- id: getTrad('Form.advancedSettings.data.loaded'),
68
- defaultMessage: 'Advanced settings data has been loaded',
69
- })
70
- );
71
- },
72
- onError() {
73
- toggleNotification({
74
- type: 'warning',
75
- message: { id: getTrad('notification.error'), defaultMessage: 'An error occured' },
76
- });
61
+ } = useRBAC({ update: PERMISSIONS.updateAdvancedSettings });
62
+
63
+ const { isLoading: isLoadingData, data } = useQuery(
64
+ ['users-permissions', 'advanced'],
65
+ async () => {
66
+ const { data } = await get('/users-permissions/advanced');
67
+
68
+ return data;
77
69
  },
78
- });
70
+ {
71
+ onSuccess() {
72
+ notifyStatus(
73
+ formatMessage({
74
+ id: getTrad('Form.advancedSettings.data.loaded'),
75
+ defaultMessage: 'Advanced settings data has been loaded',
76
+ })
77
+ );
78
+ },
79
+ onError() {
80
+ toggleNotification({
81
+ type: 'warning',
82
+ message: { id: getTrad('notification.error'), defaultMessage: 'An error occured' },
83
+ });
84
+ },
85
+ }
86
+ );
79
87
 
80
- const isLoading = isLoadingForPermissions || isLoadingData !== 'success';
88
+ const isLoading = isLoadingForPermissions || isLoadingData;
81
89
 
82
- const submitMutation = useMutation((body) => putAdvancedSettings(body), {
90
+ const submitMutation = useMutation((body) => put('/users-permissions/advanced', body), {
83
91
  async onSuccess() {
84
- await queryClient.invalidateQueries('advanced');
92
+ await queryClient.invalidateQueries(['users-permissions', 'advanced']);
93
+
85
94
  toggleNotification({
86
95
  type: 'success',
87
96
  message: { id: getTrad('notification.success.saved'), defaultMessage: 'Saved' },
@@ -89,11 +98,12 @@ const AdvancedSettingsPage = () => {
89
98
 
90
99
  unlockApp();
91
100
  },
92
- onError() {
101
+ onError(error) {
93
102
  toggleNotification({
94
103
  type: 'warning',
95
- message: { id: getTrad('notification.error'), defaultMessage: 'An error occured' },
104
+ message: formatAPIError(error),
96
105
  });
106
+
97
107
  unlockApp();
98
108
  },
99
109
  refetchActive: true,
@@ -104,9 +114,12 @@ const AdvancedSettingsPage = () => {
104
114
  const handleSubmit = async (body) => {
105
115
  lockApp();
106
116
 
107
- const urlConfirmation = body.email_confirmation ? body.email_confirmation_redirection : '';
108
-
109
- await submitMutation.mutateAsync({ ...body, email_confirmation_redirection: urlConfirmation });
117
+ submitMutation.mutate({
118
+ ...body,
119
+ email_confirmation_redirection: body.email_confirmation
120
+ ? body.email_confirmation_redirection
121
+ : '',
122
+ });
110
123
  };
111
124
 
112
125
  if (isLoading) {
@@ -146,7 +159,7 @@ const AdvancedSettingsPage = () => {
146
159
  validationSchema={schema}
147
160
  enableReinitialize
148
161
  >
149
- {({ errors, values, handleChange, isSubmitting }) => {
162
+ {({ errors, values, handleChange, isSubmitting, dirty }) => {
150
163
  return (
151
164
  <Form>
152
165
  <HeaderLayout
@@ -158,7 +171,7 @@ const AdvancedSettingsPage = () => {
158
171
  <Button
159
172
  loading={isSubmitting}
160
173
  type="submit"
161
- disabled={!canUpdate}
174
+ disabled={canUpdate ? !dirty : !canUpdate}
162
175
  startIcon={<Check />}
163
176
  size="S"
164
177
  >
@@ -1,10 +1,12 @@
1
- import React, { useMemo, useRef, useState } from 'react';
1
+ import * as React from 'react';
2
2
 
3
3
  import { ContentLayout, HeaderLayout, Main, useNotifyAT } from '@strapi/design-system';
4
4
  import {
5
5
  CheckPagePermissions,
6
6
  LoadingIndicatorPage,
7
7
  SettingsPageTitle,
8
+ useAPIErrorHandler,
9
+ useFetchClient,
8
10
  useFocusWhenNavigate,
9
11
  useNotification,
10
12
  useOverlayBlocker,
@@ -14,15 +16,14 @@ import {
14
16
  import { useIntl } from 'react-intl';
15
17
  import { useMutation, useQuery, useQueryClient } from 'react-query';
16
18
 
17
- import pluginPermissions from '../../permissions';
19
+ import { PERMISSIONS } from '../../constants';
18
20
  import { getTrad } from '../../utils';
19
21
 
20
22
  import EmailForm from './components/EmailForm';
21
23
  import EmailTable from './components/EmailTable';
22
- import { fetchData, putEmailTemplate } from './utils/api';
23
24
 
24
25
  const ProtectedEmailTemplatesPage = () => (
25
- <CheckPagePermissions permissions={pluginPermissions.readEmailTemplates}>
26
+ <CheckPagePermissions permissions={PERMISSIONS.readEmailTemplates}>
26
27
  <EmailTemplatesPage />
27
28
  </CheckPagePermissions>
28
29
  );
@@ -33,40 +34,46 @@ const EmailTemplatesPage = () => {
33
34
  const { notifyStatus } = useNotifyAT();
34
35
  const toggleNotification = useNotification();
35
36
  const { lockApp, unlockApp } = useOverlayBlocker();
36
- const trackUsageRef = useRef(trackUsage);
37
37
  const queryClient = useQueryClient();
38
- useFocusWhenNavigate();
38
+ const { get, put } = useFetchClient();
39
+ const { formatAPIError } = useAPIErrorHandler();
39
40
 
40
- const [isModalOpen, setIsModalOpen] = useState(false);
41
- const [templateToEdit, setTemplateToEdit] = useState(null);
41
+ useFocusWhenNavigate();
42
42
 
43
- const updatePermissions = useMemo(() => {
44
- return { update: pluginPermissions.updateEmailTemplates };
45
- }, []);
43
+ const [isModalOpen, setIsModalOpen] = React.useState(false);
44
+ const [templateToEdit, setTemplateToEdit] = React.useState(null);
46
45
 
47
46
  const {
48
47
  isLoading: isLoadingForPermissions,
49
48
  allowedActions: { canUpdate },
50
- } = useRBAC(updatePermissions);
51
-
52
- const { status: isLoadingData, data } = useQuery('email-templates', () => fetchData(), {
53
- onSuccess() {
54
- notifyStatus(
55
- formatMessage({
56
- id: getTrad('Email.template.data.loaded'),
57
- defaultMessage: 'Email templates has been loaded',
58
- })
59
- );
60
- },
61
- onError() {
62
- toggleNotification({
63
- type: 'warning',
64
- message: { id: 'notification.error', defaultMessage: 'An error occured' },
65
- });
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;
66
57
  },
67
- });
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
+ );
68
75
 
69
- const isLoading = isLoadingForPermissions || isLoadingData !== 'success';
76
+ const isLoading = isLoadingForPermissions || isLoadingData;
70
77
 
71
78
  const handleToggle = () => {
72
79
  setIsModalOpen((prev) => !prev);
@@ -77,34 +84,38 @@ const EmailTemplatesPage = () => {
77
84
  handleToggle();
78
85
  };
79
86
 
80
- const submitMutation = useMutation((body) => putEmailTemplate({ 'email-templates': body }), {
81
- async onSuccess() {
82
- await queryClient.invalidateQueries('email-templates');
83
-
84
- toggleNotification({
85
- type: 'success',
86
- message: { id: 'notification.success.saved', defaultMessage: 'Saved' },
87
- });
88
-
89
- trackUsageRef.current('didEditEmailTemplates');
90
-
91
- unlockApp();
92
- handleToggle();
93
- },
94
- onError() {
95
- toggleNotification({
96
- type: 'warning',
97
- message: { id: 'notification.error', defaultMessage: 'An error occured' },
98
- });
99
- unlockApp();
100
- },
101
- refetchActive: true,
102
- });
103
- 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
+ );
104
114
 
105
115
  const handleSubmit = (body) => {
106
116
  lockApp();
107
- trackUsageRef.current('willEditEmailTemplates');
117
+
118
+ trackUsage('willEditEmailTemplates');
108
119
 
109
120
  const editedTemplates = { ...data, [templateToEdit]: body };
110
121
  submitMutation.mutate(editedTemplates);
@@ -133,7 +144,7 @@ const EmailTemplatesPage = () => {
133
144
  }
134
145
 
135
146
  return (
136
- <Main aria-busy={isSubmittingForm}>
147
+ <Main aria-busy={submitMutation.isLoading}>
137
148
  <SettingsPageTitle
138
149
  name={formatMessage({
139
150
  id: getTrad('HeaderNav.link.emailTemplates'),