all files / modules/ computeChangedRoutes.js

100% Statements 23/23
100% Branches 10/10
100% Functions 5/5
100% Lines 20/20
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53                                  92× 92×   92× 92× 16×         16×     83× 83×     92×                
import { getParamNames } from './PatternUtils'
 
function routeParamsChanged(route, prevState, nextState) {
  if (!route.path)
    return false
 
  const paramNames = getParamNames(route.path)
 
  return paramNames.some(function (paramName) {
    return prevState.params[paramName] !== nextState.params[paramName]
  })
}
 
/**
 * Returns an object of { leaveRoutes, enterRoutes } determined by
 * the change from prevState to nextState. We leave routes if either
 * 1) they are not in the next state or 2) they are in the next state
 * but their params have changed (i.e. /users/123 => /users/456).
 *
 * leaveRoutes are ordered starting at the leaf route of the tree
 * we're leaving up to the common parent route. enterRoutes are ordered
 * from the top of the tree we're entering down to the leaf route.
 */
function computeChangedRoutes(prevState, nextState) {
  const prevRoutes = prevState && prevState.routes
  const nextRoutes = nextState.routes
 
  let leaveRoutes, enterRoutes
  if (prevRoutes) {
    leaveRoutes = prevRoutes.filter(function (route) {
      return nextRoutes.indexOf(route) === -1 || routeParamsChanged(route, prevState, nextState)
    })
 
    // onLeave hooks start at the leaf route.
    leaveRoutes.reverse()
 
    enterRoutes = nextRoutes.filter(function (route) {
      return prevRoutes.indexOf(route) === -1 || leaveRoutes.indexOf(route) !== -1
    })
  } else {
    leaveRoutes = []
    enterRoutes = nextRoutes
  }
 
  return {
    leaveRoutes,
    enterRoutes
  }
}
 
export default computeChangedRoutes