Spaces:
Paused
Paused
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(), | |
}, | |
}, | |
}, | |
}), | |
}); | |
}; | |