summaryrefslogtreecommitdiffstats
path: root/front/odiparpack/app/utils/injectReducer.js
diff options
context:
space:
mode:
Diffstat (limited to 'front/odiparpack/app/utils/injectReducer.js')
-rw-r--r--front/odiparpack/app/utils/injectReducer.js45
1 files changed, 45 insertions, 0 deletions
diff --git a/front/odiparpack/app/utils/injectReducer.js b/front/odiparpack/app/utils/injectReducer.js
new file mode 100644
index 0000000..13833c2
--- /dev/null
+++ b/front/odiparpack/app/utils/injectReducer.js
@@ -0,0 +1,45 @@
+import React from 'react';
+import hoistNonReactStatics from 'hoist-non-react-statics';
+import { ReactReduxContext } from 'react-redux';
+
+import getInjectors from './reducerInjectors';
+
+/**
+ * Dynamically injects a reducer
+ *
+ * @param {string} key A key of the reducer
+ * @param {function} reducer A reducer that will be injected
+ *
+ */
+export default ({ key, reducer }) => WrappedComponent => {
+ class ReducerInjector extends React.Component {
+ static WrappedComponent = WrappedComponent;
+
+ static contextType = ReactReduxContext;
+
+ static displayName = `withReducer(${WrappedComponent.displayName
+ || WrappedComponent.name
+ || 'Component'})`;
+
+ constructor(props, context) {
+ super(props, context);
+
+ getInjectors(context.store).injectReducer(key, reducer);
+ }
+
+ render() {
+ return <WrappedComponent {...this.props} />;
+ }
+ }
+
+ return hoistNonReactStatics(ReducerInjector, WrappedComponent);
+};
+
+const useInjectReducer = ({ key, reducer }) => {
+ const context = React.useContext(ReactReduxContext);
+ React.useEffect(() => {
+ getInjectors(context.store).injectReducer(key, reducer);
+ }, []);
+};
+
+export { useInjectReducer };