mirror of
https://github.com/Telecominfraproject/wlan-cloud-ui.git
synced 2025-11-02 19:57:58 +00:00
45 lines
1.2 KiB
JavaScript
Executable File
45 lines
1.2 KiB
JavaScript
Executable File
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 {
|
|
constructor(props, context) {
|
|
super(props, context);
|
|
|
|
getInjectors(context.store).injectReducer(key, reducer);
|
|
}
|
|
|
|
static WrappedComponent = WrappedComponent;
|
|
|
|
render() {
|
|
return <WrappedComponent {...this.props} />;
|
|
}
|
|
}
|
|
|
|
ReducerInjector.displayName = `withReducer(${WrappedComponent.displayName ||
|
|
WrappedComponent.name ||
|
|
'Component'})`;
|
|
ReducerInjector.contextType = ReactReduxContext;
|
|
|
|
return hoistNonReactStatics(ReducerInjector, WrappedComponent);
|
|
};
|
|
|
|
const useInjectReducer = ({ key, reducer }) => {
|
|
const context = React.useContext(ReactReduxContext);
|
|
React.useEffect(() => {
|
|
getInjectors(context.store).injectReducer(key, reducer);
|
|
}, []);
|
|
};
|
|
|
|
export { useInjectReducer };
|