UNPKG

3.02 kBJSXView Raw
1/**
2 * Toast group.
3 * @class ApToastGroup
4 */
5
6'use strict'
7
8import React, {PropTypes as types} from 'react'
9import ApToast from './ap_toast'
10import {ApPureMixin} from 'apeman-react-mixin-pure'
11import ApInfoToast from './ap_info_toast'
12import ApWarnToast from './ap_warn_toast'
13import ApErrorToast from './ap_error_toast'
14import Toaster from './toasting/toaster'
15import classnames from 'classnames'
16
17/** @lends ApToastGroup */
18const ApToastGroup = React.createClass({
19
20 // --------------------
21 // Specs
22 // --------------------
23
24 propTypes: {
25 duration: types.number,
26 toaster: types.instanceOf(Toaster)
27 },
28
29 mixins: [
30 ApPureMixin
31 ],
32
33 statics: {
34 Toaster: Toaster
35 },
36
37 getInitialState () {
38 let state = { _date: null }
39 Toaster.levels.forEach(level => {
40 state[ level ] = null;
41 })
42 return state;
43 },
44
45 getDefaultProps () {
46 return {
47 toaster: null
48 }
49 },
50
51 render () {
52 const s = this
53 let { state, props } = s
54 let { duration } = props
55
56 return (
57 <div className={ classnames('ap-toast-group', {
58 }, props.className) }>
59 <ApToast message={ state.default } duration={ duration } name="default" onDismiss={ s.handleDismiss }/>
60 <ApInfoToast message={ state.info } duration={ duration } name="info" onDismiss={ s.handleDismiss }/>
61 <ApWarnToast message={ state.warn } duration={ duration } name="warn" onDismiss={ s.handleDismiss }/>
62 <ApErrorToast message={ state.error } duration={ duration } name="error" onDismiss={ s.handleDismiss }/>
63 { props.children }
64 </div>
65 )
66 },
67
68 // --------------------
69 // Lifecycle
70 // --------------------
71
72 componentDidMount () {
73 const s = this
74 let { props } = s
75 if (props.toaster) {
76 s.bindToaster(props.toaster)
77 }
78 },
79
80 componentWillReceiveProps (nextProps) {
81 const s = this
82 let { props } = s
83 if (nextProps.toaster) {
84 s.unbindToaster(props.toaster)
85 s.bindToaster(nextProps.toaster)
86 }
87 },
88
89 componentWillUnmount () {
90 const s = this
91 let { props } = s
92 if (props.toaster) {
93 s.unbindToaster(props.toaster)
94 }
95 },
96
97 // --------------------
98 // Custom
99 // --------------------
100
101 handleDismiss(e) {
102 const s = this
103 let { state } = s
104 let { name, dismissed } = e
105 if (state[ name ] === dismissed) {
106 s.setState({ name: null })
107 }
108 },
109
110 /**
111 * Bind toaster events.
112 * @param toaster
113 */
114 bindToaster(toaster){
115 const s = this
116 toaster.addListener('toast', s.handleToast)
117 },
118
119 /**
120 * Unbind toaster events.
121 * @param toaster
122 */
123 unbindToaster(toaster){
124 const s = this
125 toaster.removeListener('toast', s.handleToast)
126 },
127
128 /**
129 * Handle toaster events.
130 * @param data
131 */
132 handleToast(data){
133 const s = this
134 let state = { _date: new Date() }
135 Toaster.levels.forEach((level) => {
136 state[ level ] = data.level === level ? data.message : null;
137 })
138 s.setState(state)
139 }
140})
141
142export default ApToastGroup;
\No newline at end of file