Skip to content

Commit

Permalink
[templates] Migrate React Navigation to 5.0 (#6974)
Browse files Browse the repository at this point in the history
  • Loading branch information
osdnk authored and EvanBacon committed Feb 13, 2020
1 parent aab2c22 commit 1fab0fe
Show file tree
Hide file tree
Showing 7 changed files with 216 additions and 195 deletions.
25 changes: 21 additions & 4 deletions templates/expo-template-tabs/App.js
@@ -1,15 +1,24 @@
import React, { useState } from 'react';
import { Platform, StatusBar, StyleSheet, View } from 'react-native';
import { AppLoading } from 'expo';
import { Asset } from 'expo-asset';
import * as Font from 'expo-font';
import React, { useState } from 'react';
import { Platform, StatusBar, StyleSheet, View } from 'react-native';
import { Ionicons } from '@expo/vector-icons';
import { NavigationContainer } from '@react-navigation/native';
import { createStackNavigator } from '@react-navigation/stack';

import AppNavigator from './navigation/AppNavigator';
import MainTabNavigator from './navigation/MainTabNavigator';
import useLinking from './navigation/useLinking';

const Stack = createStackNavigator();

export default function App(props) {
const [isLoadingComplete, setLoadingComplete] = useState(false);

const containerRef = React.useRef();

const initialState = useLinking(containerRef);

if (!isLoadingComplete && !props.skipLoadingScreen) {
return (
<AppLoading
Expand All @@ -22,7 +31,15 @@ export default function App(props) {
return (
<View style={styles.container}>
{Platform.OS === 'ios' && <StatusBar barStyle="default" />}
<AppNavigator />
<NavigationContainer ref={containerRef} initialState={initialState}>
<Stack.Navigator>
<Stack.Screen
name="Root"
component={MainTabNavigator}
options={{ headerTitle: 'Example app' }}
/>
</Stack.Navigator>
</NavigationContainer>
</View>
);
}
Expand Down
12 changes: 0 additions & 12 deletions templates/expo-template-tabs/navigation/AppNavigator.js

This file was deleted.

13 changes: 0 additions & 13 deletions templates/expo-template-tabs/navigation/AppNavigator.web.js

This file was deleted.

121 changes: 49 additions & 72 deletions templates/expo-template-tabs/navigation/MainTabNavigator.js
@@ -1,79 +1,56 @@
import React from 'react';
import { Platform } from 'react-native';
import { createStackNavigator } from 'react-navigation-stack';
import { createBottomTabNavigator } from 'react-navigation-tabs';

import { createBottomTabNavigator } from '@react-navigation/bottom-tabs';
import TabBarIcon from '../components/TabBarIcon';
import HomeScreen from '../screens/HomeScreen';
import LinksScreen from '../screens/LinksScreen';
import SettingsScreen from '../screens/SettingsScreen';

const config = Platform.select({
web: { headerMode: 'screen' },
default: {},
});

const HomeStack = createStackNavigator(
{
Home: HomeScreen,
},
config
);

HomeStack.navigationOptions = {
tabBarLabel: 'Home',
tabBarIcon: ({ focused }) => (
<TabBarIcon
focused={focused}
name={
Platform.OS === 'ios'
? `ios-information-circle${focused ? '' : '-outline'}`
: 'md-information-circle'
}
/>
),
};

HomeStack.path = '';

const LinksStack = createStackNavigator(
{
Links: LinksScreen,
},
config
);

LinksStack.navigationOptions = {
tabBarLabel: 'Links',
tabBarIcon: ({ focused }) => (
<TabBarIcon focused={focused} name={Platform.OS === 'ios' ? 'ios-link' : 'md-link'} />
),
};

LinksStack.path = '';

const SettingsStack = createStackNavigator(
{
Settings: SettingsScreen,
},
config
);

SettingsStack.navigationOptions = {
tabBarLabel: 'Settings',
tabBarIcon: ({ focused }) => (
<TabBarIcon focused={focused} name={Platform.OS === 'ios' ? 'ios-options' : 'md-options'} />
),
};

SettingsStack.path = '';

const tabNavigator = createBottomTabNavigator({
HomeStack,
LinksStack,
SettingsStack,
});

tabNavigator.path = '';

export default tabNavigator;
const BottomTab = createBottomTabNavigator();

export default function MainTabNavigator() {
return (
<BottomTab.Navigator>
<BottomTab.Screen
name="Home"
component={HomeScreen}
options={{
title: 'Home',
tabBarIcon: ({ focused }) => (
<TabBarIcon
focused={focused}
name={
Platform.OS === 'ios'
? `ios-information-circle${focused ? '' : '-outline'}`
: 'md-information-circle'
}
/>
),
}}
/>
<BottomTab.Screen
name="Links"
component={LinksScreen}
options={{
title: 'Links',
tabBarIcon: ({ focused }) => (
<TabBarIcon focused={focused} name={Platform.OS === 'ios' ? 'ios-link' : 'md-link'} />
),
}}
/>
<BottomTab.Screen
name="Settings"
component={SettingsScreen}
options={{
title: 'Settings',
tabBarIcon: ({ focused }) => (
<TabBarIcon
focused={focused}
name={Platform.OS === 'ios' ? 'ios-options' : 'md-options'}
/>
),
}}
/>
</BottomTab.Navigator>
);
}
18 changes: 18 additions & 0 deletions templates/expo-template-tabs/navigation/useLinking.js
@@ -0,0 +1,18 @@
import { useLinking } from '@react-navigation/native';

export default function(containerRef) {
const { getInitialState } = useLinking(containerRef, {
prefixes: [],
config: {
Root: {
path: 'root',
screens: {
Home: 'home',
Links: 'links',
Settings: 'settings',
},
},
},
});
return getInitialState();
}
9 changes: 5 additions & 4 deletions templates/expo-template-tabs/package.json
Expand Up @@ -27,12 +27,13 @@
"react-dom": "~16.9.0",
"react-native": "https://github.com/expo/react-native/archive/sdk-36.0.0.tar.gz",
"react-native-gesture-handler": "~1.5.0",
"react-native-reanimated": "~1.4.0",
"react-native-screens": "2.0.0-alpha.12",
"react-native-web": "~0.11.7",
"react-navigation": "~4.0.10",
"react-navigation-stack": "~1.10.3",
"react-navigation-tabs": "~2.6.2"
"@react-native-community/masked-view": "~0.1.6",
"react-native-safe-area-context": "~0.6.4",
"@react-navigation/native": "^5.0.0",
"@react-navigation/stack": "^5.0.0",
"@react-navigation/bottom-tabs": "^5.0.0"
},
"devDependencies": {
"@babel/core": "^7.0.0",
Expand Down

0 comments on commit 1fab0fe

Please sign in to comment.