import { ApolloClient, InMemoryCache, split, HttpLink } from '@apollo/client' import { getMainDefinition } from '@apollo/client/utilities' import { GraphQLWsLink } from '@apollo/client/link/subscriptions' import { createClient } from 'graphql-ws' const httpLink = new HttpLink({ uri: process.env.NEXT_PUBLIC_GRAPHQL_URL || 'http://localhost:4000/graphql', }) // WebSocket link for subscriptions (only in browser) const wsLink = typeof window !== 'undefined' ? new GraphQLWsLink( createClient({ url: process.env.NEXT_PUBLIC_GRAPHQL_WS_URL || 'ws://localhost:4000/graphql', connectionParams: () => { // Add auth token if available const token = localStorage.getItem('authToken') return token ? { authorization: `Bearer ${token}` } : {} }, }) ) : null // Split link: use WebSocket for subscriptions, HTTP for queries/mutations const splitLink = typeof window !== 'undefined' && wsLink ? split( ({ query }) => { const definition = getMainDefinition(query) return ( definition.kind === 'OperationDefinition' && definition.operation === 'subscription' ) }, wsLink, httpLink ) : httpLink export const apolloClient = new ApolloClient({ link: splitLink, cache: new InMemoryCache({ typePolicies: { NetworkTopology: { fields: { nodes: { merge(existing = [], incoming) { return incoming }, }, edges: { merge(existing = [], incoming) { return incoming }, }, }, }, }, }), defaultOptions: { watchQuery: { fetchPolicy: 'cache-and-network', }, query: { fetchPolicy: 'cache-first', }, }, })