From d252d9da2d62e3880cc4e59ad898bb69f5d5e43f Mon Sep 17 00:00:00 2001 From: Gustav Hansen Date: Fri, 20 Jan 2023 17:51:59 +0100 Subject: [PATCH] Admin: Allow reducers to be injected async into the store Co-authored-by: Josh Ellis --- .../admin/src/core/store/configureStore.js | 26 ++++++++++++++++--- .../admin/src/core/store/createReducer.js | 5 ---- 2 files changed, 22 insertions(+), 9 deletions(-) delete mode 100644 packages/core/admin/admin/src/core/store/createReducer.js diff --git a/packages/core/admin/admin/src/core/store/configureStore.js b/packages/core/admin/admin/src/core/store/configureStore.js index b95d6223d6..a25be1a4f5 100644 --- a/packages/core/admin/admin/src/core/store/configureStore.js +++ b/packages/core/admin/admin/src/core/store/configureStore.js @@ -1,5 +1,4 @@ -import { createStore, applyMiddleware, compose } from 'redux'; -import createReducer from './createReducer'; +import { createStore, applyMiddleware, compose, combineReducers } from 'redux'; const configureStore = (appMiddlewares, appReducers) => { let composeEnhancers = compose; @@ -19,11 +18,30 @@ const configureStore = (appMiddlewares, appReducers) => { composeEnhancers = window.__REDUX_DEVTOOLS_EXTENSION_COMPOSE__({}); } - return createStore( - createReducer(appReducers), + const store = createStore( + createReducer(appReducers, {}), {}, composeEnhancers(applyMiddleware(...middlewares)) ); + + // Add a dictionary to keep track of the registered async reducers + store.asyncReducers = {}; + + // Create an inject reducer function + // This function adds the async reducer, and creates a new combined reducer + store.injectReducer = (key, asyncReducer) => { + store.asyncReducers[key] = asyncReducer; + store.replaceReducer(createReducer(appReducers, store.asyncReducers)); + }; + + return store; +}; + +const createReducer = (appReducers, asyncReducers) => { + return combineReducers({ + ...appReducers, + ...asyncReducers, + }); }; export default configureStore; diff --git a/packages/core/admin/admin/src/core/store/createReducer.js b/packages/core/admin/admin/src/core/store/createReducer.js deleted file mode 100644 index 2c643423b2..0000000000 --- a/packages/core/admin/admin/src/core/store/createReducer.js +++ /dev/null @@ -1,5 +0,0 @@ -import { combineReducers } from 'redux'; - -const createReducer = (reducers) => combineReducers(reducers); - -export default createReducer;