From 93e98da90845de3b575bed65c729bdedb148452e Mon Sep 17 00:00:00 2001 From: Hedger Wang Date: Fri, 19 Jun 2015 15:55:08 -0700 Subject: [PATCH] [Navigator]: Add a getter to get the current route that is focused from the navigation context. --- .../Navigator/Navigation/NavigationContext.js | 31 ++++++++--- .../__tests__/NavigationContext-test.js | 51 +++++++++++++++++++ 2 files changed, 76 insertions(+), 6 deletions(-) create mode 100644 Libraries/CustomComponents/Navigator/Navigation/__tests__/NavigationContext-test.js diff --git a/Libraries/CustomComponents/Navigator/Navigation/NavigationContext.js b/Libraries/CustomComponents/Navigator/Navigation/NavigationContext.js index 8169415eb..d146f14d0 100644 --- a/Libraries/CustomComponents/Navigator/Navigation/NavigationContext.js +++ b/Libraries/CustomComponents/Navigator/Navigation/NavigationContext.js @@ -23,25 +23,34 @@ * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. * * @providesModule NavigationContext - * @flow */ 'use strict'; var NavigationEventEmitter = require('NavigationEventEmitter'); -var emptyFunction = require('emptyFunction'); -type EventSubscription = { - remove: Function -}; +var emptyFunction = require('emptyFunction'); +var invariant = require('invariant'); + +import type * as NavigationEvent from 'NavigationEvent'; +import type * as EventSubscription from 'EventSubscription'; /** * Class that contains the info and methods for app navigation. */ class NavigationContext { _eventEmitter: ?NavigationEventEmitter; + _currentRoute: any; constructor() { this._eventEmitter = new NavigationEventEmitter(this); + this._currentRoute = null; + this.addListener('didfocus', this._onDidFocus, this); + } + + // TODO: @flow does not like this getter. Will add @flow check back once + // getter/setter is supported. + get currentRoute(): any { + return this._currentRoute; } addListener( @@ -64,13 +73,23 @@ class NavigationContext { } } - dispose() { + dispose(): void { var emitter = this._eventEmitter; if (emitter) { + // clean up everything. emitter.removeAllListeners(); this._eventEmitter = null; + this._currentRoute = null; } } + + _onDidFocus(event: NavigationEvent): void { + invariant( + event.data && event.data.hasOwnProperty('route'), + 'didfocus event should provide route' + ); + this._currentRoute = event.data.route; + } } module.exports = NavigationContext; diff --git a/Libraries/CustomComponents/Navigator/Navigation/__tests__/NavigationContext-test.js b/Libraries/CustomComponents/Navigator/Navigation/__tests__/NavigationContext-test.js new file mode 100644 index 000000000..796d5633e --- /dev/null +++ b/Libraries/CustomComponents/Navigator/Navigation/__tests__/NavigationContext-test.js @@ -0,0 +1,51 @@ +/** + * Copyright (c) 2015, Facebook, Inc. All rights reserved. + * + * Facebook, Inc. (“Facebook”) owns all right, title and interest, including + * all intellectual property and other proprietary rights, in and to the React + * Native CustomComponents software (the “Software”). Subject to your + * compliance with these terms, you are hereby granted a non-exclusive, + * worldwide, royalty-free copyright license to (1) use and copy the Software; + * and (2) reproduce and distribute the Software as part of your own software + * (“Your Software”). Facebook reserves all rights not expressly granted to + * you in this license agreement. + * + * THE SOFTWARE AND DOCUMENTATION, IF ANY, ARE PROVIDED "AS IS" AND ANY EXPRESS + * OR IMPLIED WARRANTIES (INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES + * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE) ARE DISCLAIMED. + * IN NO EVENT SHALL FACEBOOK OR ITS AFFILIATES, OFFICERS, DIRECTORS OR + * EMPLOYEES BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, + * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, + * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; + * OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, + * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR + * OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THE SOFTWARE, EVEN IF + * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ +'use strict'; + +jest + .dontMock('EmitterSubscription') + .dontMock('EventEmitter') + .dontMock('EventSubscriptionVendor') + .dontMock('NavigationContext') + .dontMock('NavigationEvent') + .dontMock('NavigationEventEmitter') + .dontMock('invariant'); + +var NavigationContext = require('NavigationContext'); + +describe('NavigationContext', () => { + it('defaults `currentRoute` to null', () => { + var context = new NavigationContext(); + expect(context.currentRoute).toEqual(null); + }); + + it('updates `currentRoute`', () => { + var context = new NavigationContext(); + context.emit('didfocus', {route: {name: 'a'}}); + expect(context.currentRoute.name).toEqual('a'); + }); +}); + +