import React from 'react'; import Component from '../component'; export default class Notification extends Component { constructor () { super(); this.state = { dismissing: false }; this.dismiss = this.dismiss.bind(this); this.onElement = this.onElement.bind(this); } componentDidMount () { if (this.props.dismissAfter) { this.setDismissTimer(); } } componentWillReceiveProps (next) { // if we have a timer going and the notification text // changed we rest the timer if (next.text !== this.props.text) { if (this.props.dismissAfter) { this.resetDismissTimer(); } if (this.state.dismissing) { this.setState({ dismissing: false }); } } } dismiss () { this.setState({ dismissing: true }); } onElement (el) { if (el) { el.addEventListener('webkitTransitionEnd', () => { if (this.state.dismissing) { this.props.onDismiss(); } }); // aprhodie !important override :( const { backgroundColor } = this.props; if (backgroundColor) { el.style.setProperty( 'background-color', backgroundColor, 'important' ); } } } setDismissTimer (after) { this.dismissTimer = setTimeout(() => { this.dismiss(); }, this.props.dismissAfter); } resetDismissTimer (after) { clearTimeout(this.dismissTimer); this.setDismissTimer(); } componentWillUnmount () { clearTimeout(this.dismissTimer); } template (css) { const { backgroundColor } = this.props; const opacity = this.state.dismissing ? 0 : 1; return
{ this.props.customChildrenBefore } { this.props.children || this.props.text } { this.props.userDismissable ? [x] : null } { this.props.customChildren }
; } styles () { return { indicator: { display: 'inline-block', cursor: 'default', WebkitUserSelect: 'none', background: 'rgba(255, 255, 255, .2)', padding: '8px 14px 9px', marginLeft: '10px', transition: '150ms opacity ease', color: '#fff', fontSize: '11px', fontFamily: `-apple-system, BlinkMacSystemFont, "Segoe UI", "Roboto", "Oxygen", "Ubuntu", "Cantarell", "Fira Sans", "Droid Sans", "Helvetica Neue", sans-serif` }, dismissLink: { position: 'relative', left: '4px', cursor: 'pointer', color: '#528D11', ':hover': { color: '#2A5100' } } }; } }