UNPKG

1.83 kBJavaScriptView Raw
1// @flow
2/* eslint-env browser */
3
4import React from 'react';
5import Relay from 'react-relay';
6import IsomorphicRelay from 'isomorphic-relay';
7import IsomorphicRouter from 'isomorphic-relay-router';
8import {render} from 'react-dom';
9import {AppContainer} from 'react-hot-loader';
10import {Provider} from 'react-redux';
11import Router from 'react-router/lib/Router';
12import browserHistory from 'react-router/lib/browserHistory';
13import match from 'react-router/lib/match';
14
15export default function createClientRenderer({store}: {store: Object}) {
16 const environment = new Relay.Environment();
17 environment.injectNetworkLayer(new Relay.DefaultNetworkLayer('/graphql'));
18 const data = window.APP_STATE;
19
20 IsomorphicRelay.injectPreparedData(environment, data);
21
22 // Get the DOM Element that will host our React application.
23 const container = document.querySelector('#app');
24
25 return function renderApp(routes: React$Element<*>) {
26 // As we are using dynamic react-router routes we have to use the following
27 // asynchronous routing mechanism supported by the `match` function.
28 // @see https://github.com/reactjs/react-router/blob/master/docs/guides/ServerRendering.md
29 match({history: browserHistory, routes}, (error, redirectLocation, renderProps) => {
30 if (error) {
31 console.log('==> 😭 React Router match failed.');
32 }
33
34 IsomorphicRouter
35 .prepareInitialRender(environment, renderProps)
36 .then((props) => {
37 return render(
38 <AppContainer>
39 <Provider store={store}>
40 <Router {...props} />
41 </Provider>
42 </AppContainer>,
43 container,
44 );
45 })
46 .catch((error) => {
47 console.log('==> 😭 Rendering failed.');
48 console.log(error);
49 });
50 });
51 };
52}