Files
imexmobile/graphql/client.js
2025-03-06 15:00:44 -08:00

105 lines
2.6 KiB
JavaScript

import { ApolloClient, from, HttpLink, InMemoryCache } from "@apollo/client";
import { setContext } from "@apollo/client/link/context";
import { onError } from "@apollo/client/link/error";
import { RetryLink } from "@apollo/client/link/retry";
import env from "../env";
import { auth } from "../firebase/firebase.utils";
const httpLink = new HttpLink({
uri: env.uri,
});
//https://stackoverflow.com/questions/57163454/refreshing-a-token-with-apollo-client-firebase-auth
const errorLink = onError(
({ graphQLErrors, networkError, operation, forward }) => {
console.error(graphQLErrors);
if (graphQLErrors)
graphQLErrors.forEach(({ message, locations, path }) =>
console.error(
`[GraphQL error]: Message: ${message}, Location: ${locations}, Path: ${path}`
)
);
if (networkError)
console.error(`[Network error]: ${JSON.stringify(networkError)}`);
}
);
const subscriptionMiddleware = {
applyMiddleware: async (options, next) => {
options.authToken =
auth.currentUser && (await auth.currentUser.getIdToken(true));
next();
},
};
//wsLink.subscriptionClient.use([subscriptionMiddleware]);
// const link = split(
// // split based on operation type
// ({ query }) => {
// const definition = getMainDefinition(query);
// // console.log(
// // "##Intercepted GQL Transaction : " +
// // definition.operation +
// // "|" +
// // // definition.name.value +
// // "##"
// // );
// return (
// definition.kind === "OperationDefinition" &&
// definition.operation === "subscription"
// );
// },
// wsLink,
// httpLink
// );
const authLink = setContext((_, { headers }) => {
return (
auth.currentUser &&
auth.currentUser.getIdToken().then((token) => {
if (token) {
return {
headers: {
...headers,
authorization: token ? `Bearer ${token}` : "",
},
};
} else {
return { headers };
}
})
);
});
const retryLink = new RetryLink({
delay: {
initial: 500,
max: 5,
jitter: true,
},
attempts: {
max: 5,
retryIf: (error, _operation) => !!error,
},
});
const cache = new InMemoryCache({});
export const client = new ApolloClient({
//link: ApolloLink.from(middlewares),
//link: from([apolloLogger, errorLink, authLink, link]),
link: from([authLink, retryLink, errorLink, httpLink]),
cache,
notifyOnNetworkStatusChange: true,
defaultOptions: {
watchQuery: {
fetchPolicy: "network-only",
nextFetchPolicy: "network-only",
},
query: {
fetchPolicy: "network-only",
},
},
});