1 |
|
2 |
|
3 |
|
4 |
|
5 |
|
6 | 'use strict'
|
7 |
|
8 | import React, {PropTypes as types} from 'react'
|
9 | import ApToast from './ap_toast'
|
10 | import {ApPureMixin} from 'apeman-react-mixin-pure'
|
11 | import ApInfoToast from './ap_info_toast'
|
12 | import ApWarnToast from './ap_warn_toast'
|
13 | import ApErrorToast from './ap_error_toast'
|
14 | import Toaster from './toasting/toaster'
|
15 | import classnames from 'classnames'
|
16 |
|
17 |
|
18 | const ApToastGroup = React.createClass({
|
19 |
|
20 |
|
21 |
|
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 |
|
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 |
|
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 |
|
112 |
|
113 |
|
114 | bindToaster(toaster){
|
115 | const s = this
|
116 | toaster.addListener('toast', s.handleToast)
|
117 | },
|
118 |
|
119 | |
120 |
|
121 |
|
122 |
|
123 | unbindToaster(toaster){
|
124 | const s = this
|
125 | toaster.removeListener('toast', s.handleToast)
|
126 | },
|
127 |
|
128 | |
129 |
|
130 |
|
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 |
|
142 | export default ApToastGroup; |
\ | No newline at end of file |