apeman-react-mixins
Version:
React mixin set of apeman.
89 lines (74 loc) • 1.85 kB
JSX
/**
* Server mixin.
* @module ApServerMixin
*
* Generated by coz on 3/6/2016,
* from a template provided by apeman-bud-react.
*
* @see https://facebook.github.io/react/
*/
import defaults from 'defaults'
import assert from 'assert'
import Promise, {untilResolved} from 'apemanpromise'
/** @lends ApServerMixin */
let ApServerMixin = {
// --------------------
// Custom
// --------------------
$apServerMixed: true,
// --------------------
// Lifecycle
// --------------------
componentWillMount () {
const s = this
assert(s.getServerEventSource, '.getServerEventSource() is required.')
assert(s.getServerPollingConfig, '.getServerPollingConfig() is required.')
assert(s.knockServer, '.knockServer() is required.')
let noop = (value) => value
defaults(s, {
serverWillRestart: noop,
serverDidRestart: noop,
serverDidGone: noop
})
},
componentDidMount () {
const s = this
let es = s.getServerEventSource()
if (es) {
es.addEventListener('server:restart', s.handleServerRestart)
s._serverES = es
}
},
componentWillUnmount () {
const s = this
let es = s._serverES
if (es) {
es.removeEventListener('server:restart', s.handleServerRestart)
es.close()
}
},
// --------------------
// Custom
// --------------------
handleServerRestart (e) {
const s = this
s.serverWillRestart()
let pollingConfig = s.getServerPollingConfig()
untilResolved(
() => Promise.resolve(s.knockServer()),
pollingConfig
)
.then((res) => {
s.serverDidRestart()
})
.catch((err) => {
s.serverDidGone()
})
},
// --------------------
// Private
// --------------------
_serverES: undefined
}
export default Object.freeze(ApServerMixin)