Created
September 22, 2019 17:11
-
-
Save immortalx/655392a140dba5fa50ac026b1fda28d7 to your computer and use it in GitHub Desktop.
nextjs withApollo _app
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
| import { ApolloProvider } from '@apollo/react-hooks' | |
| import App from 'next/app' | |
| import React from 'react' | |
| import withApolloClient from './lib/with-apollo-client' | |
| class MyApp extends App { | |
| render () { | |
| const {Component, pageProps, apolloClient}: any = this.props | |
| return( | |
| <ApolloProvider client={apolloClient}> | |
| <Component {...pageProps} /> | |
| </ApolloProvider> | |
| ) | |
| } | |
| } | |
| export default withApolloClient(MyApp) |
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
| import { InMemoryCache } from 'apollo-cache-inmemory' | |
| import { ApolloClient } from 'apollo-client' | |
| import { HttpLink } from 'apollo-link-http' | |
| import fetch from 'isomorphic-unfetch' | |
| let apolloClient = null | |
| function create (initialState) { | |
| // Check out https://github.com/zeit/next.js/pull/4611 if you want to use the AWSAppSyncClient | |
| const isBrowser = typeof window !== 'undefined' | |
| return new ApolloClient({ | |
| connectToDevTools: isBrowser, | |
| ssrMode: !isBrowser, // Disables forceFetch on the server (so queries are only run once) | |
| link: new HttpLink({ | |
| uri: 'http://192.168.1.3:4000/graphql', // Server URL (must be absolute) | |
| credentials: 'same-origin', // Additional fetch() options like `credentials` or `headers` | |
| // Use fetch() polyfill on the server | |
| fetch: !isBrowser && fetch | |
| }), | |
| cache: new InMemoryCache().restore(initialState || {}) | |
| }) | |
| } | |
| export default function initApollo (initialState) { | |
| // Make sure to create a new client for every server-side request so that data | |
| // isn't shared between connections (which would be bad) | |
| if (typeof window === 'undefined') { | |
| return create(initialState) | |
| } | |
| // Reuse client on the client-side | |
| if (!apolloClient) { | |
| apolloClient = create(initialState) | |
| } | |
| return apolloClient | |
| } |
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
| import Head from 'next/head' | |
| import React from 'react' | |
| import initApollo from './init-apollo' | |
| export default (App) => { | |
| return class Apollo extends React.Component { | |
| static displayName = 'withApollo(App)' | |
| static async getInitialProps (ctx) { | |
| const { Component, router } = ctx | |
| let appProps = {} | |
| if (App.getInitialProps) { | |
| appProps = await App.getInitialProps(ctx) | |
| } | |
| // Run all GraphQL queries in the component tree | |
| // and extract the resulting data | |
| const apollo = initApollo() | |
| if (!process.browser) { | |
| try { | |
| const { getDataFromTree } = await import('@apollo/react-ssr') | |
| // Run all GraphQL queries | |
| await getDataFromTree( | |
| <App | |
| {...appProps} | |
| Component={Component} | |
| router={router} | |
| apolloClient={apollo} | |
| /> | |
| ) | |
| } catch (error) { | |
| // Prevent Apollo Client GraphQL errors from crashing SSR. | |
| // Handle them in components via the data.error prop: | |
| // https://www.apollographql.com/docs/react/api/react-apollo.html#graphql-query-data-error | |
| console.error('Error while running `getDataFromTree`', error) | |
| } | |
| // getDataFromTree does not call componentWillUnmount | |
| // head side effect therefore need to be cleared manually | |
| Head.rewind() | |
| } | |
| // Extract query data from the Apollo store | |
| const apolloState = apollo.cache.extract() | |
| return { | |
| ...appProps, | |
| apolloState | |
| } | |
| } | |
| constructor (props) { | |
| super(props) | |
| this.apolloClient = initApollo(props.apolloState) | |
| } | |
| render () { | |
| return <App {...this.props} apolloClient={this.apolloClient} /> | |
| } | |
| } | |
| } |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment