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.
		
		
		
		
		
			
		
			
				
					
					
						
							95 lines
						
					
					
						
							3.5 KiB
						
					
					
				
			
		
		
	
	
							95 lines
						
					
					
						
							3.5 KiB
						
					
					
				"use strict";
 | 
						|
 | 
						|
var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault");
 | 
						|
 | 
						|
exports.__esModule = true;
 | 
						|
exports.pureFinalPropsSelectorFactory = pureFinalPropsSelectorFactory;
 | 
						|
exports.default = finalPropsSelectorFactory;
 | 
						|
 | 
						|
var _objectWithoutPropertiesLoose2 = _interopRequireDefault(require("@babel/runtime/helpers/objectWithoutPropertiesLoose"));
 | 
						|
 | 
						|
var _verifySubselectors = _interopRequireDefault(require("./verifySubselectors"));
 | 
						|
 | 
						|
const _excluded = ["initMapStateToProps", "initMapDispatchToProps", "initMergeProps"];
 | 
						|
 | 
						|
function pureFinalPropsSelectorFactory(mapStateToProps, mapDispatchToProps, mergeProps, dispatch, {
 | 
						|
  areStatesEqual,
 | 
						|
  areOwnPropsEqual,
 | 
						|
  areStatePropsEqual
 | 
						|
}) {
 | 
						|
  let hasRunAtLeastOnce = false;
 | 
						|
  let state;
 | 
						|
  let ownProps;
 | 
						|
  let stateProps;
 | 
						|
  let dispatchProps;
 | 
						|
  let mergedProps;
 | 
						|
 | 
						|
  function handleFirstCall(firstState, firstOwnProps) {
 | 
						|
    state = firstState;
 | 
						|
    ownProps = firstOwnProps;
 | 
						|
    stateProps = mapStateToProps(state, ownProps);
 | 
						|
    dispatchProps = mapDispatchToProps(dispatch, ownProps);
 | 
						|
    mergedProps = mergeProps(stateProps, dispatchProps, ownProps);
 | 
						|
    hasRunAtLeastOnce = true;
 | 
						|
    return mergedProps;
 | 
						|
  }
 | 
						|
 | 
						|
  function handleNewPropsAndNewState() {
 | 
						|
    stateProps = mapStateToProps(state, ownProps);
 | 
						|
    if (mapDispatchToProps.dependsOnOwnProps) dispatchProps = mapDispatchToProps(dispatch, ownProps);
 | 
						|
    mergedProps = mergeProps(stateProps, dispatchProps, ownProps);
 | 
						|
    return mergedProps;
 | 
						|
  }
 | 
						|
 | 
						|
  function handleNewProps() {
 | 
						|
    if (mapStateToProps.dependsOnOwnProps) stateProps = mapStateToProps(state, ownProps);
 | 
						|
    if (mapDispatchToProps.dependsOnOwnProps) dispatchProps = mapDispatchToProps(dispatch, ownProps);
 | 
						|
    mergedProps = mergeProps(stateProps, dispatchProps, ownProps);
 | 
						|
    return mergedProps;
 | 
						|
  }
 | 
						|
 | 
						|
  function handleNewState() {
 | 
						|
    const nextStateProps = mapStateToProps(state, ownProps);
 | 
						|
    const statePropsChanged = !areStatePropsEqual(nextStateProps, stateProps);
 | 
						|
    stateProps = nextStateProps;
 | 
						|
    if (statePropsChanged) mergedProps = mergeProps(stateProps, dispatchProps, ownProps);
 | 
						|
    return mergedProps;
 | 
						|
  }
 | 
						|
 | 
						|
  function handleSubsequentCalls(nextState, nextOwnProps) {
 | 
						|
    const propsChanged = !areOwnPropsEqual(nextOwnProps, ownProps);
 | 
						|
    const stateChanged = !areStatesEqual(nextState, state, nextOwnProps, ownProps);
 | 
						|
    state = nextState;
 | 
						|
    ownProps = nextOwnProps;
 | 
						|
    if (propsChanged && stateChanged) return handleNewPropsAndNewState();
 | 
						|
    if (propsChanged) return handleNewProps();
 | 
						|
    if (stateChanged) return handleNewState();
 | 
						|
    return mergedProps;
 | 
						|
  }
 | 
						|
 | 
						|
  return function pureFinalPropsSelector(nextState, nextOwnProps) {
 | 
						|
    return hasRunAtLeastOnce ? handleSubsequentCalls(nextState, nextOwnProps) : handleFirstCall(nextState, nextOwnProps);
 | 
						|
  };
 | 
						|
}
 | 
						|
 | 
						|
// TODO: Add more comments
 | 
						|
// The selector returned by selectorFactory will memoize its results,
 | 
						|
// allowing connect's shouldComponentUpdate to return false if final
 | 
						|
// props have not changed.
 | 
						|
function finalPropsSelectorFactory(dispatch, _ref) {
 | 
						|
  let {
 | 
						|
    initMapStateToProps,
 | 
						|
    initMapDispatchToProps,
 | 
						|
    initMergeProps
 | 
						|
  } = _ref,
 | 
						|
      options = (0, _objectWithoutPropertiesLoose2.default)(_ref, _excluded);
 | 
						|
  const mapStateToProps = initMapStateToProps(dispatch, options);
 | 
						|
  const mapDispatchToProps = initMapDispatchToProps(dispatch, options);
 | 
						|
  const mergeProps = initMergeProps(dispatch, options);
 | 
						|
 | 
						|
  if (process.env.NODE_ENV !== 'production') {
 | 
						|
    (0, _verifySubselectors.default)(mapStateToProps, mapDispatchToProps, mergeProps);
 | 
						|
  }
 | 
						|
 | 
						|
  return pureFinalPropsSelectorFactory(mapStateToProps, mapDispatchToProps, mergeProps, dispatch, options);
 | 
						|
} |