54 lines
1.4 KiB
TypeScript
54 lines
1.4 KiB
TypeScript
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);
|
|
});
|