@strapi/plugin-users-permissions 4.0.0-next.9 → 4.0.0

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 (177) hide show
  1. package/admin/src/components/BoundRoute/getMethodColor.js +41 -0
  2. package/admin/src/components/BoundRoute/index.js +40 -24
  3. package/admin/src/components/FormModal/Input/index.js +121 -0
  4. package/admin/src/components/FormModal/index.js +123 -0
  5. package/admin/src/components/Permissions/PermissionRow/CheckboxWrapper.js +19 -26
  6. package/admin/src/components/Permissions/PermissionRow/SubCategory.js +118 -0
  7. package/admin/src/components/Permissions/PermissionRow/index.js +9 -48
  8. package/admin/src/components/Permissions/index.js +36 -24
  9. package/admin/src/components/Permissions/init.js +1 -6
  10. package/admin/src/components/Policies/index.js +46 -47
  11. package/admin/src/components/UsersPermissions/index.js +29 -26
  12. package/admin/src/components/UsersPermissions/init.js +1 -2
  13. package/admin/src/hooks/useFetchRole/index.js +17 -7
  14. package/admin/src/hooks/useForm/index.js +3 -29
  15. package/admin/src/hooks/useForm/reducer.js +2 -21
  16. package/admin/src/hooks/usePlugins/index.js +12 -21
  17. package/admin/src/hooks/usePlugins/reducer.js +0 -3
  18. package/admin/src/index.js +0 -8
  19. package/admin/src/pages/AdvancedSettings/index.js +203 -193
  20. package/admin/src/pages/AdvancedSettings/utils/api.js +13 -0
  21. package/admin/src/pages/AdvancedSettings/utils/layout.js +96 -0
  22. package/admin/src/pages/AdvancedSettings/utils/schema.js +22 -0
  23. package/admin/src/pages/EmailTemplates/components/EmailForm.js +173 -0
  24. package/admin/src/pages/EmailTemplates/components/EmailTable.js +116 -0
  25. package/admin/src/pages/EmailTemplates/index.js +117 -197
  26. package/admin/src/pages/EmailTemplates/utils/api.js +13 -0
  27. package/admin/src/pages/Providers/index.js +206 -221
  28. package/admin/src/pages/Providers/utils/api.js +21 -0
  29. package/admin/src/pages/Providers/utils/forms.js +168 -126
  30. package/admin/src/pages/Roles/CreatePage/index.js +155 -147
  31. package/admin/src/pages/Roles/EditPage/index.js +162 -134
  32. package/admin/src/pages/Roles/ListPage/components/TableBody.js +96 -0
  33. package/admin/src/pages/Roles/ListPage/index.js +176 -156
  34. package/admin/src/pages/Roles/ListPage/utils/api.js +28 -0
  35. package/admin/src/translations/ar.json +0 -8
  36. package/admin/src/translations/cs.json +0 -8
  37. package/admin/src/translations/de.json +0 -8
  38. package/admin/src/translations/dk.json +0 -8
  39. package/admin/src/translations/en.json +33 -12
  40. package/admin/src/translations/es.json +0 -8
  41. package/admin/src/translations/fr.json +0 -8
  42. package/admin/src/translations/id.json +0 -8
  43. package/admin/src/translations/it.json +0 -8
  44. package/admin/src/translations/ja.json +0 -8
  45. package/admin/src/translations/ko.json +0 -8
  46. package/admin/src/translations/ms.json +0 -8
  47. package/admin/src/translations/nl.json +0 -8
  48. package/admin/src/translations/pl.json +0 -8
  49. package/admin/src/translations/pt-BR.json +0 -8
  50. package/admin/src/translations/pt.json +0 -8
  51. package/admin/src/translations/ru.json +0 -8
  52. package/admin/src/translations/sk.json +0 -8
  53. package/admin/src/translations/sv.json +0 -8
  54. package/admin/src/translations/th.json +0 -8
  55. package/admin/src/translations/tr.json +0 -8
  56. package/admin/src/translations/uk.json +0 -8
  57. package/admin/src/translations/vi.json +0 -8
  58. package/admin/src/translations/zh-Hans.json +5 -14
  59. package/admin/src/translations/zh.json +0 -8
  60. package/admin/src/utils/axiosInstance.js +36 -0
  61. package/admin/src/utils/formatPluginName.js +26 -0
  62. package/admin/src/utils/index.js +1 -0
  63. package/documentation/1.0.0/overrides/users-permissions-Role.json +6 -6
  64. package/documentation/1.0.0/overrides/users-permissions-User.json +7 -7
  65. package/package.json +30 -31
  66. package/server/bootstrap/index.js +19 -21
  67. package/server/config.js +3 -3
  68. package/server/content-types/index.js +3 -3
  69. package/server/content-types/permission/index.js +30 -3
  70. package/server/content-types/role/index.js +47 -3
  71. package/server/content-types/user/index.js +65 -4
  72. package/server/controllers/auth.js +81 -244
  73. package/server/controllers/content-manager-user.js +183 -0
  74. package/server/controllers/index.js +12 -6
  75. package/server/controllers/permissions.js +26 -0
  76. package/server/controllers/role.js +77 -0
  77. package/server/controllers/settings.js +85 -0
  78. package/server/controllers/user.js +118 -44
  79. package/server/controllers/validation/auth.js +29 -0
  80. package/server/controllers/validation/user.js +38 -0
  81. package/server/graphql/index.js +44 -0
  82. package/server/graphql/mutations/auth/email-confirmation.js +39 -0
  83. package/server/graphql/mutations/auth/forgot-password.js +38 -0
  84. package/server/graphql/mutations/auth/login.js +38 -0
  85. package/server/graphql/mutations/auth/register.js +39 -0
  86. package/server/graphql/mutations/auth/reset-password.js +41 -0
  87. package/server/graphql/mutations/crud/role/create-role.js +37 -0
  88. package/server/graphql/mutations/crud/role/delete-role.js +28 -0
  89. package/server/graphql/mutations/crud/role/update-role.js +38 -0
  90. package/server/graphql/mutations/crud/user/create-user.js +48 -0
  91. package/server/graphql/mutations/crud/user/delete-user.js +42 -0
  92. package/server/graphql/mutations/crud/user/update-user.js +49 -0
  93. package/server/graphql/mutations/index.js +42 -0
  94. package/server/graphql/queries/index.js +13 -0
  95. package/server/graphql/queries/me.js +17 -0
  96. package/server/graphql/resolvers-configs.js +37 -0
  97. package/server/graphql/types/create-role-payload.js +11 -0
  98. package/server/graphql/types/delete-role-payload.js +11 -0
  99. package/server/graphql/types/index.js +21 -0
  100. package/server/graphql/types/login-input.js +13 -0
  101. package/server/graphql/types/login-payload.js +12 -0
  102. package/server/graphql/types/me-role.js +14 -0
  103. package/server/graphql/types/me.js +16 -0
  104. package/server/graphql/types/password-payload.js +11 -0
  105. package/server/graphql/types/register-input.js +13 -0
  106. package/server/graphql/types/update-role-payload.js +11 -0
  107. package/server/graphql/utils.js +27 -0
  108. package/server/index.js +21 -0
  109. package/server/middlewares/index.js +2 -2
  110. package/server/{policies → middlewares}/rateLimit.js +3 -7
  111. package/server/register.js +11 -0
  112. package/server/routes/admin/index.js +10 -0
  113. package/server/routes/admin/permissions.js +20 -0
  114. package/server/routes/admin/role.js +79 -0
  115. package/server/routes/admin/settings.js +95 -0
  116. package/server/routes/content-api/auth.js +73 -0
  117. package/server/routes/content-api/index.js +11 -0
  118. package/server/routes/content-api/permissions.js +9 -0
  119. package/server/routes/content-api/role.js +29 -0
  120. package/server/routes/content-api/user.js +61 -0
  121. package/server/routes/index.js +4 -428
  122. package/server/services/index.js +10 -8
  123. package/server/services/jwt.js +9 -17
  124. package/server/services/providers.js +32 -33
  125. package/server/services/role.js +177 -0
  126. package/server/services/user.js +9 -15
  127. package/server/services/users-permissions.js +140 -338
  128. package/server/strategies/users-permissions.js +123 -0
  129. package/server/utils/index.d.ts +2 -0
  130. package/strapi-admin.js +3 -0
  131. package/strapi-server.js +1 -19
  132. package/admin/src/assets/images/logo.svg +0 -1
  133. package/admin/src/components/BaselineAlignement/index.js +0 -33
  134. package/admin/src/components/Bloc/index.js +0 -10
  135. package/admin/src/components/BoundRoute/Components.js +0 -78
  136. package/admin/src/components/ContainerFluid/index.js +0 -13
  137. package/admin/src/components/FormBloc/index.js +0 -61
  138. package/admin/src/components/IntlInput/index.js +0 -38
  139. package/admin/src/components/ListBaselineAlignment/index.js +0 -8
  140. package/admin/src/components/ListRow/Components.js +0 -74
  141. package/admin/src/components/ListRow/index.js +0 -35
  142. package/admin/src/components/ModalForm/Wrapper.js +0 -12
  143. package/admin/src/components/ModalForm/index.js +0 -59
  144. package/admin/src/components/Permissions/ListWrapper.js +0 -9
  145. package/admin/src/components/Permissions/PermissionRow/BaselineAlignment.js +0 -7
  146. package/admin/src/components/Permissions/PermissionRow/RowStyle.js +0 -28
  147. package/admin/src/components/Permissions/PermissionRow/SubCategory/ConditionsButtonWrapper.js +0 -13
  148. package/admin/src/components/Permissions/PermissionRow/SubCategory/PolicyWrapper.js +0 -8
  149. package/admin/src/components/Permissions/PermissionRow/SubCategory/SubCategoryWrapper.js +0 -26
  150. package/admin/src/components/Permissions/PermissionRow/SubCategory/index.js +0 -116
  151. package/admin/src/components/Policies/Components.js +0 -26
  152. package/admin/src/components/PrefixedIcon/index.js +0 -27
  153. package/admin/src/components/Roles/EmptyRole/BaselineAlignment.js +0 -7
  154. package/admin/src/components/Roles/EmptyRole/index.js +0 -27
  155. package/admin/src/components/Roles/RoleListWrapper/index.js +0 -17
  156. package/admin/src/components/Roles/RoleRow/RoleDescription.js +0 -9
  157. package/admin/src/components/Roles/RoleRow/index.js +0 -45
  158. package/admin/src/components/Roles/index.js +0 -3
  159. package/admin/src/components/SizedInput/index.js +0 -24
  160. package/admin/src/pages/AdvancedSettings/reducer.js +0 -65
  161. package/admin/src/pages/AdvancedSettings/utils/form.js +0 -52
  162. package/admin/src/pages/EmailTemplates/CustomTextInput.js +0 -105
  163. package/admin/src/pages/EmailTemplates/Wrapper.js +0 -36
  164. package/admin/src/pages/EmailTemplates/reducer.js +0 -58
  165. package/admin/src/pages/EmailTemplates/utils/forms.js +0 -81
  166. package/admin/src/pages/Roles/ListPage/BaselineAlignment.js +0 -8
  167. package/server/content-types/permission/schema.json +0 -48
  168. package/server/content-types/role/schema.json +0 -46
  169. package/server/content-types/user/schema.json +0 -66
  170. package/server/controllers/user/admin.js +0 -230
  171. package/server/controllers/user/api.js +0 -174
  172. package/server/controllers/users-permissions.js +0 -271
  173. package/server/middlewares/users-permissions.js +0 -44
  174. package/server/policies/index.js +0 -11
  175. package/server/policies/isAuthenticated.js +0 -9
  176. package/server/policies/permissions.js +0 -94
  177. package/server/schema.graphql.js +0 -317
@@ -1,44 +1,56 @@
1
- import React, { memo, useCallback, useReducer } from 'react';
2
- import { Padded } from '@buffetjs/core';
1
+ import React, { useReducer } from 'react';
2
+ import { Accordion, AccordionToggle, AccordionContent } from '@strapi/design-system/Accordion';
3
+ import { useIntl } from 'react-intl';
4
+ import { Box } from '@strapi/design-system/Box';
5
+ import { Stack } from '@strapi/design-system/Stack';
3
6
  import { useUsersPermissions } from '../../contexts/UsersPermissionsContext';
4
- import ListWrapper from './ListWrapper';
7
+ import formatPluginName from '../../utils/formatPluginName';
5
8
  import PermissionRow from './PermissionRow';
6
9
  import init from './init';
7
10
  import { initialState, reducer } from './reducer';
8
11
 
9
12
  const Permissions = () => {
10
13
  const { modifiedData } = useUsersPermissions();
14
+ const { formatMessage } = useIntl();
11
15
  const [{ collapses }, dispatch] = useReducer(reducer, initialState, state =>
12
16
  init(state, modifiedData)
13
17
  );
14
18
 
15
- const handleOpenPlugin = useCallback(index => {
19
+ const handleToggle = index =>
16
20
  dispatch({
17
21
  type: 'TOGGLE_COLLAPSE',
18
22
  index,
19
23
  });
20
- }, []);
21
24
 
22
25
  return (
23
- <ListWrapper>
24
- <Padded left right size="sm">
25
- {collapses.map((_, index) => {
26
- const { isOpen, name } = collapses[index];
27
-
28
- return (
29
- <PermissionRow
30
- key={name}
31
- isOpen={isOpen}
32
- isWhite={index % 2 === 1}
33
- name={name}
34
- onOpenPlugin={() => handleOpenPlugin(index)}
35
- permissions={modifiedData[name]}
36
- />
37
- );
38
- })}
39
- </Padded>
40
- </ListWrapper>
26
+ <Stack size={1}>
27
+ {collapses.map((collapse, index) => (
28
+ <Accordion
29
+ expanded={collapse.isOpen}
30
+ toggle={() => handleToggle(index)}
31
+ key={collapse.name}
32
+ variant={index % 2 === 0 ? 'secondary' : undefined}
33
+ >
34
+ <AccordionToggle
35
+ title={formatPluginName(collapse.name)}
36
+ description={formatMessage(
37
+ {
38
+ id: 'users-permissions.Plugin.permissions.plugins.description',
39
+ defaultMessage: 'Define all allowed actions for the {name} plugin.',
40
+ },
41
+ { name: collapse.name }
42
+ )}
43
+ variant={index % 2 ? 'primary' : 'secondary'}
44
+ />
45
+ <AccordionContent>
46
+ <Box>
47
+ <PermissionRow permissions={modifiedData[collapse.name]} name={collapse.name} />
48
+ </Box>
49
+ </AccordionContent>
50
+ </Accordion>
51
+ ))}
52
+ </Stack>
41
53
  );
42
54
  };
43
55
 
44
- export default memo(Permissions);
56
+ export default Permissions;
@@ -1,12 +1,7 @@
1
1
  const init = (initialState, permissions) => {
2
2
  const collapses = Object.keys(permissions)
3
3
  .sort()
4
- .reduce((acc, current, index) => {
5
- return acc.concat({
6
- name: current,
7
- isOpen: index === 0,
8
- });
9
- }, []);
4
+ .map(name => ({ name, isOpen: false }));
10
5
 
11
6
  return { ...initialState, collapses };
12
7
  };
@@ -1,60 +1,59 @@
1
- import React, { useMemo } from 'react';
2
- import { FormattedMessage } from 'react-intl';
3
- import { Col } from 'reactstrap';
4
- import { get, isEmpty, takeRight, toLower, without } from 'lodash';
5
- import { getTrad } from '../../utils';
1
+ import React from 'react';
2
+ import { useIntl } from 'react-intl';
3
+ import { Typography } from '@strapi/design-system/Typography';
4
+ import { Stack } from '@strapi/design-system/Stack';
5
+ import { GridItem } from '@strapi/design-system/Grid';
6
+ import { get, isEmpty, without } from 'lodash';
6
7
  import { useUsersPermissions } from '../../contexts/UsersPermissionsContext';
7
8
  import BoundRoute from '../BoundRoute';
8
- import SizedInput from '../SizedInput';
9
- import { Header, Wrapper, Sticky } from './Components';
10
9
 
11
10
  const Policies = () => {
12
- const { modifiedData, selectedAction, routes, policies, onChange } = useUsersPermissions();
13
- const baseTitle = 'users-permissions.Policies.header';
14
- const title = !selectedAction ? 'hint' : 'title';
11
+ const { formatMessage } = useIntl();
12
+ const { selectedAction, routes } = useUsersPermissions();
13
+
15
14
  const path = without(selectedAction.split('.'), 'controllers');
16
15
  const controllerRoutes = get(routes, path[0]);
16
+ const pathResolved = path.slice(1).join('.');
17
+
17
18
  const displayedRoutes = isEmpty(controllerRoutes)
18
19
  ? []
19
- : controllerRoutes.filter(o => toLower(o.handler) === toLower(takeRight(path, 2).join('.')));
20
-
21
- const inputName = `${selectedAction}.policy`;
22
-
23
- const value = useMemo(() => {
24
- return get(modifiedData, inputName, '');
25
- }, [inputName, modifiedData]);
20
+ : controllerRoutes.filter(o => o.handler.endsWith(pathResolved));
26
21
 
27
22
  return (
28
- <Wrapper className="col-md-5">
29
- <Sticky className="container-fluid">
30
- <div className="row">
31
- <Header className="col-md-12">
32
- <FormattedMessage id={`${baseTitle}.${title}`} />
33
- </Header>
34
- {selectedAction && (
35
- <>
36
- <SizedInput
37
- type="select"
38
- name={inputName}
39
- onChange={onChange}
40
- label={getTrad('Policies.InputSelect.label')}
41
- options={policies}
42
- value={value}
43
- />
44
-
45
- <div className="row">
46
- <Col size={{ xs: 12 }}>
47
- {displayedRoutes.map((route, key) => (
48
- // eslint-disable-next-line react/no-array-index-key
49
- <BoundRoute key={key} route={route} />
50
- ))}
51
- </Col>
52
- </div>
53
- </>
54
- )}
55
- </div>
56
- </Sticky>
57
- </Wrapper>
23
+ <GridItem
24
+ col={5}
25
+ background="neutral150"
26
+ paddingTop={6}
27
+ paddingBottom={6}
28
+ paddingLeft={7}
29
+ paddingRight={7}
30
+ style={{ minHeight: '100%' }}
31
+ >
32
+ {selectedAction ? (
33
+ <Stack size={2}>
34
+ {displayedRoutes.map((route, key) => (
35
+ // eslint-disable-next-line react/no-array-index-key
36
+ <BoundRoute key={key} route={route} />
37
+ ))}
38
+ </Stack>
39
+ ) : (
40
+ <Stack size={2}>
41
+ <Typography variant="delta" as="h3">
42
+ {formatMessage({
43
+ id: 'users-permissions.Policies.header.title',
44
+ defaultMessage: 'Advanced settings',
45
+ })}
46
+ </Typography>
47
+ <Typography as="p" textColor="neutral600">
48
+ {formatMessage({
49
+ id: 'users-permissions.Policies.header.hint',
50
+ defaultMessage:
51
+ "Select the application's actions or the plugin's actions and click on the cog icon to display the bound route",
52
+ })}
53
+ </Typography>
54
+ </Stack>
55
+ )}
56
+ </GridItem>
58
57
  );
59
58
  };
60
59
 
@@ -1,9 +1,9 @@
1
- import React, { memo, useReducer, useCallback, forwardRef, useImperativeHandle } from 'react';
1
+ import React, { memo, useReducer, forwardRef, useImperativeHandle } from 'react';
2
2
  import PropTypes from 'prop-types';
3
- import { Padded, Flex } from '@buffetjs/core';
3
+ import { Typography } from '@strapi/design-system/Typography';
4
+ import { Stack } from '@strapi/design-system/Stack';
5
+ import { Grid, GridItem } from '@strapi/design-system/Grid';
4
6
  import { useIntl } from 'react-intl';
5
-
6
- import FormCard from '../FormBloc';
7
7
  import getTrad from '../../utils/getTrad';
8
8
  import Policies from '../Policies';
9
9
  import Permissions from '../Permissions';
@@ -11,10 +11,10 @@ import reducer, { initialState } from './reducer';
11
11
  import { UsersPermissionsProvider } from '../../contexts/UsersPermissionsContext';
12
12
  import init from './init';
13
13
 
14
- const UsersPermissions = forwardRef(({ permissions, routes, policies }, ref) => {
14
+ const UsersPermissions = forwardRef(({ permissions, routes }, ref) => {
15
15
  const { formatMessage } = useIntl();
16
16
  const [state, dispatch] = useReducer(reducer, initialState, state =>
17
- init(state, permissions, routes, policies)
17
+ init(state, permissions, routes)
18
18
  );
19
19
 
20
20
  useImperativeHandle(ref, () => ({
@@ -31,28 +31,25 @@ const UsersPermissions = forwardRef(({ permissions, routes, policies }, ref) =>
31
31
  },
32
32
  }));
33
33
 
34
- const handleChange = useCallback(({ target: { name, value } }) => {
34
+ const handleChange = ({ target: { name, value } }) =>
35
35
  dispatch({
36
36
  type: 'ON_CHANGE',
37
37
  keys: name.split('.'),
38
38
  value: value === 'empty__string_value' ? '' : value,
39
39
  });
40
- }, []);
41
40
 
42
- const handleChangeSelectAll = useCallback(({ target: { name, value } }) => {
41
+ const handleChangeSelectAll = ({ target: { name, value } }) =>
43
42
  dispatch({
44
43
  type: 'ON_CHANGE_SELECT_ALL',
45
44
  keys: name.split('.'),
46
45
  value,
47
46
  });
48
- }, []);
49
47
 
50
- const handleSelectedAction = useCallback(actionToSelect => {
48
+ const handleSelectedAction = actionToSelect =>
51
49
  dispatch({
52
50
  type: 'SELECT_ACTION',
53
51
  actionToSelect,
54
52
  });
55
- }, []);
56
53
 
57
54
  const providerValue = {
58
55
  ...state,
@@ -63,21 +60,28 @@ const UsersPermissions = forwardRef(({ permissions, routes, policies }, ref) =>
63
60
 
64
61
  return (
65
62
  <UsersPermissionsProvider value={providerValue}>
66
- <Flex>
67
- <FormCard
68
- title={formatMessage({
69
- id: getTrad('Plugins.header.title'),
70
- })}
71
- subtitle={formatMessage({
72
- id: getTrad('Plugins.header.description'),
73
- })}
74
- >
75
- <Padded left right size="xs">
63
+ <Grid gap={0} shadow="filterShadow" hasRadius background="neutral0">
64
+ <GridItem col={7} paddingTop={6} paddingBottom={6} paddingLeft={7} paddingRight={7}>
65
+ <Stack size={6}>
66
+ <Stack size={2}>
67
+ <Typography variant="delta" as="h2">
68
+ {formatMessage({
69
+ id: getTrad('Plugins.header.title'),
70
+ defaultMessage: 'Permissions',
71
+ })}
72
+ </Typography>
73
+ <Typography as="p" textColor="neutral600">
74
+ {formatMessage({
75
+ id: getTrad('Plugins.header.description'),
76
+ defaultMessage: 'Only actions bound by a route are listed below.',
77
+ })}
78
+ </Typography>
79
+ </Stack>
76
80
  <Permissions />
77
- </Padded>
78
- </FormCard>
81
+ </Stack>
82
+ </GridItem>
79
83
  <Policies />
80
- </Flex>
84
+ </Grid>
81
85
  </UsersPermissionsProvider>
82
86
  );
83
87
  });
@@ -85,7 +89,6 @@ const UsersPermissions = forwardRef(({ permissions, routes, policies }, ref) =>
85
89
  UsersPermissions.propTypes = {
86
90
  permissions: PropTypes.object.isRequired,
87
91
  routes: PropTypes.object.isRequired,
88
- policies: PropTypes.array.isRequired,
89
92
  };
90
93
 
91
94
  export default memo(UsersPermissions);
@@ -1,10 +1,9 @@
1
- const init = (state, permissions, routes, policies) => {
1
+ const init = (state, permissions, routes) => {
2
2
  return {
3
3
  ...state,
4
4
  initialData: permissions,
5
5
  modifiedData: permissions,
6
6
  routes,
7
- policies,
8
7
  };
9
8
  };
10
9
 
@@ -1,13 +1,17 @@
1
- import { useCallback, useReducer, useEffect } from 'react';
2
- import { request, useNotification } from '@strapi/helper-plugin';
1
+ import { useCallback, useReducer, useEffect, useRef } from 'react';
2
+ import { useNotification } from '@strapi/helper-plugin';
3
3
  import reducer, { initialState } from './reducer';
4
+ import axiosIntance from '../../utils/axiosInstance';
4
5
  import pluginId from '../../pluginId';
5
6
 
6
7
  const useFetchRole = id => {
7
8
  const [state, dispatch] = useReducer(reducer, initialState);
8
9
  const toggleNotification = useNotification();
10
+ const isMounted = useRef(null);
9
11
 
10
12
  useEffect(() => {
13
+ isMounted.current = true;
14
+
11
15
  if (id) {
12
16
  fetchRole(id);
13
17
  } else {
@@ -17,17 +21,23 @@ const useFetchRole = id => {
17
21
  });
18
22
  }
19
23
 
24
+ return () => (isMounted.current = false);
20
25
  // eslint-disable-next-line react-hooks/exhaustive-deps
21
26
  }, [id]);
22
27
 
23
28
  const fetchRole = async roleId => {
24
29
  try {
25
- const { role } = await request(`/${pluginId}/roles/${roleId}`, { method: 'GET' });
30
+ const {
31
+ data: { role },
32
+ } = await axiosIntance.get(`/${pluginId}/roles/${roleId}`);
26
33
 
27
- dispatch({
28
- type: 'GET_DATA_SUCCEEDED',
29
- role,
30
- });
34
+ // Prevent updating state on an unmounted component
35
+ if (isMounted.current) {
36
+ dispatch({
37
+ type: 'GET_DATA_SUCCEEDED',
38
+ role,
39
+ });
40
+ }
31
41
  } catch (err) {
32
42
  console.error(err);
33
43
 
@@ -5,10 +5,7 @@ import reducer, { initialState } from './reducer';
5
5
 
6
6
  const useUserForm = (endPoint, permissions) => {
7
7
  const { isLoading: isLoadingForPermissions, allowedActions } = useRBAC(permissions);
8
- const [{ formErrors, initialData, isLoading, modifiedData }, dispatch] = useReducer(
9
- reducer,
10
- initialState
11
- );
8
+ const [{ isLoading, modifiedData }, dispatch] = useReducer(reducer, initialState);
12
9
  const toggleNotification = useNotification();
13
10
  const isMounted = useRef(true);
14
11
 
@@ -54,39 +51,16 @@ const useUserForm = (endPoint, permissions) => {
54
51
  // eslint-disable-next-line react-hooks/exhaustive-deps
55
52
  }, [isLoadingForPermissions, endPoint]);
56
53
 
57
- const handleChange = useCallback(({ target: { name, value } }) => {
58
- dispatch({
59
- type: 'ON_CHANGE',
60
- keys: name,
61
- value,
62
- });
63
- }, []);
64
-
65
- const dispatchResetForm = useCallback(() => {
66
- dispatch({
67
- type: 'RESET_FORM',
68
- });
69
- }, []);
70
-
71
- const dispatchSetFormErrors = useCallback(errors => {
72
- dispatch({ type: 'SET_ERRORS', errors });
73
- }, []);
74
-
75
- const dispatchSubmitSucceeded = useCallback(() => {
54
+ const dispatchSubmitSucceeded = useCallback(data => {
76
55
  dispatch({
77
56
  type: 'ON_SUBMIT_SUCCEEDED',
57
+ data,
78
58
  });
79
59
  }, []);
80
60
 
81
61
  return {
82
62
  allowedActions,
83
- dispatch,
84
- dispatchResetForm,
85
- dispatchSetFormErrors,
86
63
  dispatchSubmitSucceeded,
87
- formErrors,
88
- handleChange,
89
- initialData,
90
64
  isLoading,
91
65
  isLoadingForPermissions,
92
66
  modifiedData,
@@ -1,10 +1,7 @@
1
1
  import produce from 'immer';
2
- import { set } from 'lodash';
3
2
 
4
3
  const initialState = {
5
- formErrors: {},
6
4
  isLoading: true,
7
- initialData: {},
8
5
  modifiedData: {},
9
6
  };
10
7
 
@@ -14,15 +11,12 @@ const reducer = (state, action) =>
14
11
  switch (action.type) {
15
12
  case 'GET_DATA': {
16
13
  draftState.isLoading = true;
17
- draftState.initialData = {};
18
14
  draftState.modifiedData = {};
19
15
 
20
16
  break;
21
17
  }
22
-
23
18
  case 'GET_DATA_SUCCEEDED': {
24
19
  draftState.isLoading = false;
25
- draftState.initialData = action.data;
26
20
  draftState.modifiedData = action.data;
27
21
 
28
22
  break;
@@ -31,22 +25,9 @@ const reducer = (state, action) =>
31
25
  draftState.isLoading = true;
32
26
  break;
33
27
  }
34
- case 'ON_CHANGE': {
35
- set(draftState, ['modifiedData', ...action.keys.split('.')], action.value);
36
- break;
37
- }
38
28
  case 'ON_SUBMIT_SUCCEEDED': {
39
- draftState.initialData = state.modifiedData;
40
- draftState.formErrors = {};
41
- break;
42
- }
43
- case 'RESET_FORM': {
44
- draftState.modifiedData = state.initialData;
45
- draftState.formErrors = {};
46
- break;
47
- }
48
- case 'SET_ERRORS': {
49
- draftState.formErrors = action.errors;
29
+ draftState.modifiedData = action.data;
30
+
50
31
  break;
51
32
  }
52
33
  default: {
@@ -1,19 +1,16 @@
1
1
  import { useCallback, useEffect, useReducer } from 'react';
2
- import { request, useNotification } from '@strapi/helper-plugin';
3
- import { useIntl } from 'react-intl';
2
+ import { useNotification } from '@strapi/helper-plugin';
4
3
  import { get } from 'lodash';
5
4
  import init from './init';
6
5
  import pluginId from '../../pluginId';
7
- import { cleanPermissions, formatPolicies, getTrad } from '../../utils';
6
+ import { cleanPermissions } from '../../utils';
7
+ import axiosInstance from '../../utils/axiosInstance';
8
8
  import reducer, { initialState } from './reducer';
9
9
 
10
10
  const usePlugins = (shouldFetchData = true) => {
11
- const { formatMessage } = useIntl();
12
11
  const toggleNotification = useNotification();
13
- const [{ permissions, routes, policies, isLoading }, dispatch] = useReducer(
14
- reducer,
15
- initialState,
16
- () => init(initialState, shouldFetchData)
12
+ const [{ permissions, routes, isLoading }, dispatch] = useReducer(reducer, initialState, () =>
13
+ init(initialState, shouldFetchData)
17
14
  );
18
15
 
19
16
  const fetchPlugins = useCallback(async () => {
@@ -22,23 +19,18 @@ const usePlugins = (shouldFetchData = true) => {
22
19
  type: 'GET_DATA',
23
20
  });
24
21
 
25
- const [{ permissions }, { routes }, { policies }] = await Promise.all(
26
- [`/${pluginId}/permissions`, `/${pluginId}/routes`, `/${pluginId}/policies`].map(endpoint =>
27
- request(endpoint, { method: 'GET' })
28
- )
22
+ const [{ permissions }, { routes }] = await Promise.all(
23
+ [`/${pluginId}/permissions`, `/${pluginId}/routes`].map(async endpoint => {
24
+ const res = await axiosInstance.get(endpoint);
25
+
26
+ return res.data;
27
+ })
29
28
  );
30
29
 
31
30
  dispatch({
32
31
  type: 'GET_DATA_SUCCEEDED',
33
32
  permissions: cleanPermissions(permissions),
34
33
  routes,
35
- policies: [
36
- {
37
- label: formatMessage({ id: getTrad('Policies.InputSelect.empty') }),
38
- value: 'empty__string_value',
39
- },
40
- ...formatPolicies(policies),
41
- ],
42
34
  });
43
35
  } catch (err) {
44
36
  const message = get(err, ['response', 'payload', 'message'], 'An error occured');
@@ -54,7 +46,7 @@ const usePlugins = (shouldFetchData = true) => {
54
46
  });
55
47
  }
56
48
  }
57
- }, [formatMessage, toggleNotification]);
49
+ }, [toggleNotification]);
58
50
 
59
51
  useEffect(() => {
60
52
  if (shouldFetchData) {
@@ -65,7 +57,6 @@ const usePlugins = (shouldFetchData = true) => {
65
57
  return {
66
58
  permissions,
67
59
  routes,
68
- policies,
69
60
  getData: fetchPlugins,
70
61
  isLoading,
71
62
  };
@@ -4,7 +4,6 @@ import produce from 'immer';
4
4
  export const initialState = {
5
5
  permissions: {},
6
6
  routes: {},
7
- policies: [],
8
7
  isLoading: true,
9
8
  };
10
9
 
@@ -15,13 +14,11 @@ const reducer = (state, action) =>
15
14
  draftState.isLoading = true;
16
15
  draftState.permissions = {};
17
16
  draftState.routes = {};
18
- draftState.policies = [];
19
17
  break;
20
18
  }
21
19
  case 'GET_DATA_SUCCEEDED': {
22
20
  draftState.permissions = action.permissions;
23
21
  draftState.routes = action.routes;
24
- draftState.policies = action.policies;
25
22
  draftState.isLoading = false;
26
23
  break;
27
24
  }
@@ -6,13 +6,10 @@
6
6
  // IF THE DOC IS NOT UPDATED THE PULL REQUEST WILL NOT BE MERGED
7
7
  import { prefixPluginTranslations } from '@strapi/helper-plugin';
8
8
  import pluginPkg from '../../package.json';
9
- import pluginLogo from './assets/images/logo.svg';
10
9
  import pluginPermissions from './permissions';
11
10
  import pluginId from './pluginId';
12
11
  import getTrad from './utils/getTrad';
13
12
 
14
- const pluginDescription = pluginPkg.strapi.description || pluginPkg.description;
15
- const icon = pluginPkg.strapi.icon;
16
13
  const name = pluginPkg.strapi.name;
17
14
 
18
15
  export default {
@@ -95,13 +92,8 @@ export default {
95
92
  );
96
93
 
97
94
  app.registerPlugin({
98
- description: pluginDescription,
99
- icon,
100
95
  id: pluginId,
101
- isReady: true,
102
- isRequired: pluginPkg.strapi.required || false,
103
96
  name,
104
- pluginLogo,
105
97
  });
106
98
  },
107
99
  bootstrap() {},