-
Notifications
You must be signed in to change notification settings - Fork 0
/
App.js
138 lines (128 loc) · 4.15 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
130
131
132
133
134
135
136
137
138
import React, { useCallback } from "react";
import { StyleSheet, View } from "react-native";
import LoginScreen from "./components/AppNavigation/LoginScreen";
import Constants from "expo-constants";
import RegisterScreen from "./components/AppNavigation/RegisterScreen";
import AuthScreen from "./components/AppNavigation/AuthScreen";
import { NavigationContainer } from "@react-navigation/native";
import { createNativeStackNavigator } from "@react-navigation/native-stack";
import navigationTheme from "./components/Constants/navigationTheme";
import PostScreen from "./components/AppNavigation/PostScreen";
import AccountScreen from "./components/AppNavigation/AccountScreen";
import { createBottomTabNavigator } from "@react-navigation/bottom-tabs";
import { MaterialCommunityIcons } from "@expo/vector-icons";
import PostButton from "./components/Reusables/PostButton";
import FeedNavigator from "./components/AppNavigation/FeedNavigator";
import AuthContext from "./components/Context/context";
import authStorage from "./components/Services/Storage";
import jwtDecode from "jwt-decode";
import * as SplashScreen from "expo-splash-screen";
const Tab = createBottomTabNavigator();
const Stack = createNativeStackNavigator();
SplashScreen.preventAutoHideAsync();
export default function App() {
const [user, setUser] = React.useState();
const [isReady, setIsReady] = React.useState(false);
React.useEffect(() => {
async function prepare() {
try {
const token = await authStorage.getToken();
if (!token) return;
setUser(jwtDecode(token));
} catch (e) {
console.warn(e);
} finally {
// Tell the application to render
setIsReady(true);
}
}
prepare();
}, []);
const onLayoutRootView = useCallback(async () => {
if (isReady) {
await SplashScreen.hideAsync();
}
}, [isReady]);
if (!isReady) {
return null;
}
return (
<View
style={{
flex: 1,
width: "100%",
}}
onLayout={onLayoutRootView}
>
<AuthContext.Provider value={{ user, setUser }}>
<NavigationContainer theme={navigationTheme}>
{!user ? (
<Stack.Navigator>
<Stack.Screen
name="Home"
component={AuthScreen}
options={{ headerShown: false }}
/>
<Stack.Screen name="Login" component={LoginScreen} />
<Stack.Screen name="Register" component={RegisterScreen} />
</Stack.Navigator>
) : (
<Tab.Navigator
screenOptions={{
// ...
tabBarStyle: {
borderTopWidth: 0,
},
}}
>
<Tab.Screen
name="Feed"
component={FeedNavigator}
options={{
headerShown: false,
tabBarIcon: ({ color, size }) => (
<MaterialCommunityIcons
name="home"
color={color}
size={size}
/>
),
}}
/>
<Tab.Screen
name="Post"
component={PostScreen}
options={({ navigation }) => ({
tabBarButton: () => (
<PostButton onPress={() => navigation.navigate("Post")} />
),
})}
/>
<Tab.Screen
name="Account"
component={AccountScreen}
options={{
headerShadowVisible: false,
tabBarIcon: ({ color, size }) => (
<MaterialCommunityIcons
name="account"
color={color}
size={size}
/>
),
}}
/>
</Tab.Navigator>
)}
</NavigationContainer>
</AuthContext.Provider>
</View>
);
}
const styles = StyleSheet.create({
container: {
flex: 1,
backgroundColor: "#fff",
marginTop: Constants.statusBarHeight,
},
});