import 'isomorphic-fetch'
import React from 'react'
import { ApolloClient, ApolloProvider, getDataFromTree } from 'react-apollo'
import { createNetworkInterface } from 'apollo-upload-client'
const ssrMode = !process.browser
let apolloClient = null
function initClient(headers, initialState) {
return new ApolloClient({
initialState,
ssrMode,
networkInterface: createNetworkInterface({
uri: process.env.API_URI
})
})
}
function getClient(headers, initialState = {}) {
if (ssrMode) return initClient(headers, initialState)
if (!apolloClient) apolloClient = initClient(headers, initialState)
return apolloClient
}
export default Component =>
class extends React.Component {
static async getInitialProps(ctx) {
const headers = ctx.req ? ctx.req.headers : {}
const client = getClient(headers)
const props = {
url: {
query: ctx.query,
pathname: ctx.pathname
},
...(await (Component.getInitialProps
? Component.getInitialProps(ctx)
: {}))
}
if (ssrMode) {
const app = (
)
await getDataFromTree(app)
}
return {
initialState: {
apollo: {
data: client.getInitialState().data
}
},
headers,
...props
}
}
constructor(props) {
super(props)
this.client = getClient(this.props.headers, this.props.initialState)
}
render() {
return (
)
}
}