UNPKG

apeman-react-toast

Version:
131 lines (112 loc) 2.95 kB
/** * Toast group. * @constructor ApToastGroup */ "use strict"; 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;