UNPKG

apeman-react-toast

Version:
129 lines (107 loc) 2.73 kB
/** * Toast component * @class ApToast */ 'use strict' import React, {PropTypes as types} from 'react' import classnames from 'classnames' import {shallowEqual, deepEqual} from 'asobj' import ApToastItem from './ap_toast_item' import ReactCSSTransitionGroup from 'react-addons-css-transition-group' /** @lends ApToast */ const ApToast = React.createClass({ // -------------------- // Specs // -------------------- propTypes: { /** Messages to show */ messages: types.arrayOf(types.string), /** Icon to show */ icon: types.string, /** Dismiss an item */ dismiss: types.func, /** Level of toast */ level: types.string }, mixins: [], statics: {}, getInitialState () { return {} }, getDefaultProps () { return { transitionTimeout: 100, level: 'default', messages: [], icon: null, dismiss: null } }, render () { const s = this let { props } = s let { messages, icon, dismiss, className, style, level, transitionTimeout } = props let children = messages .filter(Boolean) .map((message) => ( <ApToastItem key={ message } text={ message } icon={ icon } onTap={ () => dismiss(message, level) } > </ApToastItem> )) if (children.length === 0) { return null } return ( <div className={ classnames('ap-toast', className, {}) } style={ Object.assign({}, style) }> <ReactCSSTransitionGroup component='div' className='ap-toast-inner' transitionName='ap-toast-transition' transitionEnterTimeout={ transitionTimeout } transitionLeaveTimeout={ transitionTimeout } > { children } </ReactCSSTransitionGroup> </div> ) }, // -------------------- // Lifecycle // -------------------- componentWillMount () { const s = this }, componentDidMount () { const s = this let { props } = s }, componentWillReceiveProps (nextProps) { const s = this }, componentWillUnmount () { const s = this }, shouldComponentUpdate (nextProps, nextState) { const s = this let { props, state } = s let messageChanged = !deepEqual(props.messages, nextProps.messages) if (messageChanged) { return true } return !shallowEqual(props, nextProps) || shallowEqual(state, nextState) } // ------------------ // Custom // ------------------ // ------------------ // Private // ------------------ }) export default ApToast