UNPKG

react-router

Version:

A complete routing library for React.js

86 lines (63 loc) 2.45 kB
'use strict'; Object.defineProperty(exports, '__esModule', { value: true }); function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { 'default': obj }; } var _react = require('react'); var _react2 = _interopRequireDefault(_react); var _DOMUtils = require('./DOMUtils'); var _NavigationTypes = require('./NavigationTypes'); var _NavigationTypes2 = _interopRequireDefault(_NavigationTypes); var func = _react2['default'].PropTypes.func; function getCommonAncestors(branch, otherBranch) { return branch.filter(function (route) { return otherBranch.indexOf(route) !== -1; }); } function shouldUpdateScrollPosition(state, prevState) { var location = state.location; var branch = state.branch; var prevLocation = prevState.location; var prevBranch = prevState.branch; // Don't update scroll position if only the query has changed. if (location.pathname === prevLocation.pathname) return false; // Don't update scroll position if any of the ancestors // has `ignoreScrollPosition` set to `true` on the route. var sharedAncestors = getCommonAncestors(branch, prevBranch); if (sharedAncestors.some(function (route) { return route.ignoreScrollBehavior; })) return false; return true; } function updateWindowScrollPosition(navigationType, scrollX, scrollY) { if (_DOMUtils.canUseDOM) { if (navigationType === _NavigationTypes2['default'].POP) { (0, _DOMUtils.setWindowScrollPosition)(scrollX, scrollY); } else { (0, _DOMUtils.setWindowScrollPosition)(0, 0); } } } var ScrollManagementMixin = { propTypes: { shouldUpdateScrollPosition: func.isRequired, updateScrollPosition: func.isRequired }, getDefaultProps: function getDefaultProps() { return { shouldUpdateScrollPosition: shouldUpdateScrollPosition, updateScrollPosition: updateWindowScrollPosition }; }, componentDidUpdate: function componentDidUpdate(prevProps, prevState) { var location = this.state.location; var locationState = location && location.state; if (locationState && this.props.shouldUpdateScrollPosition(this.state, prevState)) { var scrollX = locationState.scrollX; var scrollY = locationState.scrollY; if (scrollX != null && scrollY != null) this.props.updateScrollPosition(location.navigationType, scrollX, scrollY); } } }; exports['default'] = ScrollManagementMixin; module.exports = exports['default'];