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); }); const localeCookie = useCookie($appHelpers.COOKIES_LOCALE_KEY); const accessTokenCookie = useCookie($appHelpers.COOKIES_ACCESS_TOKEN_KEY); nuxtApp.hook('apollo:error', (error) => { console.error('[Apollo Error]:', error); }); const authLink = setContext((_, { headers }) => { const acceptLanguage = localeCookie.value || 'en-gb'; return { headers: { ...headers, 'Accept-Language': acceptLanguage, ...(accessTokenCookie.value && { 'X-SCHON-AUTH': `Bearer ${accessTokenCookie.value}`, }), }, }; }); 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); });