82 lines
3.3 KiB
JavaScript
82 lines
3.3 KiB
JavaScript
|
"use strict";
|
||
|
|
||
|
var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault");
|
||
|
|
||
|
exports.__esModule = true;
|
||
|
exports.wrapMapToPropsConstant = wrapMapToPropsConstant;
|
||
|
exports.getDependsOnOwnProps = getDependsOnOwnProps;
|
||
|
exports.wrapMapToPropsFunc = wrapMapToPropsFunc;
|
||
|
|
||
|
var _verifyPlainObject = _interopRequireDefault(require("../utils/verifyPlainObject"));
|
||
|
|
||
|
function wrapMapToPropsConstant( // * Note:
|
||
|
// It seems that the dispatch argument
|
||
|
// could be a dispatch function in some cases (ex: whenMapDispatchToPropsIsMissing)
|
||
|
// and a state object in some others (ex: whenMapStateToPropsIsMissing)
|
||
|
// eslint-disable-next-line no-unused-vars
|
||
|
getConstant) {
|
||
|
return function initConstantSelector(dispatch) {
|
||
|
const constant = getConstant(dispatch);
|
||
|
|
||
|
function constantSelector() {
|
||
|
return constant;
|
||
|
}
|
||
|
|
||
|
constantSelector.dependsOnOwnProps = false;
|
||
|
return constantSelector;
|
||
|
};
|
||
|
} // dependsOnOwnProps is used by createMapToPropsProxy to determine whether to pass props as args
|
||
|
// to the mapToProps function being wrapped. It is also used by makePurePropsSelector to determine
|
||
|
// whether mapToProps needs to be invoked when props have changed.
|
||
|
//
|
||
|
// A length of one signals that mapToProps does not depend on props from the parent component.
|
||
|
// A length of zero is assumed to mean mapToProps is getting args via arguments or ...args and
|
||
|
// therefore not reporting its length accurately..
|
||
|
// TODO Can this get pulled out so that we can subscribe directly to the store if we don't need ownProps?
|
||
|
|
||
|
|
||
|
function getDependsOnOwnProps(mapToProps) {
|
||
|
return mapToProps.dependsOnOwnProps ? Boolean(mapToProps.dependsOnOwnProps) : mapToProps.length !== 1;
|
||
|
} // Used by whenMapStateToPropsIsFunction and whenMapDispatchToPropsIsFunction,
|
||
|
// this function wraps mapToProps in a proxy function which does several things:
|
||
|
//
|
||
|
// * Detects whether the mapToProps function being called depends on props, which
|
||
|
// is used by selectorFactory to decide if it should reinvoke on props changes.
|
||
|
//
|
||
|
// * On first call, handles mapToProps if returns another function, and treats that
|
||
|
// new function as the true mapToProps for subsequent calls.
|
||
|
//
|
||
|
// * On first call, verifies the first result is a plain object, in order to warn
|
||
|
// the developer that their mapToProps function is not returning a valid result.
|
||
|
//
|
||
|
|
||
|
|
||
|
function wrapMapToPropsFunc(mapToProps, methodName) {
|
||
|
return function initProxySelector(dispatch, {
|
||
|
displayName
|
||
|
}) {
|
||
|
const proxy = function mapToPropsProxy(stateOrDispatch, ownProps) {
|
||
|
return proxy.dependsOnOwnProps ? proxy.mapToProps(stateOrDispatch, ownProps) : proxy.mapToProps(stateOrDispatch, undefined);
|
||
|
}; // allow detectFactoryAndVerify to get ownProps
|
||
|
|
||
|
|
||
|
proxy.dependsOnOwnProps = true;
|
||
|
|
||
|
proxy.mapToProps = function detectFactoryAndVerify(stateOrDispatch, ownProps) {
|
||
|
proxy.mapToProps = mapToProps;
|
||
|
proxy.dependsOnOwnProps = getDependsOnOwnProps(mapToProps);
|
||
|
let props = proxy(stateOrDispatch, ownProps);
|
||
|
|
||
|
if (typeof props === 'function') {
|
||
|
proxy.mapToProps = props;
|
||
|
proxy.dependsOnOwnProps = getDependsOnOwnProps(props);
|
||
|
props = proxy(stateOrDispatch, ownProps);
|
||
|
}
|
||
|
|
||
|
if (process.env.NODE_ENV !== 'production') (0, _verifyPlainObject.default)(props, displayName, methodName);
|
||
|
return props;
|
||
|
};
|
||
|
|
||
|
return proxy;
|
||
|
};
|
||
|
}
|