schon/storefront/app/plugins/01.apollo.ts
2026-02-27 21:59:51 +03:00

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);
});