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"