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