import { ApolloLink, from } from '@apollo/client/core'; import { setContext } from '@apollo/client/link/context'; import { onError } from '@apollo/client/link/error'; import { provideApolloClient } from '@vue/apollo-composable'; import createUploadLink from 'apollo-upload-client/createUploadLink.mjs'; export default defineNuxtPlugin((nuxtApp) => { const runtime = useRuntimeConfig(); const { $appHelpers, $apollo } = useNuxtApp(); const errorLink = onError((err) => { nuxtApp.callHook('apollo:error', err); }); nuxtApp.hook('apollo:error', (error) => { console.error('[Apollo Error]:', error); }); const authLink = setContext((_, { headers }) => { let accessToken = ''; let locale = 'en-gb'; if (import.meta.client) { const clientCookies = document.cookie.split(';').reduce( (acc, cookie) => { const [key, value] = cookie.trim().split('='); acc[key] = decodeURIComponent(value); return acc; }, {} as Record, ); accessToken = clientCookies[$appHelpers.COOKIES_ACCESS_TOKEN_KEY] || ''; locale = clientCookies[$appHelpers.COOKIES_LOCALE_KEY] || 'en-gb'; } else { const cookieHeader = nuxtApp.ssrContext?.event?.node?.req?.headers?.cookie || ''; const serverCookies = cookieHeader.split(';').reduce( (acc, cookie) => { const [key, value] = cookie.trim().split('='); if (key && value) { acc[key] = decodeURIComponent(value); } return acc; }, {} as Record, ); accessToken = serverCookies[$appHelpers.COOKIES_ACCESS_TOKEN_KEY] || ''; locale = serverCookies[$appHelpers.COOKIES_LOCALE_KEY] || 'en-gb'; } const hdrs: Record = { ...headers, 'Accept-Language': locale, }; if (accessToken) { hdrs['X-SCHON-AUTH'] = `Bearer ${accessToken}`; } return { headers: hdrs, }; }); const customLink = new ApolloLink((operation, forward) => { return forward(operation).map((data) => { return data; }); }); const httpLink = createUploadLink({ uri: `https://api.${runtime.public.schonBaseDomain}/graphql/`, }); $apollo.defaultClient.setLink( from([ errorLink, authLink, customLink, httpLink, ]), ); provideApolloClient($apollo.defaultClient); });