refactor: remove calls to redux

This commit is contained in:
Josh 2023-10-16 11:17:43 +01:00
parent 57aef2ac2b
commit 04436917c7
25 changed files with 420 additions and 218 deletions

View File

@ -31,7 +31,7 @@ updates:
redux:
patterns:
- 'redux'
- '@reduxjs/toolkit'
- 'react-redux'
richtext-editor:

View File

@ -303,6 +303,68 @@ export interface AdminTransferTokenPermission extends Schema.CollectionType {
};
}
export interface AdminWorkflow extends Schema.CollectionType {
collectionName: 'strapi_workflows';
info: {
name: 'Workflow';
description: '';
singularName: 'workflow';
pluralName: 'workflows';
displayName: 'Workflow';
};
pluginOptions: {
'content-manager': {
visible: false;
};
'content-type-builder': {
visible: false;
};
};
attributes: {
name: Attribute.String & Attribute.Required & Attribute.Unique;
stages: Attribute.Relation<'admin::workflow', 'oneToMany', 'admin::workflow-stage'>;
contentTypes: Attribute.JSON & Attribute.Required & Attribute.DefaultTo<[]>;
createdAt: Attribute.DateTime;
updatedAt: Attribute.DateTime;
createdBy: Attribute.Relation<'admin::workflow', 'oneToOne', 'admin::user'> & Attribute.Private;
updatedBy: Attribute.Relation<'admin::workflow', 'oneToOne', 'admin::user'> & Attribute.Private;
};
}
export interface AdminWorkflowStage extends Schema.CollectionType {
collectionName: 'strapi_workflows_stages';
info: {
name: 'Workflow Stage';
description: '';
singularName: 'workflow-stage';
pluralName: 'workflow-stages';
displayName: 'Stages';
};
options: {
version: '1.1.0';
};
pluginOptions: {
'content-manager': {
visible: false;
};
'content-type-builder': {
visible: false;
};
};
attributes: {
name: Attribute.String;
color: Attribute.String & Attribute.DefaultTo<'#4945FF'>;
workflow: Attribute.Relation<'admin::workflow-stage', 'manyToOne', 'admin::workflow'>;
permissions: Attribute.Relation<'admin::workflow-stage', 'manyToMany', 'admin::permission'>;
createdAt: Attribute.DateTime;
updatedAt: Attribute.DateTime;
createdBy: Attribute.Relation<'admin::workflow-stage', 'oneToOne', 'admin::user'> &
Attribute.Private;
updatedBy: Attribute.Relation<'admin::workflow-stage', 'oneToOne', 'admin::user'> &
Attribute.Private;
};
}
export interface PluginUploadFile extends Schema.CollectionType {
collectionName: 'files';
info: {
@ -428,6 +490,8 @@ export interface PluginMypluginTest extends Schema.CollectionType {
'plugin::myplugin.test'
>;
locale: Attribute.String;
strapi_stage: Attribute.Relation<'plugin::myplugin.test', 'oneToOne', 'admin::workflow-stage'>;
strapi_assignee: Attribute.Relation<'plugin::myplugin.test', 'oneToOne', 'admin::user'>;
};
}
@ -598,6 +662,16 @@ export interface PluginUsersPermissionsUser extends Schema.CollectionType {
Attribute.Private;
updatedBy: Attribute.Relation<'plugin::users-permissions.user', 'oneToOne', 'admin::user'> &
Attribute.Private;
strapi_stage: Attribute.Relation<
'plugin::users-permissions.user',
'oneToOne',
'admin::workflow-stage'
>;
strapi_assignee: Attribute.Relation<
'plugin::users-permissions.user',
'oneToOne',
'admin::user'
>;
};
}
@ -641,6 +715,8 @@ export interface ApiAddressAddress extends Schema.CollectionType {
Attribute.Private;
updatedBy: Attribute.Relation<'api::address.address', 'oneToOne', 'admin::user'> &
Attribute.Private;
strapi_stage: Attribute.Relation<'api::address.address', 'oneToOne', 'admin::workflow-stage'>;
strapi_assignee: Attribute.Relation<'api::address.address', 'oneToOne', 'admin::user'>;
};
}
@ -701,6 +777,8 @@ export interface ApiCategoryCategory extends Schema.CollectionType {
'api::category.category'
>;
locale: Attribute.String;
strapi_stage: Attribute.Relation<'api::category.category', 'oneToOne', 'admin::workflow-stage'>;
strapi_assignee: Attribute.Relation<'api::category.category', 'oneToOne', 'admin::user'>;
};
}
@ -752,6 +830,8 @@ export interface ApiCountryCountry extends Schema.CollectionType {
Attribute.Private;
localizations: Attribute.Relation<'api::country.country', 'oneToMany', 'api::country.country'>;
locale: Attribute.String;
strapi_stage: Attribute.Relation<'api::country.country', 'oneToOne', 'admin::workflow-stage'>;
strapi_assignee: Attribute.Relation<'api::country.country', 'oneToOne', 'admin::user'>;
};
}
@ -800,6 +880,8 @@ export interface ApiHomepageHomepage extends Schema.SingleType {
'api::homepage.homepage'
>;
locale: Attribute.String;
strapi_stage: Attribute.Relation<'api::homepage.homepage', 'oneToOne', 'admin::workflow-stage'>;
strapi_assignee: Attribute.Relation<'api::homepage.homepage', 'oneToOne', 'admin::user'>;
};
}
@ -870,6 +952,12 @@ export interface ApiKitchensinkKitchensink extends Schema.CollectionType {
Attribute.Private;
updatedBy: Attribute.Relation<'api::kitchensink.kitchensink', 'oneToOne', 'admin::user'> &
Attribute.Private;
strapi_stage: Attribute.Relation<
'api::kitchensink.kitchensink',
'oneToOne',
'admin::workflow-stage'
>;
strapi_assignee: Attribute.Relation<'api::kitchensink.kitchensink', 'oneToOne', 'admin::user'>;
};
}
@ -892,6 +980,8 @@ export interface ApiLikeLike extends Schema.CollectionType {
updatedAt: Attribute.DateTime;
createdBy: Attribute.Relation<'api::like.like', 'oneToOne', 'admin::user'> & Attribute.Private;
updatedBy: Attribute.Relation<'api::like.like', 'oneToOne', 'admin::user'> & Attribute.Private;
strapi_stage: Attribute.Relation<'api::like.like', 'oneToOne', 'admin::workflow-stage'>;
strapi_assignee: Attribute.Relation<'api::like.like', 'oneToOne', 'admin::user'>;
};
}
@ -915,6 +1005,8 @@ export interface ApiMenuMenu extends Schema.CollectionType {
updatedAt: Attribute.DateTime;
createdBy: Attribute.Relation<'api::menu.menu', 'oneToOne', 'admin::user'> & Attribute.Private;
updatedBy: Attribute.Relation<'api::menu.menu', 'oneToOne', 'admin::user'> & Attribute.Private;
strapi_stage: Attribute.Relation<'api::menu.menu', 'oneToOne', 'admin::workflow-stage'>;
strapi_assignee: Attribute.Relation<'api::menu.menu', 'oneToOne', 'admin::user'>;
};
}
@ -944,6 +1036,12 @@ export interface ApiMenusectionMenusection extends Schema.CollectionType {
Attribute.Private;
updatedBy: Attribute.Relation<'api::menusection.menusection', 'oneToOne', 'admin::user'> &
Attribute.Private;
strapi_stage: Attribute.Relation<
'api::menusection.menusection',
'oneToOne',
'admin::workflow-stage'
>;
strapi_assignee: Attribute.Relation<'api::menusection.menusection', 'oneToOne', 'admin::user'>;
};
}
@ -1021,6 +1119,16 @@ export interface ApiRelationLocaleRelationLocale extends Schema.CollectionType {
'api::relation-locale.relation-locale'
>;
locale: Attribute.String;
strapi_stage: Attribute.Relation<
'api::relation-locale.relation-locale',
'oneToOne',
'admin::workflow-stage'
>;
strapi_assignee: Attribute.Relation<
'api::relation-locale.relation-locale',
'oneToOne',
'admin::user'
>;
};
}
@ -1178,6 +1286,12 @@ export interface ApiRestaurantRestaurant extends Schema.CollectionType {
'api::restaurant.restaurant'
>;
locale: Attribute.String;
strapi_stage: Attribute.Relation<
'api::restaurant.restaurant',
'oneToOne',
'admin::workflow-stage'
>;
strapi_assignee: Attribute.Relation<'api::restaurant.restaurant', 'oneToOne', 'admin::user'>;
};
}
@ -1210,6 +1324,8 @@ export interface ApiReviewReview extends Schema.CollectionType {
Attribute.Private;
updatedBy: Attribute.Relation<'api::review.review', 'oneToOne', 'admin::user'> &
Attribute.Private;
strapi_stage: Attribute.Relation<'api::review.review', 'oneToOne', 'admin::workflow-stage'>;
strapi_assignee: Attribute.Relation<'api::review.review', 'oneToOne', 'admin::user'>;
};
}
@ -1251,6 +1367,8 @@ export interface ApiTagTag extends Schema.CollectionType {
publishedAt: Attribute.DateTime;
createdBy: Attribute.Relation<'api::tag.tag', 'oneToOne', 'admin::user'> & Attribute.Private;
updatedBy: Attribute.Relation<'api::tag.tag', 'oneToOne', 'admin::user'> & Attribute.Private;
strapi_stage: Attribute.Relation<'api::tag.tag', 'oneToOne', 'admin::workflow-stage'>;
strapi_assignee: Attribute.Relation<'api::tag.tag', 'oneToOne', 'admin::user'>;
};
}
@ -1275,6 +1393,41 @@ export interface ApiTempTemp extends Schema.CollectionType {
publishedAt: Attribute.DateTime;
createdBy: Attribute.Relation<'api::temp.temp', 'oneToOne', 'admin::user'> & Attribute.Private;
updatedBy: Attribute.Relation<'api::temp.temp', 'oneToOne', 'admin::user'> & Attribute.Private;
strapi_stage: Attribute.Relation<'api::temp.temp', 'oneToOne', 'admin::workflow-stage'>;
strapi_assignee: Attribute.Relation<'api::temp.temp', 'oneToOne', 'admin::user'>;
};
}
export interface AdminAuditLog extends Schema.CollectionType {
collectionName: 'strapi_audit_logs';
info: {
singularName: 'audit-log';
pluralName: 'audit-logs';
displayName: 'Audit Log';
};
options: {
draftAndPublish: false;
timestamps: false;
};
pluginOptions: {
'content-manager': {
visible: false;
};
'content-type-builder': {
visible: false;
};
};
attributes: {
action: Attribute.String & Attribute.Required;
date: Attribute.DateTime & Attribute.Required;
user: Attribute.Relation<'admin::audit-log', 'oneToOne', 'admin::user'>;
payload: Attribute.JSON;
createdAt: Attribute.DateTime;
updatedAt: Attribute.DateTime;
createdBy: Attribute.Relation<'admin::audit-log', 'oneToOne', 'admin::user'> &
Attribute.Private;
updatedBy: Attribute.Relation<'admin::audit-log', 'oneToOne', 'admin::user'> &
Attribute.Private;
};
}
@ -1288,6 +1441,8 @@ declare module '@strapi/types' {
'admin::api-token-permission': AdminApiTokenPermission;
'admin::transfer-token': AdminTransferToken;
'admin::transfer-token-permission': AdminTransferTokenPermission;
'admin::workflow': AdminWorkflow;
'admin::workflow-stage': AdminWorkflowStage;
'plugin::upload.file': PluginUploadFile;
'plugin::upload.folder': PluginUploadFolder;
'plugin::myplugin.test': PluginMypluginTest;
@ -1308,6 +1463,7 @@ declare module '@strapi/types' {
'api::review.review': ApiReviewReview;
'api::tag.tag': ApiTagTag;
'api::temp.temp': ApiTempTemp;
'admin::audit-log': AdminAuditLog;
}
}
}

View File

@ -67,18 +67,19 @@
},
"dependencies": {
"@juggle/resize-observer": "3.4.0",
"@testing-library/jest-dom": "5.16.5",
"jest-styled-components": "7.1.1",
"whatwg-fetch": "3.6.2"
},
"devDependencies": {
"@reduxjs/toolkit": "1.9.7",
"@strapi/pack-up": "workspace:*",
"@testing-library/jest-dom": "5.16.5",
"eslint-config-custom": "4.14.4",
"redux": "^4.2.1",
"tsconfig": "4.14.4"
},
"peerDependencies": {
"redux": "^4.2.1"
"@reduxjs/toolkit": "^1.9.7",
"@testing-library/jest-dom": "^5.16.5"
},
"engines": {
"node": ">=16.0.0 <=20.x.x"

View File

@ -1,4 +1,4 @@
import { combineReducers, createStore } from 'redux';
import { combineReducers, configureStore } from '@reduxjs/toolkit';
const reducers = {
admin_app: jest.fn(() => ({ permissions: {}, status: 'init' })),
@ -33,7 +33,9 @@ const reducers = {
rbacProvider: jest.fn(() => ({ allPermissions: null, collectionTypesRelatedPermissions: {} })),
};
const store = createStore(combineReducers(reducers));
const store = configureStore({
reducer: combineReducers(reducers),
});
export default {
store,

View File

@ -1,5 +1,6 @@
import React from 'react';
import { combineReducers, configureStore } from '@reduxjs/toolkit';
import { lightTheme, ThemeProvider } from '@strapi/design-system';
import { Table, useTableContext } from '@strapi/helper-plugin';
import { render, screen, waitFor, within } from '@testing-library/react';
@ -7,7 +8,6 @@ import userEvent from '@testing-library/user-event';
import { IntlProvider } from 'react-intl';
import { Provider } from 'react-redux';
import { MemoryRouter } from 'react-router-dom';
import { combineReducers, createStore } from 'redux';
import BulkActionButtons from '..';
import reducers from '../../../../../../reducers';
@ -34,16 +34,18 @@ jest.mock('../SelectedEntriesModal', () => () => <div>SelectedEntriesModal</div>
const user = userEvent.setup();
const rootReducer = combineReducers(reducers);
const store = createStore(rootReducer, {
'content-manager_listView': {
data: [
{ id: 1, publishedAt: null },
{ id: 2, publishedAt: '2023-01-01T10:10:10.408Z' },
],
contentType: {
settings: {
mainField: 'name',
const store = configureStore({
reducer: combineReducers(reducers),
preloadedState: {
'content-manager_listView': {
data: [
{ id: 1, publishedAt: null },
{ id: 2, publishedAt: '2023-01-01T10:10:10.408Z' },
],
contentType: {
settings: {
mainField: 'name',
},
},
},
},

View File

@ -1,10 +1,10 @@
import React from 'react';
import { combineReducers, configureStore } from '@reduxjs/toolkit';
import { lightTheme, ThemeProvider } from '@strapi/design-system';
import { render as renderRTL, fireEvent } from '@testing-library/react';
import { IntlProvider } from 'react-intl';
import { Provider } from 'react-redux';
import { combineReducers, createStore } from 'redux';
import reducers from '../../../../../../reducers';
import { FieldPicker } from '../index';
@ -42,70 +42,71 @@ const layout = {
const render = () => ({
...renderRTL(<FieldPicker layout={layout} />, {
wrapper({ children }) {
const rootReducer = combineReducers(reducers);
const store = createStore(rootReducer, {
'content-manager_listView': {
contentType: {
attributes: {
id: { type: 'integer' },
name: { type: 'string' },
createdAt: { type: 'datetime' },
updatedAt: { type: 'datetime' },
},
metadatas: {
id: {
edit: {},
list: { label: 'id', searchable: true, sortable: true },
const store = configureStore({
reducer: combineReducers(reducers),
preloadedState: {
'content-manager_listView': {
contentType: {
attributes: {
id: { type: 'integer' },
name: { type: 'string' },
createdAt: { type: 'datetime' },
updatedAt: { type: 'datetime' },
},
name: {
edit: {
label: 'name',
description: '',
placeholder: '',
visible: true,
editable: true,
metadatas: {
id: {
edit: {},
list: { label: 'id', searchable: true, sortable: true },
},
list: { label: 'name', searchable: true, sortable: true },
},
createdAt: {
edit: {
label: 'createdAt',
description: '',
placeholder: '',
visible: false,
editable: true,
name: {
edit: {
label: 'name',
description: '',
placeholder: '',
visible: true,
editable: true,
},
list: { label: 'name', searchable: true, sortable: true },
},
list: { label: 'createdAt', searchable: true, sortable: true },
},
updatedAt: {
edit: {
label: 'updatedAt',
description: '',
placeholder: '',
visible: false,
editable: true,
createdAt: {
edit: {
label: 'createdAt',
description: '',
placeholder: '',
visible: false,
editable: true,
},
list: { label: 'createdAt', searchable: true, sortable: true },
},
updatedAt: {
edit: {
label: 'updatedAt',
description: '',
placeholder: '',
visible: false,
editable: true,
},
list: { label: 'updatedAt', searchable: true, sortable: true },
},
list: { label: 'updatedAt', searchable: true, sortable: true },
},
},
displayedHeaders: [
{
key: '__id_key__',
name: 'id',
fieldSchema: { type: 'integer' },
metadatas: { label: 'id', searchable: true, sortable: true },
},
],
initialDisplayedHeaders: [
{
key: '__id_key__',
name: 'id',
fieldSchema: { type: 'integer' },
metadatas: { label: 'id', searchable: true, sortable: true },
},
],
},
displayedHeaders: [
{
key: '__id_key__',
name: 'id',
fieldSchema: { type: 'integer' },
metadatas: { label: 'id', searchable: true, sortable: true },
},
],
initialDisplayedHeaders: [
{
key: '__id_key__',
name: 'id',
fieldSchema: { type: 'integer' },
metadatas: { label: 'id', searchable: true, sortable: true },
},
],
},
});

View File

@ -1,5 +1,6 @@
import * as React from 'react';
import { bindActionCreators } from '@reduxjs/toolkit';
import {
Main,
ActionLayout,
@ -39,10 +40,10 @@ import PropTypes from 'prop-types';
import { stringify } from 'qs';
import { useIntl } from 'react-intl';
import { useMutation } from 'react-query';
import { connect, useSelector } from 'react-redux';
import { useDispatch } from 'react-redux';
import { useHistory, useLocation, Link as ReactRouterLink } from 'react-router-dom';
import { bindActionCreators, compose } from 'redux';
import { useTypedSelector } from '../../../core/store/configureStore';
import { INJECT_COLUMN_IN_TABLE } from '../../../exposedHooks';
import { useAdminUsers } from '../../../hooks/useAdminUsers';
import { useEnterprise } from '../../../hooks/useEnterprise';
@ -53,7 +54,7 @@ import { CREATOR_FIELDS } from '../../constants/attributes';
import { useAllowedAttributes } from '../../hooks/useAllowedAttributes';
import { getTrad, getDisplayName } from '../../utils';
import { getData, getDataSucceeded, onChangeListHeaders, onResetListHeaders } from './actions';
import * as Actions from './actions';
import { Body } from './components/Body';
import BulkActionButtons from './components/BulkActionButtons';
import CellContent from './components/CellContent';
@ -66,19 +67,17 @@ const REVIEW_WORKFLOW_COLUMNS_CELL_CE = () => null;
const REVIEW_WORKFLOW_FILTER_CE = [];
const USER_FILTER_ATTRIBUTES = [...CREATOR_FIELDS, 'strapi_assignee'];
function ListView({
canCreate,
canDelete,
canRead,
canPublish,
data,
getData,
getDataSucceeded,
isLoading,
layout,
pagination,
slug,
}) {
function ListView({ canCreate, canDelete, canRead, canPublish, layout, slug }) {
const dispatch = useDispatch();
const { getData, getDataSucceeded } = React.useMemo(
() =>
bindActionCreators(
{ getData: Actions.getData, getDataSucceeded: Actions.getDataSucceeded },
dispatch
),
[dispatch]
);
const { pagination, isLoading, data } = useTypedSelector(makeSelectListView());
const { total } = pagination;
const { contentType } = layout;
const {
@ -468,7 +467,7 @@ function ListView({
});
const { runHookWaterfall } = useStrapiApp();
const displayedHeaders = useSelector(selectDisplayedHeaders);
const displayedHeaders = useTypedSelector(selectDisplayedHeaders);
const tableHeaders = React.useMemo(() => {
const headers = runHookWaterfall(INJECT_COLUMN_IN_TABLE, {
@ -869,7 +868,6 @@ ListView.propTypes = {
canDelete: PropTypes.bool.isRequired,
canRead: PropTypes.bool.isRequired,
canPublish: PropTypes.bool.isRequired,
data: PropTypes.array.isRequired,
layout: PropTypes.exact({
components: PropTypes.object.isRequired,
contentType: PropTypes.shape({
@ -884,27 +882,12 @@ ListView.propTypes = {
settings: PropTypes.object.isRequired,
}).isRequired,
}).isRequired,
isLoading: PropTypes.bool.isRequired,
getData: PropTypes.func.isRequired,
getDataSucceeded: PropTypes.func.isRequired,
pagination: PropTypes.shape({ total: PropTypes.number.isRequired, pageCount: PropTypes.number })
.isRequired,
slug: PropTypes.string.isRequired,
};
const mapStateToProps = makeSelectListView();
export function mapDispatchToProps(dispatch) {
return bindActionCreators(
{
getData,
getDataSucceeded,
onChangeListHeaders,
onResetListHeaders,
},
dispatch
);
return bindActionCreators({}, dispatch);
}
const withConnect = connect(mapStateToProps, mapDispatchToProps);
// const withConnect = connect(mapStateToProps, mapDispatchToProps);
export default compose(withConnect)(React.memo(ListView, isEqual));
export default React.memo(ListView, isEqual);

View File

@ -1,5 +1,6 @@
import React from 'react';
import { configureStore } from '@reduxjs/toolkit';
import { fixtures } from '@strapi/admin-test-utils';
import { darkTheme, lightTheme } from '@strapi/design-system';
import { render, waitFor } from '@testing-library/react';
@ -7,7 +8,6 @@ import { IntlProvider } from 'react-intl';
import { QueryClient, QueryClientProvider } from 'react-query';
import { Provider } from 'react-redux';
import { Route, MemoryRouter } from 'react-router-dom';
import { createStore } from 'redux';
import { Theme } from '../../../../../../components/Theme';
import { ThemeToggleProvider } from '../../../../../../components/ThemeToggleProvider';
@ -71,8 +71,11 @@ const setup = ({ path, ...props } = {}) =>
return (
<Provider
store={createStore((state) => state, {
admin_app: { permissions: fixtures.permissions.app },
store={configureStore({
reducer: (state) => state,
preloadedState: {
admin_app: { permissions: fixtures.permissions.app },
},
})}
>
<QueryClientProvider client={client}>

View File

@ -1,5 +1,6 @@
import React from 'react';
import { configureStore } from '@reduxjs/toolkit';
import { fixtures } from '@strapi/admin-test-utils';
import { darkTheme, lightTheme } from '@strapi/design-system';
import { TrackingProvider, useRBAC } from '@strapi/helper-plugin';
@ -8,7 +9,6 @@ import { IntlProvider } from 'react-intl';
import { QueryClient, QueryClientProvider } from 'react-query';
import { Provider } from 'react-redux';
import { Route, MemoryRouter } from 'react-router-dom';
import { createStore } from 'redux';
import { Theme } from '../../../../../../components/Theme';
import { ThemeToggleProvider } from '../../../../../../components/ThemeToggleProvider';
@ -78,8 +78,11 @@ const setup = ({ path, ...props } = {}) =>
return (
<Provider
store={createStore((state) => state, {
admin_app: { permissions: { ...fixtures.permissions.app } },
store={configureStore({
reducer: (state) => state,
preloadedState: {
admin_app: { permissions: fixtures.permissions.app },
},
})}
>
<QueryClientProvider client={client}>

View File

@ -6,6 +6,7 @@
import React from 'react';
import { configureStore } from '@reduxjs/toolkit';
import { fixtures } from '@strapi/admin-test-utils';
import { ThemeProvider, lightTheme } from '@strapi/design-system';
import { useRBAC } from '@strapi/helper-plugin';
@ -15,7 +16,6 @@ import { IntlProvider } from 'react-intl';
import { QueryClient, QueryClientProvider } from 'react-query';
import { Provider } from 'react-redux';
import { Router } from 'react-router-dom';
import { createStore } from 'redux';
import { useAdminRoles } from '../../../../../../hooks/useAdminRoles';
import ListPage from '../index';
@ -46,8 +46,11 @@ const setup = (props) =>
return (
<QueryClientProvider client={client}>
<Provider
store={createStore((state) => state, {
admin_app: { permissions: fixtures.permissions.app },
store={configureStore({
reducer: (state) => state,
preloadedState: {
admin_app: { permissions: fixtures.permissions.app },
},
})}
>
<IntlProvider messages={{}} defaultLocale="en" textComponent="span" locale="en">

View File

@ -1,5 +1,6 @@
import React from 'react';
import { configureStore } from '@reduxjs/toolkit';
import { fixtures } from '@strapi/admin-test-utils';
import { lightTheme, ThemeProvider } from '@strapi/design-system';
import { TrackingProvider, useRBAC } from '@strapi/helper-plugin';
@ -9,7 +10,6 @@ import { IntlProvider } from 'react-intl';
import { QueryClient, QueryClientProvider } from 'react-query';
import { Provider } from 'react-redux';
import { Route, Router } from 'react-router-dom';
import { createStore } from 'redux';
import ListPage from '../index';
@ -77,8 +77,11 @@ const setup = (props) =>
return (
<Provider
store={createStore((state) => state, {
admin_app: { permissions: fixtures.permissions.app },
store={configureStore({
reducer: (state) => state,
preloadedState: {
admin_app: { permissions: fixtures.permissions.app },
},
})}
>
<QueryClientProvider client={client}>

View File

@ -1,6 +1,7 @@
/* eslint-disable check-file/filename-naming-convention */
import * as React from 'react';
import { configureStore } from '@reduxjs/toolkit';
import { fixtures } from '@strapi/admin-test-utils';
import { DesignSystemProvider } from '@strapi/design-system';
import { NotificationsProvider, RBACContext } from '@strapi/helper-plugin';
@ -19,7 +20,6 @@ import { IntlProvider } from 'react-intl';
import { QueryClient, QueryClientProvider, setLogger } from 'react-query';
import { Provider } from 'react-redux';
import { MemoryRouter, MemoryRouterProps } from 'react-router-dom';
import { createStore } from 'redux';
// @ts-expect-error no types yet.
import ModelsContext from '../src/content-manager/contexts/ModelsContext';
@ -49,7 +49,10 @@ const Providers = ({ children, initialEntries }: ProvidersProps) => {
},
});
const store = createStore((state = initialState) => state, initialState);
const store = configureStore({
preloadedState: initialState,
reducer: (state = initialState) => state,
});
// en is the default locale of the admin app.
return (

View File

@ -1,12 +1,12 @@
import React from 'react';
import { configureStore } from '@reduxjs/toolkit';
import { fixtures } from '@strapi/admin-test-utils';
import { renderHook, waitFor } from '@testing-library/react';
import { rest } from 'msw';
import { setupServer } from 'msw/node';
import { QueryClient, QueryClientProvider } from 'react-query';
import { Provider } from 'react-redux';
import { createStore } from 'redux';
import { useLicenseLimits } from '../useLicenseLimits';
@ -42,8 +42,11 @@ const setup = (...args) =>
return (
<Provider
store={createStore((state) => state, {
admin_app: { permissions: fixtures.permissions.app },
store={configureStore({
reducer: (state) => state,
preloadedState: {
admin_app: { permissions: fixtures.permissions.app },
},
})}
>
<QueryClientProvider client={client}>{children}</QueryClientProvider>

View File

@ -1,12 +1,12 @@
import React from 'react';
import { configureStore } from '@reduxjs/toolkit';
import { fixtures } from '@strapi/admin-test-utils';
import { lightTheme, ThemeProvider } from '@strapi/design-system';
import { render } from '@testing-library/react';
import { IntlProvider } from 'react-intl';
import { QueryClient, QueryClientProvider } from 'react-query';
import { Provider } from 'react-redux';
import { createStore } from 'redux';
import { AdminSeatInfoEE } from '..';
import { useLicenseLimits } from '../../../../../../../hooks/useLicenseLimits';
@ -54,8 +54,11 @@ const setup = (props) =>
return (
<QueryClientProvider client={client}>
<Provider
store={createStore((state) => state, {
admin_app: { permissions: fixtures.permissions.app },
store={configureStore({
reducer: (state) => state,
preloadedState: {
admin_app: { permissions: fixtures.permissions.app },
},
})}
>
<ThemeProvider theme={lightTheme}>

View File

@ -1,5 +1,6 @@
import React from 'react';
import { configureStore } from '@reduxjs/toolkit';
import { fixtures } from '@strapi/admin-test-utils';
import { lightTheme, ThemeProvider } from '@strapi/design-system';
import { fireEvent, render, screen, waitFor, within } from '@testing-library/react';
@ -9,7 +10,6 @@ import { IntlProvider } from 'react-intl';
import { QueryClient, QueryClientProvider } from 'react-query';
import { Provider } from 'react-redux';
import { Router } from 'react-router-dom';
import { createStore } from 'redux';
import useAuditLogsData from '../hooks/useAuditLogsData';
import ListView from '../index';
@ -54,15 +54,18 @@ const setup = (props) => ({
return (
<Provider
store={createStore((state) => state, {
admin_app: {
permissions: {
...fixtures.permissions.app,
settings: {
...fixtures.permissions.app.settings,
auditLogs: {
main: [{ action: 'admin::audit-logs.read', subject: null }],
read: [{ action: 'admin::audit-logs.read', subject: null }],
store={configureStore({
reducer: (state) => state,
preloadedState: {
admin_app: {
permissions: {
...fixtures.permissions.app,
settings: {
...fixtures.permissions.app.settings,
auditLogs: {
main: [{ action: 'admin::audit-logs.read', subject: null }],
read: [{ action: 'admin::audit-logs.read', subject: null }],
},
},
},
},

View File

@ -1,5 +1,6 @@
import React from 'react';
import { configureStore } from '@reduxjs/toolkit';
import { lightTheme, ThemeProvider } from '@strapi/design-system';
import { render, waitFor } from '@testing-library/react';
import userEvent from '@testing-library/user-event';
@ -8,7 +9,6 @@ import { DndProvider } from 'react-dnd';
import { HTML5Backend } from 'react-dnd-html5-backend';
import { IntlProvider } from 'react-intl';
import { Provider } from 'react-redux';
import { createStore } from 'redux';
import { REDUX_NAMESPACE, STAGE_COLOR_DEFAULT } from '../../../../constants';
import { reducer } from '../../../../reducer';
@ -128,18 +128,21 @@ const ComponentFixture = ({
const setup = ({ roles, ...props } = {}) => ({
...render(<ComponentFixture {...props} />, {
wrapper({ children }) {
const store = createStore(reducer, {
[REDUX_NAMESPACE]: {
serverState: {
contentTypes: CONTENT_TYPES_FIXTURE,
roles: roles ?? ROLES_FIXTURE,
workflow: WORKFLOWS_FIXTURE[0],
workflows: WORKFLOWS_FIXTURE,
},
const store = configureStore({
reducer,
preloadedState: {
[REDUX_NAMESPACE]: {
serverState: {
contentTypes: CONTENT_TYPES_FIXTURE,
roles: roles ?? ROLES_FIXTURE,
workflow: WORKFLOWS_FIXTURE[0],
workflows: WORKFLOWS_FIXTURE,
},
clientState: {
currentWorkflow: {
data: WORKFLOWS_FIXTURE[0],
clientState: {
currentWorkflow: {
data: WORKFLOWS_FIXTURE[0],
},
},
},
},

View File

@ -1,5 +1,6 @@
import React from 'react';
import { configureStore } from '@reduxjs/toolkit';
import { ThemeProvider, lightTheme } from '@strapi/design-system';
import { render, waitFor } from '@testing-library/react';
import userEvent from '@testing-library/user-event';
@ -8,7 +9,6 @@ import { DndProvider } from 'react-dnd';
import { HTML5Backend } from 'react-dnd-html5-backend';
import { IntlProvider } from 'react-intl';
import { Provider } from 'react-redux';
import { createStore } from 'redux';
import { REDUX_NAMESPACE } from '../../../constants';
import { reducer } from '../../../reducer';
@ -92,21 +92,24 @@ const withMarkup = (query) => (text) =>
const setup = ({ collectionTypes, singleTypes, currentWorkflow, ...props } = {}) => ({
...render(<ComponentFixture currentWorkflow={currentWorkflow} {...props} />, {
wrapper({ children }) {
const store = createStore(reducer, {
[REDUX_NAMESPACE]: {
serverState: {
contentTypes: {
collectionTypes: collectionTypes || CONTENT_TYPES_FIXTURE.collectionTypes,
singleTypes: singleTypes || CONTENT_TYPES_FIXTURE.singleTypes,
const store = configureStore({
reducer,
preloadedState: {
[REDUX_NAMESPACE]: {
serverState: {
contentTypes: {
collectionTypes: collectionTypes || CONTENT_TYPES_FIXTURE.collectionTypes,
singleTypes: singleTypes || CONTENT_TYPES_FIXTURE.singleTypes,
},
roles: ROLES_FIXTURE,
workflow: WORKFLOWS_FIXTURE[0],
workflows: WORKFLOWS_FIXTURE,
},
roles: ROLES_FIXTURE,
workflow: WORKFLOWS_FIXTURE[0],
workflows: WORKFLOWS_FIXTURE,
},
clientState: {
currentWorkflow: {
data: currentWorkflow || WORKFLOWS_FIXTURE[0],
clientState: {
currentWorkflow: {
data: currentWorkflow || WORKFLOWS_FIXTURE[0],
},
},
},
},

View File

@ -1,5 +1,6 @@
import React from 'react';
import { configureStore } from '@reduxjs/toolkit';
import { fixtures } from '@strapi/admin-test-utils';
import { lightTheme, ThemeProvider } from '@strapi/design-system';
import { useRBAC } from '@strapi/helper-plugin';
@ -7,7 +8,6 @@ import { fireEvent, getByLabelText, render, waitFor } from '@testing-library/rea
import { IntlProvider } from 'react-intl';
import { QueryClient, QueryClientProvider } from 'react-query';
import { Provider } from 'react-redux';
import { createStore } from 'redux';
import { SingleSignOn } from '../index';
@ -33,16 +33,19 @@ const setup = (props) =>
return (
<QueryClientProvider client={client}>
<Provider
store={createStore((state) => state, {
admin_app: {
permissions: {
...fixtures.permissions.app,
settings: {
...fixtures.permissions.app.settings,
sso: {
main: [{ action: 'admin::provider-login.read', subject: null }],
read: [{ action: 'admin::provider-login.read', subject: null }],
update: [{ action: 'admin::provider-login.update', subject: null }],
store={configureStore({
reducer: (state) => state,
preloadedState: {
admin_app: {
permissions: {
...fixtures.permissions.app,
settings: {
...fixtures.permissions.app.settings,
sso: {
main: [{ action: 'admin::provider-login.read', subject: null }],
read: [{ action: 'admin::provider-login.read', subject: null }],
update: [{ action: 'admin::provider-login.update', subject: null }],
},
},
},
},

View File

@ -117,7 +117,6 @@
"react-router-dom": "5.3.4",
"react-select": "5.7.0",
"react-window": "1.8.8",
"redux": "^4.2.1",
"reselect": "4.1.7",
"rimraf": "3.0.2",
"sanitize-html": "2.11.0",

View File

@ -17,9 +17,8 @@ import set from 'lodash/set';
import size from 'lodash/size';
import PropTypes from 'prop-types';
import { useIntl } from 'react-intl';
import { connect, useDispatch } from 'react-redux';
import { useSelector, useDispatch } from 'react-redux';
import { Redirect, useLocation, useRouteMatch } from 'react-router-dom';
import { compose } from 'redux';
import DataManagerContext from '../../contexts/DataManagerContext';
import useFormModalNavigation from '../../hooks/useFormModalNavigation';
@ -58,17 +57,17 @@ import retrieveSpecificInfoFromComponents from './utils/retrieveSpecificInfoFrom
import serverRestartWatcher from './utils/serverRestartWatcher';
import validateSchema from './utils/validateSchema';
const DataManagerProvider = ({
children,
components,
contentTypes,
isLoading,
isLoadingForDataToBeSet,
initialData,
modifiedData,
reservedNames,
}) => {
const DataManagerProvider = ({ children }) => {
const dispatch = useDispatch();
const {
components,
contentTypes,
isLoading,
isLoadingForDataToBeSet,
initialData,
modifiedData,
reservedNames,
} = useSelector(makeSelectDataManagerProvider());
const toggleNotification = useNotification();
const { lockAppWithAutoreload, unlockAppWithAutoreload } = useAutoReloadOverlayBlocker();
const { setCurrentStep } = useGuidedTour();
@ -619,22 +618,8 @@ const DataManagerProvider = ({
);
};
DataManagerProvider.defaultProps = {
components: {},
};
DataManagerProvider.propTypes = {
children: PropTypes.node.isRequired,
components: PropTypes.object,
contentTypes: PropTypes.object.isRequired,
isLoading: PropTypes.bool.isRequired,
isLoadingForDataToBeSet: PropTypes.bool.isRequired,
initialData: PropTypes.object.isRequired,
modifiedData: PropTypes.object.isRequired,
reservedNames: PropTypes.object.isRequired,
};
const mapStateToProps = makeSelectDataManagerProvider();
const withConnect = connect(mapStateToProps, null);
export default compose(withConnect)(memo(DataManagerProvider));
export default memo(DataManagerProvider);

View File

@ -44,7 +44,6 @@
"react-helmet": "^6.1.0",
"react-intl": "6.4.1",
"react-redux": "8.1.1",
"redux": "^4.2.1",
"reselect": "4.1.7",
"yup": "0.32.9"
},

View File

@ -1,12 +1,12 @@
import React from 'react';
import { combineReducers, configureStore } from '@reduxjs/toolkit';
import { lightTheme, ThemeProvider } from '@strapi/design-system';
import { render as renderTL, waitFor } from '@testing-library/react';
import userEvent from '@testing-library/user-event';
import { IntlProvider } from 'react-intl';
import { QueryClient, QueryClientProvider } from 'react-query';
import { Provider } from 'react-redux';
import { combineReducers, createStore } from 'redux';
import LocaleSelect from '..';
import reducers from '../../../hooks/reducers';
@ -58,7 +58,9 @@ const queryClient = new QueryClient({
},
});
const store = createStore(combineReducers(reducers));
const store = configureStore({
reducer: combineReducers(reducers),
});
const render = (props) => ({
user: userEvent.setup(),

View File

@ -1,7 +1,7 @@
/* eslint-disable react/prop-types */
import React from 'react';
// import { createStore, combineReducers } from 'redux';
// import { configureStore, combineReducers } from '@reduxjs/toolkit';
// import { Provider } from 'react-redux';
// import { request, useRBAC } from '@strapi/helper-plugin';
// import { fireEvent, render, screen, within, waitFor } from '@testing-library/react';
@ -17,7 +17,10 @@ import React from 'react';
// const queryClient = new QueryClient();
// const rootReducer = combineReducers(i18nReducers);
// const store = createStore(rootReducer, { [`${pluginId}_locales`]: initialState });
// const store = configureStore({
// reducer: rootReducer,
// preloadedState: { [`${pluginId}_locales`]: initialState },
// });
// return (
// <Provider store={store}>

View File

@ -30,6 +30,7 @@
"test:unit:watch": "run -T jest --watch"
},
"dependencies": {
"@reduxjs/toolkit": "1.9.7",
"@strapi/design-system": "1.12.2",
"@strapi/helper-plugin": "4.14.4",
"@strapi/icons": "1.12.2",
@ -42,7 +43,6 @@
"react-intl": "6.4.1",
"react-query": "3.39.3",
"react-redux": "8.1.1",
"redux": "^4.2.1",
"yup": "0.32.9"
},
"devDependencies": {

View File

@ -6303,6 +6303,26 @@ __metadata:
languageName: node
linkType: hard
"@reduxjs/toolkit@npm:1.9.7":
version: 1.9.7
resolution: "@reduxjs/toolkit@npm:1.9.7"
dependencies:
immer: ^9.0.21
redux: ^4.2.1
redux-thunk: ^2.4.2
reselect: ^4.1.8
peerDependencies:
react: ^16.9.0 || ^17.0.0 || ^18
react-redux: ^7.2.1 || ^8.0.2
peerDependenciesMeta:
react:
optional: true
react-redux:
optional: true
checksum: ac25dec73a5d2df9fc7fbe98c14ccc73919e5ee1d6f251db0d2ec8f90273f92ef39c26716704bf56b5a40189f72d94b4526dc3a8c7ac3986f5daf44442bcc364
languageName: node
linkType: hard
"@rollup/pluginutils@npm:^5.0.2":
version: 5.0.2
resolution: "@rollup/pluginutils@npm:5.0.2"
@ -7399,15 +7419,16 @@ __metadata:
resolution: "@strapi/admin-test-utils@workspace:packages/admin-test-utils"
dependencies:
"@juggle/resize-observer": 3.4.0
"@reduxjs/toolkit": 1.9.7
"@strapi/pack-up": "workspace:*"
"@testing-library/jest-dom": 5.16.5
eslint-config-custom: 4.14.4
jest-styled-components: 7.1.1
redux: ^4.2.1
tsconfig: 4.14.4
whatwg-fetch: 3.6.2
peerDependencies:
redux: ^4.2.1
"@reduxjs/toolkit": ^1.9.7
"@testing-library/jest-dom": ^5.16.5
languageName: unknown
linkType: soft
@ -7418,6 +7439,7 @@ __metadata:
"@casl/ability": 6.5.0
"@pmmmwh/react-refresh-webpack-plugin": 0.5.10
"@radix-ui/react-toolbar": 1.0.4
"@reduxjs/toolkit": 1.9.7
"@strapi/admin-test-utils": 4.14.4
"@strapi/data-transfer": 4.14.4
"@strapi/design-system": 1.12.2
@ -7497,7 +7519,6 @@ __metadata:
react-router-dom: 5.3.4
react-select: 5.7.0
react-window: 1.8.8
redux: ^4.2.1
reselect: 4.1.7
rimraf: 3.0.2
sanitize-html: 2.11.0
@ -7877,7 +7898,6 @@ __metadata:
react-intl: 6.4.1
react-redux: 8.1.1
react-router-dom: 5.3.4
redux: ^4.2.1
reselect: 4.1.7
styled-components: 5.3.3
yup: 0.32.9
@ -8003,6 +8023,7 @@ __metadata:
version: 0.0.0-use.local
resolution: "@strapi/plugin-i18n@workspace:packages/plugins/i18n"
dependencies:
"@reduxjs/toolkit": 1.9.7
"@strapi/design-system": 1.12.2
"@strapi/helper-plugin": 4.14.4
"@strapi/icons": 1.12.2
@ -8020,7 +8041,6 @@ __metadata:
react-query: 3.39.3
react-redux: 8.1.1
react-router-dom: 5.3.4
redux: ^4.2.1
styled-components: 5.3.3
yup: 0.32.9
peerDependencies:
@ -19164,7 +19184,7 @@ __metadata:
languageName: node
linkType: hard
"immer@npm:^9.0.6":
"immer@npm:^9.0.21, immer@npm:^9.0.6":
version: 9.0.21
resolution: "immer@npm:9.0.21"
checksum: 70e3c274165995352f6936695f0ef4723c52c92c92dd0e9afdfe008175af39fa28e76aafb3a2ca9d57d1fb8f796efc4dd1e1cc36f18d33fa5b74f3dfb0375432
@ -27514,6 +27534,15 @@ __metadata:
languageName: node
linkType: hard
"redux-thunk@npm:^2.4.2":
version: 2.4.2
resolution: "redux-thunk@npm:2.4.2"
peerDependencies:
redux: ^4
checksum: c7f757f6c383b8ec26152c113e20087818d18ed3edf438aaad43539e9a6b77b427ade755c9595c4a163b6ad3063adf3497e5fe6a36c68884eb1f1cfb6f049a5c
languageName: node
linkType: hard
"redux@npm:^4.1.2":
version: 4.2.0
resolution: "redux@npm:4.2.0"
@ -27867,6 +27896,13 @@ __metadata:
languageName: node
linkType: hard
"reselect@npm:^4.1.8":
version: 4.1.8
resolution: "reselect@npm:4.1.8"
checksum: a4ac87cedab198769a29be92bc221c32da76cfdad6911eda67b4d3e7136dca86208c3b210e31632eae31ebd2cded18596f0dd230d3ccc9e978df22f233b5583e
languageName: node
linkType: hard
"resolve-alpn@npm:^1.0.0":
version: 1.2.1
resolution: "resolve-alpn@npm:1.2.1"