redux-wired
Version:
Redux-Wired help you improves react applications that use the redux library
94 lines (78 loc) • 2.6 kB
JavaScript
import React, { createContext, useContext } from 'react';
import { useSelector, useDispatch } from 'react-redux';
import getArguments from 'es-arguments';
function _extends() {
_extends = Object.assign || function (target) {
for (var i = 1; i < arguments.length; i++) {
var source = arguments[i];
for (var key in source) {
if (Object.prototype.hasOwnProperty.call(source, key)) {
target[key] = source[key];
}
}
}
return target;
};
return _extends.apply(this, arguments);
}
var WiredContext = createContext(null);
function getDefaultProps(component) {
if (component.defaultProps) {
return Object.keys(component.defaultProps);
}
var componentArguments = getComponentProps(component);
return Object.values(componentArguments);
}
function getComponentProps(component) {
var _getArguments = getArguments(component),
args = _getArguments[0];
var argsArray = args.split(',');
argsArray = argsArray.map(function (arg) {
return arg.replace(/[{}]/g, '').trim();
});
return _extends({}, argsArray);
}
function useAction(action) {
var dispatch = useDispatch();
return function (value) {
return dispatch(action(value));
};
}
function useWired(reduxBundle, componentProp, handleHook) {
var propsFromStore;
Object.values(reduxBundle).forEach(function (func) {
propsFromStore = updatePropsWithStore(func, componentProp, handleHook);
});
return propsFromStore;
}
var updatePropsWithStore = function updatePropsWithStore(func, componentProp, handleHook) {
return _extends({}, func(componentProp, handleHook));
};
var WProvider = function WProvider(_ref) {
var wired = _ref.wired,
children = _ref.children;
return /*#__PURE__*/React.createElement(WiredContext.Provider, {
value: wired
}, children);
};
var wiredUp = function wiredUp(WrappedComponent) {
return function (props) {
var _useContext = useContext(WiredContext),
actions = _useContext.actions,
selectors = _useContext.selectors;
var defaultProps = getDefaultProps(WrappedComponent);
var newProps = props;
defaultProps.forEach(function (componentProp) {
newProps = _extends({}, newProps, {}, useWired(actions, componentProp, useAction), {}, useWired(selectors, componentProp, useSelector));
});
return /*#__PURE__*/React.createElement(WrappedComponent, newProps);
};
};
var wired = function wired(actions, selectors) {
return {
actions: actions,
selectors: selectors
};
};
export { WProvider, wired, wiredUp };
//# sourceMappingURL=index.modern.js.map