xref: /expo/home/api/ApolloClient.ts (revision bb5069cd)
1import { ApolloClient, InMemoryCache } from '@apollo/client';
2import { setContext } from '@apollo/client/link/context';
3import { HttpLink } from '@apollo/client/link/http';
4import { offsetLimitPagination } from '@apollo/client/utilities';
5
6import Store from '../redux/Store';
7import Config from './Config';
8import Connectivity from './Connectivity';
9
10const httpLink = new HttpLink({
11  uri: `${Config.api.origin}/--/graphql`,
12});
13
14const connectivityLink = setContext(async (): Promise<any> => {
15  const isConnected = await Connectivity.isAvailableAsync();
16  if (!isConnected) {
17    throw new Error('No connection available');
18  }
19});
20
21const authMiddlewareLink = setContext((): any => {
22  const { sessionSecret } = Store.getState().session;
23
24  if (sessionSecret) {
25    return {
26      headers: { 'expo-session': sessionSecret },
27    };
28  }
29});
30
31const link = connectivityLink.concat(authMiddlewareLink.concat(httpLink));
32
33const cache = new InMemoryCache({
34  possibleTypes: {
35    ActivityTimelineProjectActivity: ['Build', 'BuildJob'],
36    BuildOrBuildJob: ['Build', 'BuildJob'],
37    BaseSearchResult: ['UserSearchResult', 'AppSearchResult'],
38    Project: ['App', 'Snack'],
39  },
40  addTypename: true,
41  typePolicies: {
42    Query: {
43      fields: {
44        account: {
45          merge: false,
46        },
47        app: {
48          merge: false,
49        },
50      },
51    },
52    Account: {
53      fields: {
54        apps: offsetLimitPagination(),
55        snacks: offsetLimitPagination(),
56      },
57    },
58    App: {
59      fields: {
60        updateBranches: offsetLimitPagination(),
61      },
62    },
63  },
64});
65
66export default new ApolloClient({
67  link,
68  cache,
69});
70