1
0
Fork 0
mirror of https://github.com/terribleplan/next.js.git synced 2024-01-19 02:48:18 +00:00
next.js/lib/app.js

85 lines
1.8 KiB
JavaScript
Raw Normal View History

2016-10-05 23:52:50 +00:00
import React, { Component, PropTypes } from 'react'
2016-10-14 15:05:08 +00:00
import { AppContainer } from 'react-hot-loader'
2016-10-05 23:52:50 +00:00
export default class App extends Component {
static childContextTypes = {
router: PropTypes.object,
headManager: PropTypes.object
}
constructor (props) {
super(props)
this.state = propsToState(props)
this.close = null
}
componentWillReceiveProps (nextProps) {
const state = propsToState(nextProps)
try {
this.setState(state)
} catch (err) {
console.error(err)
}
}
componentDidMount () {
const { router } = this.props
2016-10-08 05:12:51 +00:00
this.close = router.subscribe((data) => {
const props = data.props || this.state.props
2016-10-05 23:52:50 +00:00
const state = propsToState({
2016-10-08 05:12:51 +00:00
...data,
2016-10-14 15:05:08 +00:00
props,
2016-10-06 07:08:23 +00:00
router
2016-10-05 23:52:50 +00:00
})
try {
this.setState(state)
} catch (err) {
console.error(err)
}
})
}
componentWillUnmount () {
if (this.close) this.close()
}
getChildContext () {
const { router, headManager } = this.props
return { router, headManager }
}
render () {
const { Component, props } = this.state
2016-10-14 15:05:08 +00:00
if (typeof window === 'undefined') {
2016-10-14 15:05:08 +00:00
// workaround for https://github.com/gaearon/react-hot-loader/issues/283
return <Component {...props} />
2016-10-14 15:05:08 +00:00
}
return <AppContainer>
<Component {...props} />
2016-10-14 15:05:08 +00:00
</AppContainer>
2016-10-05 23:52:50 +00:00
}
}
function propsToState (props) {
const { Component, router } = props
2016-10-08 05:12:51 +00:00
const { route } = router
2016-10-05 23:52:50 +00:00
const url = {
query: router.query,
pathname: router.pathname,
back: () => router.back(),
2016-10-08 05:12:51 +00:00
push: (url) => router.push(route, url),
pushTo: (url) => router.push(null, url),
replace: (url) => router.replace(route, url),
replaceTo: (url) => router.replace(null, url)
2016-10-05 23:52:50 +00:00
}
return {
Component,
props: { ...props.props, url }
}
}