You can not select more than 25 topics
			Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
		
		
		
		
		
			
		
			
				
					70 lines
				
				3.0 KiB
			
		
		
			
		
	
	
					70 lines
				
				3.0 KiB
			| 
								 
											3 years ago
										 
									 | 
							
								import verifyPlainObject from '../utils/verifyPlainObject';
							 | 
						||
| 
								 | 
							
								export 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?
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								export 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.
							 | 
						||
| 
								 | 
							
								//
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								export 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') verifyPlainObject(props, displayName, methodName);
							 | 
						||
| 
								 | 
							
								      return props;
							 | 
						||
| 
								 | 
							
								    };
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								    return proxy;
							 | 
						||
| 
								 | 
							
								  };
							 | 
						||
| 
								 | 
							
								}
							 |