react-dates-rtl
Version:
Based on react-dates by airbnb [with RTL support]
56 lines (46 loc) • 1.43 kB
JSX
import React from 'react';
import PropTypes from 'prop-types';
// import { forbidExtraProps } from 'airbnb-prop-types'; // TODO: add to propTypes; semver-major
import { addEventListener, removeEventListener } from 'consolidated-events';
const propTypes = {
children: PropTypes.node,
onOutsideClick: PropTypes.func,
};
const defaultProps = {
children: <span />,
onOutsideClick() {},
};
export default class OutsideClickHandler extends React.Component {
constructor(props) {
super(props);
this.onOutsideClick = this.onOutsideClick.bind(this);
}
componentDidMount() {
// `capture` flag is set to true so that a `stopPropagation` in the children
// will not prevent all outside click handlers from firing - maja
this.clickHandle = addEventListener(
document,
'click',
this.onOutsideClick,
{ capture: true },
);
}
componentWillUnmount() {
if (this.clickHandle) removeEventListener(this.clickHandle);
}
onOutsideClick(e) {
const isDescendantOfRoot = this.childNode.contains(e.target);
if (!isDescendantOfRoot) {
this.props.onOutsideClick(e);
}
}
render() {
return (
<div ref={(ref) => { this.childNode = ref; }}>
{this.props.children}
</div>
);
}
}
OutsideClickHandler.propTypes = propTypes;
OutsideClickHandler.defaultProps = defaultProps;