44 * Index view
55 */
66
7- // Tweak the global fetch
87import './globalize-fetch'
98import './setup-moment'
10- import { tracker } from './analytics'
119import OneSignal from 'react-native-onesignal'
1210
1311import React from 'react'
14- import { Navigator , BackAndroid , StyleSheet , Platform } from 'react-native'
1512import { Provider } from 'react-redux'
1613import { store } from './flux'
17- import * as c from './views/components/colors'
18- import {
19- Title ,
20- LeftButton ,
21- RightButton ,
22- configureScene ,
23- } from './views/components/navigation'
24-
25- import CalendarView , { EventDetail as EventDetailView } from './views/calendar'
26- import { ContactsView } from './views/contacts'
27- import { DictionaryView , DictionaryDetailView } from './views/dictionary'
28- import { HomeView , EditHomeView } from './views/home'
29- import StreamingView from './views/streaming'
30- import { MenusView } from './views/menus'
31- import { BonAppHostedMenu } from './views/menus/menu-bonapp'
32- import { FilterView } from './views/components/filter'
33- import NewsView from './views/news'
34- import NewsItemView from './views/news/news-item'
35- import SISView from './views/sis'
36- import JobDetailView from './views/sis/student-work/detail'
37- import {
38- BuildingHoursView ,
39- BuildingHoursDetailView ,
40- } from './views/building-hours'
41- import TransportationView from './views/transportation'
42- import SettingsView from './views/settings'
43- import SISLoginView from './views/settings/login'
44- import CreditsView from './views/settings/credits'
45- import PrivacyView from './views/settings/privacy'
46- import LegalView from './views/settings/legal'
47- import { StudentOrgsView , StudentOrgsDetailView } from './views/student-orgs'
48- import { FaqView } from './views/faqs'
49- import { SnapshotsView } from './storybook'
50- import HelpView from './views/help'
51-
52- import NoRoute from './views/components/no-route'
53-
54- // Render a given scene
55- function renderScene ( route , navigator ) {
56- let props = { route, navigator, ...( route . props || { } ) }
57- tracker . trackScreenView ( route . id )
14+ import { tracker } from './analytics'
15+ import { AppNavigator } from './navigation'
16+ import type { NavigationState } from 'react-navigation'
5817
59- switch ( route . id ) {
60- case 'HomeView' :
61- return < HomeView { ...props } />
62- case 'MenusView' :
63- return < MenusView { ...props } />
64- case 'BonAppHostedMenu' :
65- return < BonAppHostedMenu { ...props } />
66- case 'FilterView' :
67- return < FilterView { ...props } />
68- case 'CalendarView' :
69- return < CalendarView { ...props } />
70- case 'EventDetailView' :
71- return < EventDetailView { ...props } />
72- case 'ContactsView' :
73- return < ContactsView { ...props } />
74- case 'DictionaryView' :
75- return < DictionaryView { ...props } />
76- case 'DictionaryDetailView' :
77- return < DictionaryDetailView { ...props } />
78- case 'StreamingView' :
79- return < StreamingView { ...props } />
80- case 'NewsView' :
81- return < NewsView { ...props } />
82- case 'NewsItemView' :
83- return < NewsItemView { ...props } />
84- case 'BuildingHoursView' :
85- return < BuildingHoursView { ...props } />
86- case 'BuildingHoursDetailView' :
87- return < BuildingHoursDetailView { ...props } />
88- case 'SISView' :
89- return < SISView { ...props } />
90- case 'JobDetailView' :
91- return < JobDetailView { ...props } />
92- case 'TransportationView' :
93- return < TransportationView { ...props } />
94- case 'SettingsView' :
95- return < SettingsView { ...props } />
96- case 'SISLoginView' :
97- return < SISLoginView { ...props } />
98- case 'CreditsView' :
99- return < CreditsView { ...props } />
100- case 'PrivacyView' :
101- return < PrivacyView { ...props } />
102- case 'LegalView' :
103- return < LegalView { ...props } />
104- case 'EditHomeView' :
105- return < EditHomeView { ...props } />
106- case 'StudentOrgsView' :
107- return < StudentOrgsView { ...props } />
108- case 'StudentOrgsDetailView' :
109- return < StudentOrgsDetailView { ...props } />
110- case 'FaqView' :
111- return < FaqView { ...props } />
112- case 'SnapshotsView' :
113- return < SnapshotsView { ...props } />
114- case 'HelpView' :
115- return < HelpView { ...props } />
116- default :
117- return < NoRoute { ...props } />
18+ // gets the current screen from navigation state
19+ function getCurrentRouteName ( navigationState : NavigationState ) : ?string {
20+ if ( ! navigationState ) {
21+ return null
22+ }
23+ const route = navigationState . routes [ navigationState . index ]
24+ // dive into nested navigators
25+ if ( route . routes ) {
26+ return getCurrentRouteName ( route )
11827 }
28+ return route . routeName
11929}
12030
121- const styles = StyleSheet . create ( {
122- container : {
123- marginTop : Platform . OS === 'ios' ? 64 : 56 ,
124- flex : 1 ,
125- backgroundColor : Platform . OS === 'ios'
126- ? c . iosLightBackground
127- : c . androidLightBackground ,
128- } ,
129- navigationBar : {
130- backgroundColor : c . olevilleGold ,
131- ...Platform . select ( {
132- ios : {
133- shadowOffset : { width : 0 , height : StyleSheet . hairlineWidth } ,
134- shadowColor : 'rgb(100, 100, 100)' ,
135- shadowOpacity : 0.5 ,
136- shadowRadius : StyleSheet . hairlineWidth ,
137- } ,
138- android : {
139- elevation : 4 ,
140- } ,
141- } ) ,
142- } ,
143- } )
144-
14531export default class App extends React . Component {
14632 componentDidMount ( ) {
147- tracker . trackEvent ( 'app' , 'launch' )
148- BackAndroid . addEventListener (
149- 'hardwareBackPress' ,
150- this . registerAndroidBackButton ,
151- )
152-
15333 OneSignal . addEventListener ( 'received' , this . onReceived )
15434 OneSignal . addEventListener ( 'opened' , this . onOpened )
15535 OneSignal . addEventListener ( 'registered' , this . onRegistered )
15636 OneSignal . addEventListener ( 'ids' , this . onIds )
15737 }
15838
15939 componentWillUnmount ( ) {
160- BackAndroid . removeEventListener (
161- 'hardwareBackPress' ,
162- this . registerAndroidBackButton ,
163- )
164-
16540 OneSignal . removeEventListener ( 'received' , this . onReceived )
16641 OneSignal . removeEventListener ( 'opened' , this . onOpened )
16742 OneSignal . removeEventListener ( 'registered' , this . onRegistered )
@@ -187,40 +62,22 @@ export default class App extends React.Component {
18762 console . log ( 'Device info:' , device )
18863 }
18964
190- _navigator : Navigator
65+ trackScreenChanges (
66+ prevState : NavigationState ,
67+ currentState : NavigationState ,
68+ ) {
69+ const currentScreen = getCurrentRouteName ( currentState )
70+ const prevScreen = getCurrentRouteName ( prevState )
19171
192- registerAndroidBackButton = ( ) => {
193- if ( this . _navigator && this . _navigator . getCurrentRoutes ( ) . length > 1 ) {
194- this . _navigator . pop ( )
195- return true
72+ if ( currentScreen !== prevScreen ) {
73+ tracker . trackScreenView ( currentScreen )
19674 }
197- return false
19875 }
19976
20077 render ( ) {
20178 return (
20279 < Provider store = { store } >
203- < Navigator
204- ref = { nav => ( this . _navigator = nav ) }
205- navigationBar = {
206- < Navigator . NavigationBar
207- style = { styles . navigationBar }
208- routeMapper = { {
209- LeftButton,
210- RightButton,
211- Title,
212- } }
213- />
214- }
215- initialRoute = { {
216- id : 'HomeView' ,
217- title : 'All About Olaf' ,
218- index : 0 ,
219- } }
220- renderScene = { renderScene }
221- sceneStyle = { styles . container }
222- configureScene = { configureScene }
223- />
80+ < AppNavigator onNavigationStateChange = { this . trackScreenChanges } />
22481 </ Provider >
22582 )
22683 }
0 commit comments