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