apeman-react-toast
Version:
apeman react package for toast components.
131 lines (112 loc) • 2.95 kB
JSX
/**
* Toast group.
* @constructor ApToastGroup
*/
;
import React, {PropTypes as types} from 'react';
import ApToast from './ap_toast';
import {ApPureMixin} from 'apeman-react-mixins';
import ApInfoToast from './ap_info_toast';
import ApWarnToast from './ap_warn_toast';
import ApErrorToast from './ap_error_toast';
import Toaster from './toaster';
import classnames from 'classnames';
/** @lends ApToastGroup */
let ApToastGroup = React.createClass({
//--------------------
// Specs
//--------------------
propTypes: {
duration: types.number,
toaster: types.instanceOf(Toaster)
},
mixins: [
ApPureMixin
],
statics: {
Toaster: Toaster
},
getInitialState() {
let state = {_date: null};
Toaster.levels.forEach(level => {
state[level] = null;
});
return state;
},
getDefaultProps() {
return {
toaster: null
};
},
render() {
let s = this;
let {state, props} = s;
let {duration} = props;
return (
<div className={classnames('ap-toast-group', props.className)}>
<ApToast message={state.default} duration={duration}/>
<ApInfoToast message={state.info} duration={duration}/>
<ApWarnToast message={state.warn} duration={duration}/>
<ApErrorToast message={state.error} duration={duration}/>
{props.children}
</div>
);
},
//--------------------
// Lifecycle
//--------------------
componentDidMount() {
let s = this,
{props} = s;
if (props.toaster) {
s.bindToaster(props.toaster);
}
},
componentWillReceiveProps(nextProps) {
let s = this,
{props} = s;
if (nextProps.toaster) {
s.unbindToaster(props.toaster);
s.bindToaster(nextProps.toaster);
}
},
componentWillUnmount() {
let s = this,
{props} = s;
if (props.toaster) {
s.unbindToaster(props.toaster);
}
},
//--------------------
// Custom
//--------------------
/**
* Bind toaster events.
* @param toaster
*/
bindToaster(toaster){
let s = this;
toaster.addListener('toast', s.handleToast);
},
/**
* Unbind toaster events.
* @param toaster
*/
unbindToaster(toaster){
let s = this;
toaster.removeListener('toast', s.handleToast);
},
/**
* Handle toaster events.
* @param data
*/
handleToast(data){
let s = this;
let state = {_date: new Date()};
Toaster.levels.forEach(level => {
state[level] = data.level === level ? data.message : null;
});
s.setState(state);
}
});
module.exports = ApToastGroup;