/
AppRoot.js
78 lines (69 loc) · 2.76 KB
/
AppRoot.js
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
import React from 'react';
import { SitecoreContext, SitecoreContextFactory } from '@sitecore-jss/sitecore-jss-react';
import { Route, Switch } from 'react-router-dom';
import { ApolloProvider } from 'react-apollo';
import componentFactory from './temp/componentFactory';
import RouteHandler from './RouteHandler';
// This is the main JSX entry point of the app invoked by the renderer (server or client rendering).
// By default the app's normal rendering is delegated to <RouteHandler> that handles the loading of JSS route data.
// support languages in the URL prefix
// e.g. /da-DK/path, or /en/path, or /path
export const routePatterns = [
'/:lang([a-z]{2}-[A-Z]{2})/:sitecoreRoute*',
'/:lang([a-z]{2})/:sitecoreRoute*',
'/:sitecoreRoute*',
];
// wrap the app with:
// ApolloProvider: provides an instance of Apollo GraphQL client to the app to make Connected GraphQL queries.
// Not needed if not using connected GraphQL.
// SitecoreContext: provides component resolution and context services via withSitecoreContext
// Router: provides a basic routing setup that will resolve Sitecore item routes and allow for language URL prefixes.
class AppRoot extends React.Component {
constructor(props) {
super(props);
this.state = {
ssrRenderComplete: false,
contextFactory: new SitecoreContextFactory()
}
if (props.ssrState && props.ssrState.sitecore && props.ssrState.sitecore.route) {
// set the initial sitecore context data if we got SSR initial state
this.state.contextFactory.setSitecoreContext({
route: props.ssrState.sitecore.route,
itemId: props.ssrState.sitecore.route.itemId,
...props.ssrState.sitecore.context,
});
} else if (props.ssrState) {
this.state.contextFactory.setSitecoreContext(props.ssrState.sitecore.context)
} else {
this.state.contextFactory.setSitecoreContext(null);
}
}
setSsrRenderComplete = ssrRenderComplete => (
this.setState({
ssrRenderComplete
})
)
render() {
const { path, Router, graphQLClient } = this.props;
const routeRenderFunction = (props) =>
<RouteHandler
route={props}
ssrRenderComplete={this.state.ssrRenderComplete}
setSsrRenderComplete={this.setSsrRenderComplete}
/>;
return (
<ApolloProvider client={graphQLClient}>
<SitecoreContext componentFactory={componentFactory} contextFactory={this.state.contextFactory}>
<Router location={path} context={{}}>
<Switch>
{routePatterns.map((routePattern) => (
<Route key={routePattern} path={routePattern} render={routeRenderFunction} />
))}
</Switch>
</Router>
</SitecoreContext>
</ApolloProvider>
);
}
}
export default AppRoot;