-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathApp.js
More file actions
119 lines (111 loc) · 3.3 KB
/
Copy pathApp.js
File metadata and controls
119 lines (111 loc) · 3.3 KB
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, { Component } from 'react';
import { createAppContainer, createSwitchNavigator } from 'react-navigation';
import { Provider } from 'react-redux';
import { View } from 'react-native';
import { ApolloProvider } from 'react-apollo';
import { ApolloClient } from 'apollo-client';
import { withClientState } from 'apollo-link-state';
import { ApolloLink, Observable } from 'apollo-link';
import { InMemoryCache, defaultDataIdFromObject } from 'apollo-cache-inmemory';
import { PersistGate } from 'redux-persist/integration/react';
import { HttpLink } from 'apollo-link-http';
import { onError } from 'apollo-link-error';
import AsyncStorage from '@react-native-community/async-storage';
import TabNavigator from './Router';
import LandingView from './src/LandingView';
import { persistor, store } from './reducers';
import AuthNavigator from './components/Auth';
const cache = new InMemoryCache({
// eslint-disable-next-line no-underscore-dangle
dataIdFromObject: (object) => object[`${object.__typename.toLowerCase()}Id`] || defaultDataIdFromObject(object),
});
const request = async (operation) => {
try {
const authToken = await AsyncStorage.getItem('token');
const refreshToken = await AsyncStorage.getItem('refreshToken');
if (authToken && refreshToken) {
operation.setContext({
headers: {
authToken,
refreshToken,
},
});
}
} catch (e) {
console.log('error reading value:', e);
}
};
const requestLink = new ApolloLink((operation, forward) => new Observable((observer) => {
let handle;
Promise.resolve(operation)
.then((oper) => request(oper))
.then(() => {
handle = forward(operation).subscribe({
next: observer.next.bind(observer),
error: observer.error.bind(observer),
complete: observer.complete.bind(observer),
});
})
.catch(observer.error.bind(observer));
return () => {
if (handle) handle.unsubscribe();
};
}));
const client = new ApolloClient({
link: ApolloLink.from([
onError(({ graphQLErrors, networkError }) => {
if (graphQLErrors) {
graphQLErrors.forEach(({ message, status }) => {
console.error(message, status);
});
}
if (networkError) {
console.log(networkError);
}
}),
requestLink,
withClientState({
defaults: {
isConnected: true,
},
resolvers: {
Mutation: {
updateNetworkStatus: (_, { isConnected }, { cache: localCache }) => {
localCache.writeData({ data: { isConnected } });
return null;
},
},
},
cache,
}),
new HttpLink({
uri: 'https://tritonbyte-server.herokuapp.com/graphql',
credentials: 'same-origin',
}),
]),
cache,
});
const AppContainer = createAppContainer(createSwitchNavigator(
{
Landing: LandingView,
Auth: AuthNavigator,
App: TabNavigator,
},
{
initialRouteName: 'Auth',
},
));
// eslint-disable-next-line react/prefer-stateless-function
export default class App extends Component {
render() {
return (
<Provider store={store}>
<ApolloProvider client={client}>
<PersistGate loading={<View />} persistor={persistor}>
<AppContainer />
</PersistGate>
</ApolloProvider>
</Provider>
);
}
}