-
Notifications
You must be signed in to change notification settings - Fork 0
/
apolloClient.ts
112 lines (87 loc) · 3.18 KB
/
apolloClient.ts
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
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
import {useMemo} from 'react'
import {ApolloClient, createHttpLink, InMemoryCache, makeVar, NormalizedCacheObject} from '@apollo/client'
import merge from 'deepmerge'
import isEqual from 'lodash/isEqual'
import {setContext} from "@apollo/client/link/context";
export const APOLLO_STATE_PROP_NAME = '__APOLLO_STATE__';
export const LOCALSTORAGE_TOKEN = "login-token";
let apolloClient: ApolloClient<NormalizedCacheObject>;
let token : any = '';
const ISSERVER = typeof window === "undefined";
if (!ISSERVER) {
token = localStorage.getItem(LOCALSTORAGE_TOKEN);
}
export const isLoggedInVar = makeVar(Boolean(token));
export const authTokenVar = makeVar(token);
const httpLink = createHttpLink({
uri: "https://seokkao-page-backend.herokuapp.com/graphql"
});
const authLink = setContext((_, {headers}) => {
return {
headers: {
...headers,
"x-jwt": authTokenVar() || "",
}
}
});
function createApolloClient() {
return new ApolloClient({
ssrMode: typeof window === 'undefined',
link: authLink.concat(httpLink),
cache: new InMemoryCache({
typePolicies: {
Query: {
fields: {
isLoggedIn: {
read() {
return isLoggedInVar();
},
},
token: {
read() {
return authTokenVar();
}
}
},
},
},
}),
})
}
export function initializeApollo(initialState = null) {
const _apolloClient = apolloClient ?? createApolloClient()
// If your page has Next.js data fetching methods that use Apollo Client, the initial state
// gets hydrated here
if (initialState) {
// Get existing cache, loaded during client side data fetching
const existingCache = _apolloClient.extract()
// Merge the existing cache into data passed from getStaticProps/getServerSideProps
const data = merge(initialState as any, existingCache, {
// combine arrays using object equality (like in sets)
arrayMerge: (destinationArray, sourceArray) => [
...sourceArray,
...destinationArray.filter((d) =>
sourceArray.every((s) => !isEqual(d, s))
),
],
})
// Restore the cache with the merged data
_apolloClient.cache.restore(data)
}
// For SSG and SSR always create a new Apollo Client
if (typeof window === 'undefined') return _apolloClient
// Create the Apollo Client once in the client
if (!apolloClient) apolloClient = _apolloClient
return _apolloClient
}
export function addApolloState(client : any, pageProps: any) {
if (pageProps?.props) {
pageProps.props[APOLLO_STATE_PROP_NAME] = client.cache.extract()
}
return pageProps
}
export function useApollo(pageProps: any) {
const state = pageProps[APOLLO_STATE_PROP_NAME]
const store = useMemo(() => initializeApollo(state), [state])
return store
}