react-skylight
Version:
A react component for modals and dialogs.
78 lines (62 loc) • 1.78 kB
JSX
import React from 'react';
import PropTypes from 'prop-types';
import SkylightStateless from './skylightstateless';
const isOpening = (s1, s2) => !s1.isVisible && s2.isVisible;
const isClosing = (s1, s2) => s1.isVisible && !s2.isVisible;
export default class SkyLight extends React.Component {
constructor(props) {
super(props);
this.state = { isVisible: false };
}
componentWillUpdate(nextProps, nextState) {
if (isOpening(this.state, nextState) && this.props.beforeOpen) {
this.props.beforeOpen();
}
if (isClosing(this.state, nextState) && this.props.beforeClose) {
this.props.beforeClose();
}
}
componentDidUpdate(prevProps, prevState) {
if (isOpening(prevState, this.state) && this.props.afterOpen) {
this.props.afterOpen();
}
if (isClosing(prevState, this.state) && this.props.afterClose) {
this.props.afterClose();
}
}
show() {
this.setState({ isVisible: true });
}
hide() {
this.setState({ isVisible: false });
}
_onOverlayClicked() {
if (this.props.hideOnOverlayClicked) {
this.hide();
}
if (this.props.onOverlayClicked) {
this.props.onOverlayClicked();
}
}
render() {
return (<SkylightStateless
{...this.props}
isVisible={this.state.isVisible}
onOverlayClicked={() => this._onOverlayClicked()}
onCloseClicked={() => this.hide()}
/>);
}
}
SkyLight.displayName = 'SkyLight';
SkyLight.propTypes = {
...SkylightStateless.sharedPropTypes,
afterClose: PropTypes.func,
afterOpen: PropTypes.func,
beforeClose: PropTypes.func,
beforeOpen: PropTypes.func,
hideOnOverlayClicked: PropTypes.bool,
};
SkyLight.defaultProps = {
...SkylightStateless.defaultProps,
hideOnOverlayClicked: false,
};