diff --git a/.github/dependabot.yml b/.github/dependabot.yml
index 1342f97998..7323fe6597 100644
--- a/.github/dependabot.yml
+++ b/.github/dependabot.yml
@@ -31,7 +31,7 @@ updates:
redux:
patterns:
- - 'redux'
+ - '@reduxjs/toolkit'
- 'react-redux'
richtext-editor:
diff --git a/examples/getstarted/types/generated/contentTypes.d.ts b/examples/getstarted/types/generated/contentTypes.d.ts
index cbf8698cd1..aac4b97af3 100644
--- a/examples/getstarted/types/generated/contentTypes.d.ts
+++ b/examples/getstarted/types/generated/contentTypes.d.ts
@@ -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;
}
}
}
diff --git a/packages/admin-test-utils/package.json b/packages/admin-test-utils/package.json
index 09e914d4a7..3e5dd40e49 100644
--- a/packages/admin-test-utils/package.json
+++ b/packages/admin-test-utils/package.json
@@ -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"
diff --git a/packages/admin-test-utils/src/fixtures/store/index.ts b/packages/admin-test-utils/src/fixtures/store/index.ts
index e74b0e0400..3c1d0160f4 100644
--- a/packages/admin-test-utils/src/fixtures/store/index.ts
+++ b/packages/admin-test-utils/src/fixtures/store/index.ts
@@ -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,
diff --git a/packages/core/admin/admin/src/content-manager/pages/ListView/components/BulkActionButtons/tests/index.test.js b/packages/core/admin/admin/src/content-manager/pages/ListView/components/BulkActionButtons/tests/index.test.js
index b085d84a76..385851514a 100644
--- a/packages/core/admin/admin/src/content-manager/pages/ListView/components/BulkActionButtons/tests/index.test.js
+++ b/packages/core/admin/admin/src/content-manager/pages/ListView/components/BulkActionButtons/tests/index.test.js
@@ -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', () => () =>
SelectedEntriesModal
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',
+ },
},
},
},
diff --git a/packages/core/admin/admin/src/content-manager/pages/ListView/components/FieldPicker/tests/index.test.js b/packages/core/admin/admin/src/content-manager/pages/ListView/components/FieldPicker/tests/index.test.js
index 6671dc408d..630eb827ae 100644
--- a/packages/core/admin/admin/src/content-manager/pages/ListView/components/FieldPicker/tests/index.test.js
+++ b/packages/core/admin/admin/src/content-manager/pages/ListView/components/FieldPicker/tests/index.test.js
@@ -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(, {
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 },
- },
- ],
},
});
diff --git a/packages/core/admin/admin/src/content-manager/pages/ListView/index.js b/packages/core/admin/admin/src/content-manager/pages/ListView/index.js
index 3bf3134043..7432c65f80 100644
--- a/packages/core/admin/admin/src/content-manager/pages/ListView/index.js
+++ b/packages/core/admin/admin/src/content-manager/pages/ListView/index.js
@@ -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);
diff --git a/packages/core/admin/admin/src/pages/SettingsPage/pages/ApiTokens/EditView/tests/index.test.js b/packages/core/admin/admin/src/pages/SettingsPage/pages/ApiTokens/EditView/tests/index.test.js
index ef3af6745e..18ac130492 100644
--- a/packages/core/admin/admin/src/pages/SettingsPage/pages/ApiTokens/EditView/tests/index.test.js
+++ b/packages/core/admin/admin/src/pages/SettingsPage/pages/ApiTokens/EditView/tests/index.test.js
@@ -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 (
state, {
- admin_app: { permissions: fixtures.permissions.app },
+ store={configureStore({
+ reducer: (state) => state,
+ preloadedState: {
+ admin_app: { permissions: fixtures.permissions.app },
+ },
})}
>
diff --git a/packages/core/admin/admin/src/pages/SettingsPage/pages/ApiTokens/ListView/tests/index.test.js b/packages/core/admin/admin/src/pages/SettingsPage/pages/ApiTokens/ListView/tests/index.test.js
index 3f49265c62..0fde16603c 100644
--- a/packages/core/admin/admin/src/pages/SettingsPage/pages/ApiTokens/ListView/tests/index.test.js
+++ b/packages/core/admin/admin/src/pages/SettingsPage/pages/ApiTokens/ListView/tests/index.test.js
@@ -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 (
state, {
- admin_app: { permissions: { ...fixtures.permissions.app } },
+ store={configureStore({
+ reducer: (state) => state,
+ preloadedState: {
+ admin_app: { permissions: fixtures.permissions.app },
+ },
})}
>
diff --git a/packages/core/admin/admin/src/pages/SettingsPage/pages/Roles/ListPage/tests/index.test.js b/packages/core/admin/admin/src/pages/SettingsPage/pages/Roles/ListPage/tests/index.test.js
index f1bd8f6cd1..caa8273b36 100644
--- a/packages/core/admin/admin/src/pages/SettingsPage/pages/Roles/ListPage/tests/index.test.js
+++ b/packages/core/admin/admin/src/pages/SettingsPage/pages/Roles/ListPage/tests/index.test.js
@@ -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 (
state, {
- admin_app: { permissions: fixtures.permissions.app },
+ store={configureStore({
+ reducer: (state) => state,
+ preloadedState: {
+ admin_app: { permissions: fixtures.permissions.app },
+ },
})}
>
diff --git a/packages/core/admin/admin/src/pages/SettingsPage/pages/Users/ListPage/tests/index.test.js b/packages/core/admin/admin/src/pages/SettingsPage/pages/Users/ListPage/tests/index.test.js
index 5db647a7a2..706f3b2c35 100644
--- a/packages/core/admin/admin/src/pages/SettingsPage/pages/Users/ListPage/tests/index.test.js
+++ b/packages/core/admin/admin/src/pages/SettingsPage/pages/Users/ListPage/tests/index.test.js
@@ -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 (
state, {
- admin_app: { permissions: fixtures.permissions.app },
+ store={configureStore({
+ reducer: (state) => state,
+ preloadedState: {
+ admin_app: { permissions: fixtures.permissions.app },
+ },
})}
>
diff --git a/packages/core/admin/admin/tests/utils.tsx b/packages/core/admin/admin/tests/utils.tsx
index 490af22ff7..525457fc59 100644
--- a/packages/core/admin/admin/tests/utils.tsx
+++ b/packages/core/admin/admin/tests/utils.tsx
@@ -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 (
diff --git a/packages/core/admin/ee/admin/hooks/tests/useLicenseLimits.test.js b/packages/core/admin/ee/admin/hooks/tests/useLicenseLimits.test.js
index 1b71c94002..5034af2bd1 100644
--- a/packages/core/admin/ee/admin/hooks/tests/useLicenseLimits.test.js
+++ b/packages/core/admin/ee/admin/hooks/tests/useLicenseLimits.test.js
@@ -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 (
state, {
- admin_app: { permissions: fixtures.permissions.app },
+ store={configureStore({
+ reducer: (state) => state,
+ preloadedState: {
+ admin_app: { permissions: fixtures.permissions.app },
+ },
})}
>
{children}
diff --git a/packages/core/admin/ee/admin/pages/SettingsPage/pages/ApplicationInfosPage/components/AdminSeatInfo/tests/index.test.js b/packages/core/admin/ee/admin/pages/SettingsPage/pages/ApplicationInfosPage/components/AdminSeatInfo/tests/index.test.js
index ac8c15f27e..91f2e566d7 100644
--- a/packages/core/admin/ee/admin/pages/SettingsPage/pages/ApplicationInfosPage/components/AdminSeatInfo/tests/index.test.js
+++ b/packages/core/admin/ee/admin/pages/SettingsPage/pages/ApplicationInfosPage/components/AdminSeatInfo/tests/index.test.js
@@ -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 (
state, {
- admin_app: { permissions: fixtures.permissions.app },
+ store={configureStore({
+ reducer: (state) => state,
+ preloadedState: {
+ admin_app: { permissions: fixtures.permissions.app },
+ },
})}
>
diff --git a/packages/core/admin/ee/admin/pages/SettingsPage/pages/AuditLogs/ListView/tests/index.test.js b/packages/core/admin/ee/admin/pages/SettingsPage/pages/AuditLogs/ListView/tests/index.test.js
index 36d22f43d7..7ce08c5144 100644
--- a/packages/core/admin/ee/admin/pages/SettingsPage/pages/AuditLogs/ListView/tests/index.test.js
+++ b/packages/core/admin/ee/admin/pages/SettingsPage/pages/AuditLogs/ListView/tests/index.test.js
@@ -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 (
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 }],
+ },
},
},
},
diff --git a/packages/core/admin/ee/admin/pages/SettingsPage/pages/ReviewWorkflows/components/Stages/Stage/tests/Stage.test.js b/packages/core/admin/ee/admin/pages/SettingsPage/pages/ReviewWorkflows/components/Stages/Stage/tests/Stage.test.js
index f7a060f1de..f0a19ca796 100644
--- a/packages/core/admin/ee/admin/pages/SettingsPage/pages/ReviewWorkflows/components/Stages/Stage/tests/Stage.test.js
+++ b/packages/core/admin/ee/admin/pages/SettingsPage/pages/ReviewWorkflows/components/Stages/Stage/tests/Stage.test.js
@@ -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(, {
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],
+ },
},
},
},
diff --git a/packages/core/admin/ee/admin/pages/SettingsPage/pages/ReviewWorkflows/components/WorkflowAttributes/tests/WorkflowAttributes.test.js b/packages/core/admin/ee/admin/pages/SettingsPage/pages/ReviewWorkflows/components/WorkflowAttributes/tests/WorkflowAttributes.test.js
index 6a73ff596f..39a197ae3a 100644
--- a/packages/core/admin/ee/admin/pages/SettingsPage/pages/ReviewWorkflows/components/WorkflowAttributes/tests/WorkflowAttributes.test.js
+++ b/packages/core/admin/ee/admin/pages/SettingsPage/pages/ReviewWorkflows/components/WorkflowAttributes/tests/WorkflowAttributes.test.js
@@ -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(, {
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],
+ },
},
},
},
diff --git a/packages/core/admin/ee/admin/pages/SettingsPage/pages/SingleSignOn/tests/index.test.js b/packages/core/admin/ee/admin/pages/SettingsPage/pages/SingleSignOn/tests/index.test.js
index dae23cbdaa..923f306056 100644
--- a/packages/core/admin/ee/admin/pages/SettingsPage/pages/SingleSignOn/tests/index.test.js
+++ b/packages/core/admin/ee/admin/pages/SettingsPage/pages/SingleSignOn/tests/index.test.js
@@ -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 (
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 }],
+ },
},
},
},
diff --git a/packages/core/admin/package.json b/packages/core/admin/package.json
index 8aa29b1ee2..80f7d4915e 100644
--- a/packages/core/admin/package.json
+++ b/packages/core/admin/package.json
@@ -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",
diff --git a/packages/core/content-type-builder/admin/src/components/DataManagerProvider/index.js b/packages/core/content-type-builder/admin/src/components/DataManagerProvider/index.js
index 83c12d569e..f1d14d2366 100644
--- a/packages/core/content-type-builder/admin/src/components/DataManagerProvider/index.js
+++ b/packages/core/content-type-builder/admin/src/components/DataManagerProvider/index.js
@@ -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);
diff --git a/packages/core/content-type-builder/package.json b/packages/core/content-type-builder/package.json
index 10a1787f2d..0ed2362fec 100644
--- a/packages/core/content-type-builder/package.json
+++ b/packages/core/content-type-builder/package.json
@@ -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"
},
diff --git a/packages/plugins/i18n/admin/src/components/LocaleSelect/tests/LocaleSelect.test.js b/packages/plugins/i18n/admin/src/components/LocaleSelect/tests/LocaleSelect.test.js
index ac0323279a..26f771348d 100644
--- a/packages/plugins/i18n/admin/src/components/LocaleSelect/tests/LocaleSelect.test.js
+++ b/packages/plugins/i18n/admin/src/components/LocaleSelect/tests/LocaleSelect.test.js
@@ -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(),
diff --git a/packages/plugins/i18n/admin/src/pages/SettingsPage/tests/SettingsPage.test.js b/packages/plugins/i18n/admin/src/pages/SettingsPage/tests/SettingsPage.test.js
index 070ce3fb56..a892257bca 100644
--- a/packages/plugins/i18n/admin/src/pages/SettingsPage/tests/SettingsPage.test.js
+++ b/packages/plugins/i18n/admin/src/pages/SettingsPage/tests/SettingsPage.test.js
@@ -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 (
//
diff --git a/packages/plugins/i18n/package.json b/packages/plugins/i18n/package.json
index 8d7b0339be..039566fe23 100644
--- a/packages/plugins/i18n/package.json
+++ b/packages/plugins/i18n/package.json
@@ -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": {
diff --git a/yarn.lock b/yarn.lock
index 26c97182b6..51df8d82f1 100644
--- a/yarn.lock
+++ b/yarn.lock
@@ -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"