-
Notifications
You must be signed in to change notification settings - Fork 0
/
App.tsx
119 lines (110 loc) · 3.67 KB
/
App.tsx
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
import React from 'react';
import ApolloClient from 'apollo-client';
import { NormalizedCacheObject } from 'apollo-cache-inmemory';
import { ApolloProvider } from '@apollo/react-hooks';
import { AppLoading } from 'expo';
import { loadAsync as loadFontAsync } from 'expo-font';
import { Ionicons } from '@expo/vector-icons';
import firebase from 'firebase/app';
import { AppActionsProvider, AuthProvider, Auth } from './src/common/context';
import { setupFirebase } from './src/services/firebase';
import { createGraphqlClient } from './src/services/apollo';
import NavContainer from './src/components/NavContainer';
setupFirebase();
const App: React.FC = () => {
const [fontsLoaded, setFontsLoaded] = React.useState<boolean>(false);
const [client, setClient] = React.useState<
ApolloClient<NormalizedCacheObject>
>(null);
const [auth, setAuth] = React.useState<Auth>({ token: null, userId: null });
const [firebaseInitialized, setFirebaseInitialized] = React.useState<boolean>(
false
);
const authButNoClient = auth?.token && !client;
const noAuthNoClient = !auth?.token && !client;
React.useEffect(() => {
const loadFonts = async () => {
await loadFontAsync({
Roboto: require('native-base/Fonts/Roboto.ttf'),
Roboto_medium: require('native-base/Fonts/Roboto_medium.ttf'),
...Ionicons.font,
});
};
loadFonts();
setFontsLoaded(true);
const unsubscribeFromFirebaseAuth = firebase.auth().onAuthStateChanged(async user => {
if (user) {
const userId = user.uid;
const tokenResult = await user.getIdTokenResult();
if (tokenResult.claims['https://hasura.io/jwt/claims']) {
const token = tokenResult.token;
setClient(createGraphqlClient(token));
setAuth({
token,
userId,
});
setFirebaseInitialized(true);
} else {
let retries = 0;
const retryTokenRetrieval = () => {
return new Promise<void>((resolve) => {
setTimeout(async () => {
if (retries === 0) {
retries =+ 1;
resolve();
} else if (retries >= 0 && retries < 6) {
retries += 1;
const tokenResult = await firebase.auth().currentUser.getIdTokenResult(true);
if (tokenResult.claims['https://hasura.io/jwt/claims']) {
console.log('whoa 3');
const token = tokenResult.token;
setClient(createGraphqlClient(token));
setAuth({
token,
userId,
});
setFirebaseInitialized(true);
retries = -1;
resolve();
}
} else {
resolve();
}
}, 100)
});
}
while (retries >= 0 && retries < 6) {
console.log('retrying at ' + retries);
await retryTokenRetrieval();
}
}
} else {
setAuth({
token: null,
userId: null,
});
setClient(null);
setFirebaseInitialized(true);
}
});
return () => {
unsubscribeFromFirebaseAuth();
};
}, []);
if (!fontsLoaded || authButNoClient || !firebaseInitialized) {
return <AppLoading />;
}
if (noAuthNoClient) {
return <NavContainer />;
}
return (
<AppActionsProvider>
<AuthProvider value={auth}>
<ApolloProvider client={client}>
<NavContainer />
</ApolloProvider>
</AuthProvider>
</AppActionsProvider>
);
};
export default App;