open-codetree / utils /client.ts
matt HOFFNER
init
3c3f089
import { ApolloClient, InMemoryCache, ApolloLink, split } from "@apollo/client";
import { createUploadLink } from "apollo-upload-client";
import { GraphQLWsLink } from "@apollo/client/link/subscriptions";
import { createClient } from "graphql-ws";
import { getMainDefinition } from "@apollo/client/utilities";
import { offsetLimitPagination } from "./offsetLimitPagination";
const loggerLink = new ApolloLink((operation, forward) => {
return forward(operation).map((result) => {
console.info("response", result?.data);
return result;
});
});
const wsLink =
typeof window !== "undefined"
? new GraphQLWsLink(
createClient({
url: `${process.env.NEXT_PUBLIC_WS_API_URL}`,
})
)
: null;
const httpLink = (token?: string) =>
createUploadLink({
uri: process.env.NEXT_PUBLIC_API_URL,
headers: !token
? { "apollo-require-preflight": true }
: {
authorization: `Bearer ${token}`,
"apollo-require-preflight": true,
},
});
const splitLink = (token?: string) =>
typeof window !== "undefined" && wsLink != null
? split(
({ query }) => {
const definition = getMainDefinition(query);
return (
definition.kind === "OperationDefinition" &&
definition.operation === "subscription"
);
},
wsLink, // @ts-ignore
httpLink(token)
)
: httpLink(token);
export const createApolloClient = (token?: string) => {
return new ApolloClient({
defaultOptions: {
query: {
errorPolicy: "all",
},
mutate: {
errorPolicy: "all",
},
},
// @ts-ignore
link: splitLink(token),
cache: new InMemoryCache({
typePolicies: {
Query: {
fields: {
projects: offsetLimitPagination(),
},
},
},
}),
});
};