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.
		
		
		
		
		
			
		
			
				
					84 lines
				
				3.2 KiB
			
		
		
			
		
	
	
					84 lines
				
				3.2 KiB
			| 
								 
											3 years ago
										 
									 | 
							
								import _objectWithoutPropertiesLoose from "@babel/runtime/helpers/esm/objectWithoutPropertiesLoose";
							 | 
						||
| 
								 | 
							
								const _excluded = ["initMapStateToProps", "initMapDispatchToProps", "initMergeProps"];
							 | 
						||
| 
								 | 
							
								import verifySubselectors from './verifySubselectors';
							 | 
						||
| 
								 | 
							
								export 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.
							 | 
						||
| 
								 | 
							
								export default function finalPropsSelectorFactory(dispatch, _ref) {
							 | 
						||
| 
								 | 
							
								  let {
							 | 
						||
| 
								 | 
							
								    initMapStateToProps,
							 | 
						||
| 
								 | 
							
								    initMapDispatchToProps,
							 | 
						||
| 
								 | 
							
								    initMergeProps
							 | 
						||
| 
								 | 
							
								  } = _ref,
							 | 
						||
| 
								 | 
							
								      options = _objectWithoutPropertiesLoose(_ref, _excluded);
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								  const mapStateToProps = initMapStateToProps(dispatch, options);
							 | 
						||
| 
								 | 
							
								  const mapDispatchToProps = initMapDispatchToProps(dispatch, options);
							 | 
						||
| 
								 | 
							
								  const mergeProps = initMergeProps(dispatch, options);
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								  if (process.env.NODE_ENV !== 'production') {
							 | 
						||
| 
								 | 
							
								    verifySubselectors(mapStateToProps, mapDispatchToProps, mergeProps);
							 | 
						||
| 
								 | 
							
								  }
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								  return pureFinalPropsSelectorFactory(mapStateToProps, mapDispatchToProps, mergeProps, dispatch, options);
							 | 
						||
| 
								 | 
							
								}
							 |