summaryrefslogtreecommitdiffstats
path: root/front/odiparpack/app/utils/reducerInjectors.js
diff options
context:
space:
mode:
Diffstat (limited to 'front/odiparpack/app/utils/reducerInjectors.js')
-rw-r--r--front/odiparpack/app/utils/reducerInjectors.js33
1 files changed, 33 insertions, 0 deletions
diff --git a/front/odiparpack/app/utils/reducerInjectors.js b/front/odiparpack/app/utils/reducerInjectors.js
new file mode 100644
index 0000000..d664680
--- /dev/null
+++ b/front/odiparpack/app/utils/reducerInjectors.js
@@ -0,0 +1,33 @@
+import invariant from 'invariant';
+import { isEmpty, isFunction, isString } from 'lodash';
+
+import checkStore from './checkStore';
+import createReducer from '../redux/reducers';
+
+export function injectReducerFactory(store, isValid) {
+ return function injectReducer(key, reducer) {
+ if (!isValid) checkStore(store);
+
+ invariant(
+ isString(key) && !isEmpty(key) && isFunction(reducer),
+ '(app/utils...) injectReducer: Expected `reducer` to be a reducer function',
+ );
+
+ // Check `store.injectedReducers[key] === reducer` for hot reloading when a key is the same but a reducer is different
+ if (
+ Reflect.has(store.injectedReducers, key)
+ && store.injectedReducers[key] === reducer
+ ) return;
+
+ store.injectedReducers[key] = reducer; // eslint-disable-line no-param-reassign
+ store.replaceReducer(createReducer(store.injectedReducers));
+ };
+}
+
+export default function getInjectors(store) {
+ checkStore(store);
+
+ return {
+ injectReducer: injectReducerFactory(store, true),
+ };
+}