-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathserver-render.js
More file actions
65 lines (61 loc) · 2.12 KB
/
Copy pathserver-render.js
File metadata and controls
65 lines (61 loc) · 2.12 KB
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
const serialize = require('serialize-javascript')
const ejs = require('ejs')
const asyncBootstrap = require('react-async-bootstrapper').default
const ReactDomServer = require('react-dom/server')
const Helmet = require('react-helmet').default
const SheetsRegistry = require('react-jss').SheetsRegistry
// const create = require('jss').create
// const preset = require('jss-preset-default').default
const createMuiTheme = require('material-ui/styles').createMuiTheme
const createGenerateClassName = require('material-ui/styles').createGenerateClassName
const colors = require('material-ui/colors')
const getStoreState = (stores) => {
return Object.keys(stores).reduce((result, storeName) => {
result[storeName] = stores[storeName].toJson()
return result
}, {})
}
module.exports = (bundle, template, req, res) => {
const createStoreMap = bundle.createStoreMap
const createApp = bundle.default
const routerContext = {}
const stores = createStoreMap()
const user = req.session.user
if (user) {
stores.appState.user.isLogin = true
stores.appState.user.info = user
}
const sheetsRegistry = new SheetsRegistry()
const theme = createMuiTheme({
palette: {
primary: colors.lightBlue,
accent: colors.pink,
type: 'light'
}
})
const generateClassName = createGenerateClassName()
const app = createApp(stores, routerContext, sheetsRegistry, generateClassName, theme, req.url)
return new Promise((resolve, reject) => {
asyncBootstrap(app).then(() => {
const appString = ReactDomServer.renderToString(app)
if (routerContext.url) {
res.status(302).setHeader('Location', routerContext.url)
res.end()
return
}
const helmet = Helmet.rewind()
const state = getStoreState(stores)
const html = ejs.render(template, {
appString,
initialState: serialize(state),
title: helmet.title.toString(),
meta: helmet.meta.toString(),
style: helmet.style.toString(),
link: helmet.link.toString(),
materialCss: sheetsRegistry.toString()
})
res.send(html)
resolve()
}).catch(reject)
})
}