From 31b6ff6d1af6ef5f5bba156694acb2d7cfa69f90 Mon Sep 17 00:00:00 2001 From: Eric Vicenti Date: Tue, 7 Apr 2015 16:03:35 -0700 Subject: [PATCH] [ReactNative] Replace Backstack with BackAndroid --- .../CustomComponents/Navigator/Navigator.js | 136 ++---------------- Libraries/Utilities/BackAndroid.ios.js | 21 +++ Libraries/Utilities/Backstack.ios.js | 16 --- 3 files changed, 32 insertions(+), 141 deletions(-) create mode 100644 Libraries/Utilities/BackAndroid.ios.js delete mode 100644 Libraries/Utilities/Backstack.ios.js diff --git a/Libraries/CustomComponents/Navigator/Navigator.js b/Libraries/CustomComponents/Navigator/Navigator.js index 89f3b49c2..a15e38bc1 100644 --- a/Libraries/CustomComponents/Navigator/Navigator.js +++ b/Libraries/CustomComponents/Navigator/Navigator.js @@ -27,7 +27,6 @@ 'use strict'; var AnimationsDebugModule = require('NativeModules').AnimationsDebugModule; -var Backstack = require('Backstack'); var Dimensions = require('Dimensions'); var InteractionMixin = require('InteractionMixin'); var NavigatorSceneConfigs = require('NavigatorSceneConfigs'); @@ -59,8 +58,6 @@ function getuid() { return __uid++; } -var nextComponentUid = 0; - // styles moved to the top of the file so getDefaultProps can refer to it var styles = StyleSheet.create({ container: { @@ -242,13 +239,6 @@ var Navigator = React.createClass({ * Styles to apply to the container of each scene */ sceneStyle: View.propTypes.style, - - /** - * Should the backstack back button "jump" back instead of pop? Set to true - * if a jump forward might happen after the android back button is pressed, - * so the scenes will remain mounted - */ - shouldJumpOnBackstackPop: PropTypes.bool, }, statics: { @@ -336,13 +326,6 @@ var Navigator = React.createClass({ }); this._itemRefs = {}; this._interactionHandle = null; - this._backstackComponentKey = 'jsnavstack' + nextComponentUid; - nextComponentUid++; - - Backstack.eventEmitter && this.addListenerOn( - Backstack.eventEmitter, - 'popNavigation', - this._onBackstackPopState); this._emitWillFocus(this.state.presentedIndex); }, @@ -361,33 +344,9 @@ var Navigator = React.createClass({ animationConfig && this._configureSpring(animationConfig); this.spring.addListener(this); this.onSpringUpdate(); - - // Fill up the Backstack with routes that have been provided in - // initialRouteStack - this._fillBackstackRange(0, this.state.routeStack.indexOf(this.props.initialRoute)); this._emitDidFocus(this.state.presentedIndex); }, - componentWillUnmount: function() { - Backstack.removeComponentHistory(this._backstackComponentKey); - }, - - _onBackstackPopState: function(componentKey, stateKey, state) { - if (componentKey !== this._backstackComponentKey) { - return; - } - if (!this._canNavigate()) { - // A bit hacky: if we can't actually handle the pop, just push it back on the stack - Backstack.pushNavigation(componentKey, stateKey, state); - } else { - if (this.props.shouldJumpOnBackstackPop) { - this._jumpToWithoutBackstack(state.fromRoute); - } else { - this._popToRouteWithoutBackstack(state.fromRoute); - } - } - }, - /** * @param {RouteStack} nextRouteStack Next route stack to reinitialize. This * doesn't accept stack item `id`s, which implies that all existing items are @@ -737,41 +696,6 @@ var Navigator = React.createClass({ return !this.state.isAnimating; }, - _jumpNWithoutBackstack: function(n) { - var destIndex = this._getDestIndexWithinBounds(n); - if (!this._canNavigate()) { - return; // It's busy animating or transitioning. - } - var requestTransitionAndResetUpdatingRange = () => { - this._requestTransitionTo(destIndex); - this._resetUpdatingRange(); - }; - this.setState({ - updatingRangeStart: destIndex, - updatingRangeLength: 1, - toIndex: destIndex, - }, requestTransitionAndResetUpdatingRange); - }, - - _fillBackstackRange: function(start, end) { - invariant( - start <= end, - 'Can only fill the backstack forward. Provide end index greater than start' - ); - for (var i = 0; i < (end - start); i++) { - var fromIndex = start + i; - var toIndex = start + i + 1; - Backstack.pushNavigation( - this._backstackComponentKey, - toIndex, - { - fromRoute: this.state.routeStack[fromIndex], - toRoute: this.state.routeStack[toIndex], - } - ); - } - }, - _getDestIndexWithinBounds: function(n) { var currentIndex = this.state.presentedIndex; var destIndex = currentIndex + n; @@ -788,20 +712,19 @@ var Navigator = React.createClass({ }, _jumpN: function(n) { - var currentIndex = this.state.presentedIndex; + var destIndex = this._getDestIndexWithinBounds(n); if (!this._canNavigate()) { return; // It's busy animating or transitioning. } - if (n > 0) { - this._fillBackstackRange(currentIndex, currentIndex + n); - } else { - var landingBeforeIndex = currentIndex + n + 1; - Backstack.resetToBefore( - this._backstackComponentKey, - landingBeforeIndex - ); - } - this._jumpNWithoutBackstack(n); + var requestTransitionAndResetUpdatingRange = () => { + this._requestTransitionTo(destIndex); + this._resetUpdatingRange(); + }; + this.setState({ + updatingRangeStart: destIndex, + updatingRangeLength: 1, + toIndex: destIndex, + }, requestTransitionAndResetUpdatingRange); }, jumpTo: function(route) { @@ -813,15 +736,6 @@ var Navigator = React.createClass({ this._jumpN(destIndex - this.state.presentedIndex); }, - _jumpToWithoutBackstack: function(route) { - var destIndex = this.state.routeStack.indexOf(route); - invariant( - destIndex !== -1, - 'Cannot jump to route that is not in the route stack' - ); - this._jumpNWithoutBackstack(destIndex - this.state.presentedIndex); - }, - jumpForward: function() { this._jumpN(1); }, @@ -852,11 +766,6 @@ var Navigator = React.createClass({ toRoute: route, fromRoute: this.state.routeStack[this.state.routeStack.length - 1], }; - Backstack.pushNavigation( - this._backstackComponentKey, - this.state.routeStack.length, - navigationState); - this.setState({ idStack: nextIDStack, routeStack: nextStack, @@ -867,14 +776,7 @@ var Navigator = React.createClass({ }, requestTransitionAndResetUpdatingRange); }, - _manuallyPopBackstack: function(n) { - Backstack.resetToBefore(this._backstackComponentKey, this.state.routeStack.length - n); - }, - - /** - * Like popN, but doesn't also update the Backstack. - */ - _popNWithoutBackstack: function(n) { + popN: function(n) { if (n === 0 || !this._canNavigate()) { return; } @@ -888,14 +790,6 @@ var Navigator = React.createClass({ ); }, - popN: function(n) { - if (n === 0 || !this._canNavigate()) { - return; - } - this._popNWithoutBackstack(n); - this._manuallyPopBackstack(n); - }, - pop: function() { if (this.props.navigator && this.state.routeStack.length === 1) { return this.props.navigator.pop(); @@ -970,14 +864,6 @@ var Navigator = React.createClass({ return this.state.routeStack.length - indexOfRoute - 1; }, - /** - * Like popToRoute, but doesn't update the Backstack, presumably because it's already up to date. - */ - _popToRouteWithoutBackstack: function(route) { - var numToPop = this._getNumToPopForRoute(route); - this._popNWithoutBackstack(numToPop); - }, - popToRoute: function(route) { var numToPop = this._getNumToPopForRoute(route); this.popN(numToPop); diff --git a/Libraries/Utilities/BackAndroid.ios.js b/Libraries/Utilities/BackAndroid.ios.js new file mode 100644 index 000000000..c5a56f40e --- /dev/null +++ b/Libraries/Utilities/BackAndroid.ios.js @@ -0,0 +1,21 @@ +/** + * iOS stub for BackAndroid.android.js + * + * @providesModule BackAndroid + */ + +'use strict'; + +var warning = require('warning'); + +function platformWarn() { + warning(false, 'BackAndroid is not supported on this platform.'); +} + +var BackAndroid = { + exitApp: platformWarn, + addEventListener: platformWarn, + removeEventListener: platformWarn, +}; + +module.exports = BackAndroid; diff --git a/Libraries/Utilities/Backstack.ios.js b/Libraries/Utilities/Backstack.ios.js deleted file mode 100644 index 00a538668..000000000 --- a/Libraries/Utilities/Backstack.ios.js +++ /dev/null @@ -1,16 +0,0 @@ -/** - * To lower the risk of breaking things on iOS, we are stubbing out the - * BackStack for now. See Backstack.android.js - * - * @providesModule Backstack - */ - -'use strict'; - -var Backstack = { - pushNavigation: () => {}, - resetToBefore: () => {}, - removeComponentHistory: () => {}, -}; - -module.exports = Backstack;