-
Notifications
You must be signed in to change notification settings - Fork 0
/
App.js
129 lines (120 loc) · 4.52 KB
/
App.js
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
import React, { useState, useEffect } from "react";
import { AsyncStorage } from "react-native";
import { NavigationNativeContainer } from "@react-navigation/native";
import { createStackNavigator } from "@react-navigation/stack";
import { createBottomTabNavigator } from "@react-navigation/bottom-tabs";
import { Ionicons } from "@expo/vector-icons";
import HomeScreen from "./containers/HomeScreen";
import ProfileScreen from "./containers/ProfileScreen";
import SignInScreen from "./containers/SignInScreen";
import SignUpScreen from "./containers/SignUpScreen";
import SettingsScreen from "./containers/SettingsScreen";
const Tab = createBottomTabNavigator();
const Stack = createStackNavigator();
export default function App() {
const [isLoading, setIsLoading] = useState(true);
const [userToken, setUserToken] = useState(null);
const setToken = async token => {
if (token) {
AsyncStorage.setItem("userToken", token);
} else {
AsyncStorage.removeItem("userToken");
}
setUserToken(token);
};
useEffect(() => {
// Fetch the token from storage then navigate to our appropriate place
const bootstrapAsync = async () => {
// We should also handle error for production apps
const userToken = await AsyncStorage.getItem("userToken");
// This will switch to the App screen or Auth screen and this loading
// screen will be unmounted and thrown away.
setIsLoading(false);
setUserToken(userToken);
};
bootstrapAsync();
}, []);
return (
<NavigationNativeContainer>
<Stack.Navigator>
{isLoading ? (
// We haven't finished checking for the token yet
<Stack.Screen name="Splash" component={() => null} />
) : userToken === null ? (
// No token found, user isn't signed in
<>
<Stack.Screen name="SignIn" options={{ header: () => null }}>
{() => <SignInScreen setToken={setToken} />}
</Stack.Screen>
<Stack.Screen name="SignUp">
{() => <SignUpScreen setToken={setToken} />}
</Stack.Screen>
</>
) : (
// User is signed in
<Stack.Screen name="Tab" options={{ header: () => null }}>
{() => (
<Tab.Navigator
screenOptions={({ route }) => {
return {
tabBarIcon: ({ focused, color, size }) => {
let iconName;
if (route.name === "Settings") {
iconName = `ios-options`;
} else {
iconName = `ios-home`;
}
return (
<Ionicons name={iconName} size={size} color={color} />
);
},
title: route.name === "undefined" ? "Home" : route.name // known issue : route.name shouldn't be undefined
};
}}
tabBarOptions={{
activeTintColor: "tomato",
inactiveTintColor: "gray"
}}
>
<Tab.Screen>
{() => (
<Stack.Navigator>
<Stack.Screen
name="Home"
options={{
title: "My App",
headerStyle: { backgroundColor: "red" },
headerTitleStyle: { color: "white" }
}}
>
{() => <HomeScreen />}
</Stack.Screen>
<Stack.Screen
name="Profile"
options={{ title: "User Profile" }}
>
{() => <ProfileScreen />}
</Stack.Screen>
</Stack.Navigator>
)}
</Tab.Screen>
<Tab.Screen name="Settings">
{() => (
<Stack.Navigator>
<Stack.Screen
name="Settings"
options={{ title: "Settings" }}
>
{() => <SettingsScreen setToken={setToken} />}
</Stack.Screen>
</Stack.Navigator>
)}
</Tab.Screen>
</Tab.Navigator>
)}
</Stack.Screen>
)}
</Stack.Navigator>
</NavigationNativeContainer>
);
}