Skip to content

Instantly share code, notes, and snippets.

@psaia
Created December 13, 2019 12:21
Show Gist options
  • Star 1 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save psaia/4c3800e58a66a3e787442d58d03ed436 to your computer and use it in GitHub Desktop.
Save psaia/4c3800e58a66a3e787442d58d03ed436 to your computer and use it in GitHub Desktop.
const EnvironmentProvider = environment => props => {
return (
<ReactRelayContext.Provider
{...props}
value={{ environment: environment, variables: {} }}
/>
);
};
async function createRelayEnvironment(req) {
const relaySSRMiddleware = new RelayServerSSR();
relaySSRMiddleware.debug = true;
const network = new RelayNetworkLayer([
relaySSRMiddleware.getMiddleware({
schema: await generateSchema(),
contextValue: prepareContext(req)
})
]);
const store = new Store(new RecordSource());
const environment = new Environment({
network,
store
});
return {
store,
environment,
relaySSRMiddleware
};
}
export default async function render(req, res, next) {
try {
const {
environment,
store,
relaySSRMiddleware
} = await createRelayEnvironment(req);
const helmetContext: FilledContext = { helmet: null };
const EnvProvider = EnvironmentProvider(environment);
// Kick off an initial render to start the queries.
ReactDOMServer.renderToString(
<EnvProvider>
<FooApp />
</EnvProvider>
);
// Wait for all the queries to load.
const relayData = await relaySSRMiddleware.getCache();
// Inject fully loaded data into another rendering.
const CompleteEnvProvider = EnvironmentProvider(
new Environment({
network: Network.create(() => relayData[0][1]),
store
})
);
// Re-compile, this time with complete html.
const html = ReactDOMServer.renderToString(
<CompleteEnvProvider>
<FooApp />
</CompleteEnvProvider>
);
res.status(200).send(`... output to be hydrated ...`);
} catch (error) {
res.status(500).send(`... Some error handling message ...`);
}
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment