98 lines
2.9 KiB
JavaScript
Raw Normal View History

import React, { memo, useReducer, useCallback, forwardRef, useImperativeHandle } from 'react';
import PropTypes from 'prop-types';
import { H3, Text } from '@strapi/design-system/Text';
import { Stack } from '@strapi/design-system/Stack';
import { Grid, GridItem } from '@strapi/design-system/Grid';
import { useIntl } from 'react-intl';
import getTrad from '../../utils/getTrad';
import Policies from '../Policies';
2021-09-13 18:44:34 +02:00
import Permissions from '../Permissions';
import reducer, { initialState } from './reducer';
import { UsersPermissionsProvider } from '../../contexts/UsersPermissionsContext';
import init from './init';
2021-09-22 16:56:31 +02:00
const UsersPermissions = forwardRef(({ permissions, routes }, ref) => {
const { formatMessage } = useIntl();
const [state, dispatch] = useReducer(reducer, initialState, state =>
2021-09-22 16:56:31 +02:00
init(state, permissions, routes)
);
useImperativeHandle(ref, () => ({
getPermissions: () => {
return {
permissions: state.modifiedData,
};
},
resetForm: () => {
dispatch({ type: 'ON_RESET' });
},
setFormAfterSubmit: () => {
dispatch({ type: 'ON_SUBMIT_SUCCEEDED' });
},
}));
const handleChange = useCallback(({ target: { name, value } }) => {
dispatch({
type: 'ON_CHANGE',
keys: name.split('.'),
value: value === 'empty__string_value' ? '' : value,
});
}, []);
const handleChangeSelectAll = useCallback(({ target: { name, value } }) => {
dispatch({
type: 'ON_CHANGE_SELECT_ALL',
keys: name.split('.'),
value,
});
}, []);
const handleSelectedAction = useCallback(actionToSelect => {
dispatch({
type: 'SELECT_ACTION',
actionToSelect,
});
}, []);
const providerValue = {
...state,
onChange: handleChange,
onChangeSelectAll: handleChangeSelectAll,
onSelectedAction: handleSelectedAction,
};
return (
<UsersPermissionsProvider value={providerValue}>
2021-09-13 12:24:11 +02:00
<Grid gap={0} shadow="filterShadow" hasRadius background="neutral0">
<GridItem col={7} paddingTop={6} paddingBottom={6} paddingLeft={7} paddingRight={7}>
2021-09-13 18:44:34 +02:00
<Stack size={4}>
<Stack size={2}>
2021-09-14 17:37:02 +02:00
<H3 as="h2">
2021-09-13 18:44:34 +02:00
{formatMessage({
2021-09-14 17:37:02 +02:00
id: getTrad('Plugins.header.title'),
2021-09-14 18:51:10 +02:00
defaultMessage: 'Permissions',
2021-09-14 17:37:02 +02:00
})}
2021-09-13 18:44:34 +02:00
</H3>
<Text as="p" textColor="neutral600">
{formatMessage({
2021-09-14 17:37:02 +02:00
id: getTrad('Plugins.header.description'),
2021-09-14 18:51:10 +02:00
defaultMessage: 'Only actions bound by a route are listed below.',
2021-09-14 17:37:02 +02:00
})}
2021-09-13 18:44:34 +02:00
</Text>
</Stack>
<Permissions />
2021-09-13 12:24:11 +02:00
</Stack>
</GridItem>
<Policies />
</Grid>
</UsersPermissionsProvider>
);
});
UsersPermissions.propTypes = {
permissions: PropTypes.object.isRequired,
routes: PropTypes.object.isRequired,
};
export default memo(UsersPermissions);