File size: 1,890 Bytes
3c3f089
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
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(),
          },
        },
      },
    }),
  });
};