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