import 'cross-fetch/polyfill' import { InMemoryCache } from 'apollo-cache-inmemory' import { ApolloClient } from 'apollo-client' import { createUploadLink } from 'apollo-upload-client' import Head from 'next/head' import { Component } from 'react' import { getDataFromTree } from 'react-apollo' import getDisplayName from 'react-display-name' let apolloClient const createApolloClient = (cache = {}) => new ApolloClient({ ssrMode: typeof window !== 'undefined', cache: new InMemoryCache().restore(cache), link: createUploadLink({ uri: process.env.API_URI }) }) export default App => class WithApollo extends Component { static displayName = `WithApollo(${getDisplayName(App)})` static async getInitialProps(context) { const props = App.getInitialProps ? await App.getInitialProps(context) : {} // If server environment, preload the page. if (context.ctx.req) { const apolloClient = createApolloClient() try { await getDataFromTree( ) } catch (error) { // Prevent crash from GraphQL errors. // eslint-disable-next-line no-console console.error(error) } props.apolloCache = apolloClient.cache.extract() Head.rewind() } return props } constructor(props) { super(props) // Set the ApolloClient instance used in render(). this.apolloClient = typeof window !== 'undefined' ? // Client: Shared instance, created at first render after SSR. (apolloClient = apolloClient || createApolloClient(props.apolloCache)) : // Server: Private instance for SSR. createApolloClient(props.apolloCache) } render() { const { // eslint-disable-next-line no-unused-vars apolloCache, ...appProps } = this.props return } }