accounts-frontend/src/components/ui/popup/PopupStack.js

104 lines
2.7 KiB
JavaScript
Raw Normal View History

import PropTypes from 'prop-types';
import React, { Component } from 'react';
import { CSSTransitionGroup } from 'react-transition-group';
import { browserHistory } from 'services/history';
2016-06-04 01:08:59 +05:30
import styles from './popup.scss';
export class PopupStack extends Component {
static displayName = 'PopupStack';
static propTypes = {
popups: PropTypes.arrayOf(PropTypes.shape({
2016-05-11 10:56:44 +05:30
type: PropTypes.func,
props: PropTypes.oneOfType([PropTypes.object, PropTypes.func])
})),
destroy: PropTypes.func.isRequired
};
2016-07-26 10:50:37 +05:30
componentWillMount() {
document.addEventListener('keyup', this.onKeyPress);
this.unlistenTransition = browserHistory.listen(this.onRouteLeave);
2016-07-26 10:50:37 +05:30
}
componentWillUnmount() {
document.removeEventListener('keyup', this.onKeyPress);
this.unlistenTransition();
2016-07-26 10:50:37 +05:30
}
render() {
2016-05-11 10:56:44 +05:30
const {popups} = this.props;
return (
<CSSTransitionGroup
2016-06-04 01:08:59 +05:30
transitionName={{
enter: styles.trEnter,
2016-06-04 11:31:10 +05:30
enterActive: styles.trEnterActive,
leave: styles.trLeave,
leaveActive: styles.trLeaveActive
2016-06-04 01:08:59 +05:30
}}
transitionEnterTimeout={500}
transitionLeaveTimeout={500}
>
{popups.map((popup, index) => {
2016-07-26 10:10:45 +05:30
const {Popup} = popup;
return (
2016-07-26 10:10:45 +05:30
<div className={styles.overlay} key={index}
onClick={this.onOverlayClick(popup)}
>
<Popup onClose={this.onClose(popup)} />
</div>
);
})}
</CSSTransitionGroup>
);
}
onClose(popup) {
return this.props.destroy.bind(null, popup);
}
2016-07-26 10:10:45 +05:30
onOverlayClick(popup) {
return (event) => {
2016-07-26 10:10:45 +05:30
if (event.target !== event.currentTarget || popup.disableOverlayClose) {
return;
}
event.preventDefault();
this.props.destroy(popup);
};
}
2016-07-26 10:50:37 +05:30
popStack() {
const popup = this.props.popups.slice(-1)[0];
if (popup && !popup.disableOverlayClose) {
this.props.destroy(popup);
}
}
2016-07-26 10:50:37 +05:30
onKeyPress = (event) => {
if (event.which === 27) { // ESC key
this.popStack();
}
};
2016-07-26 10:50:37 +05:30
onRouteLeave = (nextLocation) => {
if (nextLocation) {
this.popStack();
2016-07-26 10:50:37 +05:30
}
};
}
import { connect } from 'react-redux';
import { destroy } from 'components/ui/popup/actions';
export default connect((state) => ({
...state.popup
}), {
destroy
})(PopupStack);