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'
|
2017-01-12 01:58:20 +00:00
|
|
|
import shallowEquals from './shallow-equals'
|
2016-10-05 23:52:50 +00:00
|
|
|
|
2017-01-12 01:58:20 +00:00
|
|
|
const ErrorDebug = process.env.NODE_ENV === 'production'
|
|
|
|
? null : require('./error-debug').default
|
|
|
|
|
2016-10-05 23:52:50 +00:00
|
|
|
export default class App extends Component {
|
|
|
|
static childContextTypes = {
|
|
|
|
headManager: PropTypes.object
|
|
|
|
}
|
|
|
|
|
2017-01-12 01:58:20 +00:00
|
|
|
getChildContext () {
|
|
|
|
const { headManager } = this.props
|
|
|
|
return { headManager }
|
2016-10-05 23:52:50 +00:00
|
|
|
}
|
|
|
|
|
2017-01-12 01:58:20 +00:00
|
|
|
render () {
|
2017-02-28 17:31:17 +00:00
|
|
|
const { Component, props, hash, err, router } = this.props
|
2017-03-06 16:48:35 +00:00
|
|
|
const url = createUrl(router)
|
|
|
|
const containerProps = { Component, props, hash, router, url }
|
2016-10-05 23:52:50 +00:00
|
|
|
|
2017-01-12 01:58:20 +00:00
|
|
|
return <div>
|
|
|
|
<Container {...containerProps} />
|
2017-01-21 18:46:18 +00:00
|
|
|
{ErrorDebug && err ? <ErrorDebug error={err} /> : null}
|
2017-01-12 01:58:20 +00:00
|
|
|
</div>
|
2016-10-05 23:52:50 +00:00
|
|
|
}
|
2017-01-12 01:58:20 +00:00
|
|
|
}
|
2016-10-05 23:52:50 +00:00
|
|
|
|
2017-01-12 01:58:20 +00:00
|
|
|
class Container extends Component {
|
2017-02-28 17:31:17 +00:00
|
|
|
componentDidMount () {
|
|
|
|
this.scrollToHash()
|
|
|
|
}
|
|
|
|
|
|
|
|
componentDidUpdate () {
|
|
|
|
this.scrollToHash()
|
|
|
|
}
|
|
|
|
|
|
|
|
scrollToHash () {
|
|
|
|
const { hash } = this.props
|
|
|
|
const el = document.getElementById(hash)
|
|
|
|
if (el) {
|
|
|
|
// If we call scrollIntoView() in here without a setTimeout
|
|
|
|
// it won't scroll properly.
|
|
|
|
setTimeout(() => el.scrollIntoView(), 0)
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2017-01-12 01:58:20 +00:00
|
|
|
shouldComponentUpdate (nextProps) {
|
|
|
|
// need this check not to rerender component which has already thrown an error
|
|
|
|
return !shallowEquals(this.props, nextProps)
|
2016-10-05 23:52:50 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
render () {
|
2017-03-06 16:48:35 +00:00
|
|
|
const { Component, props, url } = this.props
|
2016-10-14 15:05:08 +00:00
|
|
|
|
2017-01-12 01:58:20 +00:00
|
|
|
// includes AppContainer which bypasses shouldComponentUpdate method
|
|
|
|
// https://github.com/gaearon/react-hot-loader/issues/442
|
2017-01-21 18:46:18 +00:00
|
|
|
return <AppContainer errorReporter={ErrorDebug}>
|
2017-01-12 01:58:20 +00:00
|
|
|
<Component {...props} url={url} />
|
2016-10-14 15:05:08 +00:00
|
|
|
</AppContainer>
|
2016-10-05 23:52:50 +00:00
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2017-01-12 01:58:20 +00:00
|
|
|
function createUrl (router) {
|
|
|
|
return {
|
2016-10-05 23:52:50 +00:00
|
|
|
query: router.query,
|
2017-03-06 16:48:35 +00:00
|
|
|
pathname: router.pathname
|
2016-10-05 23:52:50 +00:00
|
|
|
}
|
|
|
|
}
|