UNPKG

14.8 kBJavaScriptView Raw
1/**
2 * Toast component
3 * @class ApToast
4 */
5
6'use strict';
7
8Object.defineProperty(exports, "__esModule", {
9 value: true
10});
11
12var _react = require('react');
13
14var _react2 = _interopRequireDefault(_react);
15
16var _apemanReactMixinPure = require('apeman-react-mixin-pure');
17
18var _classnames = require('classnames');
19
20var _classnames2 = _interopRequireDefault(_classnames);
21
22var _arrayfilter = require('arrayfilter');
23
24var _arrayfilter2 = _interopRequireDefault(_arrayfilter);
25
26var _ap_toast_item = require('./ap_toast_item');
27
28var _ap_toast_item2 = _interopRequireDefault(_ap_toast_item);
29
30function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
31
32/** @lends ApToast */
33var ApToast = _react2.default.createClass({
34 displayName: 'ApToast',
35
36
37 // --------------------
38 // Specs
39 // --------------------
40
41 propTypes: {
42 message: _react.PropTypes.string,
43 duration: _react.PropTypes.number,
44 icon: _react.PropTypes.string,
45 name: _react.PropTypes.string,
46 onDismiss: _react.PropTypes.func
47 },
48
49 mixins: [_apemanReactMixinPure.ApPureMixin],
50
51 statics: {
52 itemJoiner: '____'
53 },
54
55 getInitialState: function getInitialState() {
56 return {
57 items: ''
58 };
59 },
60 getDefaultProps: function getDefaultProps() {
61 return {
62 message: null,
63 duration: 2000,
64 icon: null,
65 name: null,
66 onDismiss: null
67 };
68 },
69 render: function render() {
70 var s = this;
71 var state = s.state;
72 var props = s.props;
73
74
75 var valid = state.items.length;
76 if (!valid) {
77 return null;
78 }
79 return _react2.default.createElement(
80 'div',
81 { className: (0, _classnames2.default)('ap-toast', props.className, {}),
82 style: Object.assign({}, props.style) },
83 _react2.default.createElement(
84 'div',
85 { className: 'ap-toast-inner' },
86 s._renderToastItem()
87 )
88 );
89 },
90
91
92 // --------------------
93 // Lifecycle
94 // --------------------
95
96 componentWillMount: function componentWillMount() {
97 var s = this;
98 },
99 componentDidMount: function componentDidMount() {
100 var s = this;
101 var props = s.props;
102
103 s.startTicking();
104 s.pushToastItem(props.message);
105 },
106 componentWillReceiveProps: function componentWillReceiveProps(nextProps) {
107 var s = this;
108 s.pushToastItem(nextProps.message);
109 },
110 componentWillUnmount: function componentWillUnmount() {
111 var s = this;
112 s.stopTicking();
113 },
114
115
116 // ------------------
117 // Custom
118 // ------------------
119
120 startTicking: function startTicking() {
121 var s = this;
122 clearTimeout(s._tickTimer);
123 s._ticking = true;
124 s.doTick();
125 },
126 stopTicking: function stopTicking() {
127 var s = this;
128 clearTimeout(s._tickTimer);
129 s._ticking = false;
130 },
131 doTick: function doTick() {
132 var s = this;
133 var props = s.props;
134
135 if (!s._ticking) {
136 return;
137 }
138 s._tickTimer = setTimeout(function () {
139 s.shiftToastItem();
140 s.doTick();
141 }, props.duration);
142 },
143 pushToastItem: function pushToastItem(message) {
144 var s = this;
145 if (!message) {
146 return;
147 }
148 var items = (s.state.items || '').split(ApToast.itemJoiner);
149 var duplicate = items[items.length - 1] === message;
150 if (duplicate) {
151 return;
152 }
153 s.setState({
154 items: items.concat(message).join(ApToast.itemJoiner)
155 });
156 },
157 shiftToastItem: function shiftToastItem() {
158 var s = this;
159 var props = s.props;
160
161 var items = (s.state.items || '').split(ApToast.itemJoiner);
162 if (!items.length) {
163 s.setState({ items: null });
164 return;
165 }
166 s.dismissToastItem(items[0]);
167 },
168 dismissToastItem: function dismissToastItem(message) {
169 var s = this;
170 var props = s.props;
171
172 var items = (s.state.items || '').split(ApToast.itemJoiner);
173 s.setState({
174 items: items.filter(function (filtering) {
175 return filtering !== message;
176 }).join(ApToast.itemJoiner)
177 });
178 if (props.onDismiss) {
179 props.onDismiss({ dismissed: message, name: props.name });
180 }
181 },
182 handleToastItemTap: function handleToastItemTap(e) {
183 var s = this;
184 var text = e.target.dataset['text'];
185 s.dismissToastItem(text);
186 },
187
188
189 // ------------------
190 // Private
191 // ------------------
192 _ticking: false,
193 _tickTimer: null,
194 _renderToastItem: function _renderToastItem() {
195 var s = this;
196 var state = s.state;
197 var props = s.props;
198
199 return (state.items || '').split(ApToast.itemJoiner).filter(_arrayfilter2.default.emptyReject()).map(function (text, i) {
200 return _react2.default.createElement(_ap_toast_item2.default, { key: 'toast-' + text + '-' + i,
201 text: text,
202 icon: props.icon,
203 onTap: s.handleToastItemTap
204 });
205 });
206 }
207});
208
209exports.default = ApToast;
210//# sourceMappingURL=data:application/json;base64,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LEtBQVg7QUFJQSxRQUFJLE1BQU0sU0FBVixFQUFxQjtBQUNuQixZQUFNLFNBQU4sQ0FBZ0IsRUFBRSxXQUFXLE9BQWIsRUFBc0IsTUFBTSxNQUFNLElBQWxDLEVBQWhCO0FBQ0Q7QUFDRixHQW5KK0I7QUFxSmhDLG9CQXJKZ0MsOEJBcUpaLENBckpZLEVBcUpUO0FBQ3JCLFFBQU0sSUFBSSxJQUFWO0FBQ0EsUUFBSSxPQUFPLEVBQUUsTUFBRixDQUFTLE9BQVQsQ0FBa0IsTUFBbEIsQ0FBWDtBQUNBLE1BQUUsZ0JBQUYsQ0FBbUIsSUFBbkI7QUFDRCxHQXpKK0I7Ozs7OztBQThKaEMsWUFBVSxLQTlKc0I7QUErSmhDLGNBQVksSUEvSm9CO0FBZ0toQyxrQkFoS2dDLDhCQWdLWjtBQUNsQixRQUFNLElBQUksSUFBVjtBQURrQixRQUVaLEtBRlksR0FFSyxDQUZMLENBRVosS0FGWTtBQUFBLFFBRUwsS0FGSyxHQUVLLENBRkwsQ0FFTCxLQUZLOztBQUdsQixXQUFPLENBQUMsTUFBTSxLQUFOLElBQWUsRUFBaEIsRUFBb0IsS0FBcEIsQ0FBMEIsUUFBUSxVQUFsQyxFQUNKLE1BREksQ0FDRyxzQkFBWSxXQUFaLEVBREgsRUFFSixHQUZJLENBRUEsVUFBQyxJQUFELEVBQU8sQ0FBUDtBQUFBLGFBQ0QseURBQWEsZ0JBQWMsSUFBZCxTQUFzQixDQUFuQztBQUNhLGNBQU0sSUFEbkI7QUFFYSxjQUFNLE1BQU0sSUFGekI7QUFHYSxlQUFPLEVBQUU7QUFIdEIsUUFEQztBQUFBLEtBRkEsQ0FBUDtBQVdEO0FBOUsrQixDQUFsQixDQUFoQjs7a0JBaUxlLE8iLCJmaWxlIjoiYXBfdG9hc3QuanMiLCJzb3VyY2VSb290IjoiL1VzZXJzL29rdW5pc2hpbmlzaGkvUHJvamVjdHMvYXBlbWFuLXByb2plY3RzL2FwZW1hbi1yZWFjdC10b2FzdC9saWIiLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIFRvYXN0IGNvbXBvbmVudFxuICogQGNsYXNzIEFwVG9hc3RcbiAqL1xuXG4ndXNlIHN0cmljdCdcblxuaW1wb3J0IFJlYWN0LCB7UHJvcFR5cGVzIGFzIHR5cGVzfSBmcm9tICdyZWFjdCdcbmltcG9ydCB7QXBQdXJlTWl4aW59IGZyb20gJ2FwZW1hbi1yZWFjdC1taXhpbi1wdXJlJ1xuaW1wb3J0IGNsYXNzbmFtZXMgZnJvbSAnY2xhc3NuYW1lcydcbmltcG9ydCBhcnJheWZpbHRlciBmcm9tICdhcnJheWZpbHRlcidcbmltcG9ydCBBcFRvYXN0SXRlbSBmcm9tICcuL2FwX3RvYXN0X2l0ZW0nXG5cbi8qKiBAbGVuZHMgQXBUb2FzdCAqL1xuY29uc3QgQXBUb2FzdCA9IFJlYWN0LmNyZWF0ZUNsYXNzKHtcblxuICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLVxuICAvLyBTcGVjc1xuICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLVxuXG4gIHByb3BUeXBlczoge1xuICAgIG1lc3NhZ2U6IHR5cGVzLnN0cmluZyxcbiAgICBkdXJhdGlvbjogdHlwZXMubnVtYmVyLFxuICAgIGljb246IHR5cGVzLnN0cmluZyxcbiAgICBuYW1lOiB0eXBlcy5zdHJpbmcsXG4gICAgb25EaXNtaXNzOiB0eXBlcy5mdW5jXG4gIH0sXG5cbiAgbWl4aW5zOiBbXG4gICAgQXBQdXJlTWl4aW5cbiAgXSxcblxuICBzdGF0aWNzOiB7XG4gICAgaXRlbUpvaW5lcjogJ19fX18nXG4gIH0sXG5cbiAgZ2V0SW5pdGlhbFN0YXRlICgpIHtcbiAgICByZXR1cm4ge1xuICAgICAgaXRlbXM6ICcnXG4gICAgfVxuICB9LFxuXG4gIGdldERlZmF1bHRQcm9wcyAoKSB7XG4gICAgcmV0dXJuIHtcbiAgICAgIG1lc3NhZ2U6IG51bGwsXG4gICAgICBkdXJhdGlvbjogMjAwMCxcbiAgICAgIGljb246IG51bGwsXG4gICAgICBuYW1lOiBudWxsLFxuICAgICAgb25EaXNtaXNzOiBudWxsXG4gICAgfVxuICB9LFxuXG4gIHJlbmRlciAoKSB7XG4gICAgY29uc3QgcyA9IHRoaXNcbiAgICBsZXQgeyBzdGF0ZSwgcHJvcHMgfSA9IHNcblxuICAgIGxldCB2YWxpZCA9IHN0YXRlLml0ZW1zLmxlbmd0aFxuICAgIGlmICghdmFsaWQpIHtcbiAgICAgIHJldHVybiBudWxsXG4gICAgfVxuICAgIHJldHVybiAoXG4gICAgICA8ZGl2IGNsYXNzTmFtZT17IGNsYXNzbmFtZXMoJ2FwLXRvYXN0JywgcHJvcHMuY2xhc3NOYW1lLCB7fSkgfVxuICAgICAgICAgICBzdHlsZT17IE9iamVjdC5hc3NpZ24oe30sIHByb3BzLnN0eWxlKSB9PlxuICAgICAgICA8ZGl2IGNsYXNzTmFtZT1cImFwLXRvYXN0LWlubmVyXCI+XG4gICAgICAgICAge3MuX3JlbmRlclRvYXN0SXRlbSgpfVxuICAgICAgICA8L2Rpdj5cbiAgICAgIDwvZGl2PlxuICAgIClcbiAgfSxcblxuICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLVxuICAvLyBMaWZlY3ljbGVcbiAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS1cblxuICBjb21wb25lbnRXaWxsTW91bnQgKCkge1xuICAgIGNvbnN0IHMgPSB0aGlzXG4gIH0sXG5cbiAgY29tcG9uZW50RGlkTW91bnQgKCkge1xuICAgIGNvbnN0IHMgPSB0aGlzXG4gICAgbGV0IHsgcHJvcHMgfSA9IHNcbiAgICBzLnN0YXJ0VGlja2luZygpXG4gICAgcy5wdXNoVG9hc3RJdGVtKHByb3BzLm1lc3NhZ2UpXG4gIH0sXG5cbiAgY29tcG9uZW50V2lsbFJlY2VpdmVQcm9wcyAobmV4dFByb3BzKSB7XG4gICAgY29uc3QgcyA9IHRoaXNcbiAgICBzLnB1c2hUb2FzdEl0ZW0obmV4dFByb3BzLm1lc3NhZ2UpXG4gIH0sXG5cbiAgY29tcG9uZW50V2lsbFVubW91bnQgKCkge1xuICAgIGNvbnN0IHMgPSB0aGlzXG4gICAgcy5zdG9wVGlja2luZygpXG4gIH0sXG5cbiAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tXG4gIC8vIEN1c3RvbVxuICAvLyAtLS0tLS0tLS0tLS0tLS0tLS1cblxuICBzdGFydFRpY2tpbmcgKCkge1xuICAgIGNvbnN0IHMgPSB0aGlzXG4gICAgY2xlYXJUaW1lb3V0KHMuX3RpY2tUaW1lcilcbiAgICBzLl90aWNraW5nID0gdHJ1ZVxuICAgIHMuZG9UaWNrKClcbiAgfSxcblxuICBzdG9wVGlja2luZyAoKSB7XG4gICAgY29uc3QgcyA9IHRoaXNcbiAgICBjbGVhclRpbWVvdXQocy5fdGlja1RpbWVyKVxuICAgIHMuX3RpY2tpbmcgPSBmYWxzZVxuICB9LFxuXG4gIGRvVGljayAoKSB7XG4gICAgY29uc3QgcyA9IHRoaXNcbiAgICBsZXQgeyBwcm9wcyB9ID0gc1xuICAgIGlmICghcy5fdGlja2luZykge1xuICAgICAgcmV0dXJuXG4gICAgfVxuICAgIHMuX3RpY2tUaW1lciA9IHNldFRpbWVvdXQoKCkgPT4ge1xuICAgICAgcy5zaGlmdFRvYXN0SXRlbSgpXG4gICAgICBzLmRvVGljaygpXG4gICAgfSwgcHJvcHMuZHVyYXRpb24pXG4gIH0sXG5cbiAgcHVzaFRvYXN0SXRlbSAobWVzc2FnZSkge1xuICAgIGNvbnN0IHMgPSB0aGlzXG4gICAgaWYgKCFtZXNzYWdlKSB7XG4gICAgICByZXR1cm5cbiAgICB9XG4gICAgbGV0IGl0ZW1zID0gKHMuc3RhdGUuaXRlbXMgfHwgJycpLnNwbGl0KEFwVG9hc3QuaXRlbUpvaW5lcilcbiAgICBsZXQgZHVwbGljYXRlID0gaXRlbXNbIGl0ZW1zLmxlbmd0aCAtIDEgXSA9PT0gbWVzc2FnZVxuICAgIGlmIChkdXBsaWNhdGUpIHtcbiAgICAgIHJldHVyblxuICAgIH1cbiAgICBzLnNldFN0YXRlKHtcbiAgICAgIGl0ZW1zOiBpdGVtcy5jb25jYXQobWVzc2FnZSkuam9pbihBcFRvYXN0Lml0ZW1Kb2luZXIpXG4gICAgfSlcbiAgfSxcblxuICBzaGlmdFRvYXN0SXRlbSAoKSB7XG4gICAgY29uc3QgcyA9IHRoaXNcbiAgICBsZXQgeyBwcm9wcyB9ID0gc1xuICAgIGxldCBpdGVtcyA9IChzLnN0YXRlLml0ZW1zIHx8ICcnKS5zcGxpdChBcFRvYXN0Lml0ZW1Kb2luZXIpXG4gICAgaWYgKCFpdGVtcy5sZW5ndGgpIHtcbiAgICAgIHMuc2V0U3RhdGUoeyBpdGVtczogbnVsbCB9KVxuICAgICAgcmV0dXJuXG4gICAgfVxuICAgIHMuZGlzbWlzc1RvYXN0SXRlbShpdGVtc1sgMCBdKVxuICB9LFxuXG4gIGRpc21pc3NUb2FzdEl0ZW0gKG1lc3NhZ2UpIHtcbiAgICBjb25zdCBzID0gdGhpc1xuICAgIGxldCB7IHByb3BzIH0gPSBzXG4gICAgbGV0IGl0ZW1zID0gKHMuc3RhdGUuaXRlbXMgfHwgJycpLnNwbGl0KEFwVG9hc3QuaXRlbUpvaW5lcilcbiAgICBzLnNldFN0YXRlKHtcbiAgICAgIGl0ZW1zOiBpdGVtcy5maWx0ZXIoKGZpbHRlcmluZykgPT4gZmlsdGVyaW5nICE9PSBtZXNzYWdlKVxuICAgICAgICAuam9pbihBcFRvYXN0Lml0ZW1Kb2luZXIpXG4gICAgfSlcbiAgICBpZiAocHJvcHMub25EaXNtaXNzKSB7XG4gICAgICBwcm9wcy5vbkRpc21pc3MoeyBkaXNtaXNzZWQ6IG1lc3NhZ2UsIG5hbWU6IHByb3BzLm5hbWUgfSlcbiAgICB9XG4gIH0sXG5cbiAgaGFuZGxlVG9hc3RJdGVtVGFwIChlKSB7XG4gICAgY29uc3QgcyA9IHRoaXNcbiAgICBsZXQgdGV4dCA9IGUudGFyZ2V0LmRhdGFzZXRbICd0ZXh0JyBdXG4gICAgcy5kaXNtaXNzVG9hc3RJdGVtKHRleHQpXG4gIH0sXG5cbiAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tXG4gIC8vIFByaXZhdGVcbiAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tXG4gIF90aWNraW5nOiBmYWxzZSxcbiAgX3RpY2tUaW1lcjogbnVsbCxcbiAgX3JlbmRlclRvYXN0SXRlbSAoKSB7XG4gICAgY29uc3QgcyA9IHRoaXNcbiAgICBsZXQgeyBzdGF0ZSwgcHJvcHMgfSA9IHNcbiAgICByZXR1cm4gKHN0YXRlLml0ZW1zIHx8ICcnKS5zcGxpdChBcFRvYXN0Lml0ZW1Kb2luZXIpXG4gICAgICAuZmlsdGVyKGFycmF5ZmlsdGVyLmVtcHR5UmVqZWN0KCkpXG4gICAgICAubWFwKCh0ZXh0LCBpKSA9PiAoXG4gICAgICAgICAgPEFwVG9hc3RJdGVtIGtleT17YHRvYXN0LSR7dGV4dH0tJHtpfWB9XG4gICAgICAgICAgICAgICAgICAgICAgIHRleHQ9e3RleHR9XG4gICAgICAgICAgICAgICAgICAgICAgIGljb249e3Byb3BzLmljb259XG4gICAgICAgICAgICAgICAgICAgICAgIG9uVGFwPXtzLmhhbmRsZVRvYXN0SXRlbVRhcH1cbiAgICAgICAgICA+XG4gICAgICAgICAgPC9BcFRvYXN0SXRlbT5cbiAgICAgICAgKVxuICAgICAgKVxuICB9XG59KVxuXG5leHBvcnQgZGVmYXVsdCBBcFRvYXN0XG4iXX0=
\No newline at end of file