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