xref: /expo/home/api/ApolloClient.ts (revision 7faebecd)
1import { ApolloClient, InMemoryCache, from } 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
10export function createApolloClient() {
11  const httpLink = new HttpLink({
12    uri: `${Config.api.origin}/--/graphql`,
13  });
14
15  const connectivityLink = setContext(async (): Promise<any> => {
16    const isConnected = await Connectivity.isAvailableAsync();
17    if (!isConnected) {
18      throw new Error('No connection available');
19    }
20  });
21
22  const authMiddlewareLink = setContext((_request, previousContext): any => {
23    const { sessionSecret } = Store.getState().session;
24
25    if (sessionSecret) {
26      return {
27        headers: { 'expo-session': sessionSecret },
28      };
29    }
30
31    return previousContext;
32  });
33
34  const link = from([connectivityLink, authMiddlewareLink, httpLink]);
35
36  const cache = new InMemoryCache({
37    possibleTypes: {
38      AccountUsageMetadata: ['AccountUsageEASBuildMetadata'],
39      ActivityTimelineProjectActivity: ['Build', 'BuildJob', 'Submission', 'Update'],
40      Actor: ['Robot', 'SSOUser', 'User'],
41      BuildOrBuildJob: ['Build', 'BuildJob'],
42      EASBuildOrClassicBuildJob: ['Build', 'BuildJob'],
43      FcmSnippet: ['FcmSnippetLegacy', 'FcmSnippetV1'],
44      PlanEnablement: ['Concurrencies', 'EASTotalPlanEnablement'],
45      Project: ['App', 'Snack'],
46      UserActor: ['SSOUser', 'User'],
47    },
48    addTypename: true,
49    typePolicies: {
50      Query: {
51        fields: {
52          account: {
53            merge: false,
54          },
55          app: {
56            merge: false,
57          },
58        },
59      },
60      Account: {
61        fields: {
62          apps: offsetLimitPagination(),
63          snacks: offsetLimitPagination(),
64        },
65      },
66      App: {
67        fields: {
68          updateBranches: offsetLimitPagination(),
69        },
70      },
71    },
72  });
73
74  return new ApolloClient({
75    link,
76    cache,
77  });
78}
79
80export default createApolloClient();
81