material-ui
Version:
React Components that Implement Google's Material Design.
129 lines (98 loc) • 3.9 kB
JavaScript
Object.defineProperty(exports, "__esModule", {
value: true
});
var _getPrototypeOf = require('babel-runtime/core-js/object/get-prototype-of');
var _getPrototypeOf2 = _interopRequireDefault(_getPrototypeOf);
var _classCallCheck2 = require('babel-runtime/helpers/classCallCheck');
var _classCallCheck3 = _interopRequireDefault(_classCallCheck2);
var _createClass2 = require('babel-runtime/helpers/createClass');
var _createClass3 = _interopRequireDefault(_createClass2);
var _possibleConstructorReturn2 = require('babel-runtime/helpers/possibleConstructorReturn');
var _possibleConstructorReturn3 = _interopRequireDefault(_possibleConstructorReturn2);
var _inherits2 = require('babel-runtime/helpers/inherits');
var _inherits3 = _interopRequireDefault(_inherits2);
var _react = require('react');
var _propTypes = require('prop-types');
var _propTypes2 = _interopRequireDefault(_propTypes);
var _reactDom = require('react-dom');
var _reactDom2 = _interopRequireDefault(_reactDom);
var _events = require('../utils/events');
var _events2 = _interopRequireDefault(_events);
function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
var isDescendant = function isDescendant(el, target) {
if (target !== null) {
return el === target || isDescendant(el, target.parentNode);
}
return false;
};
var clickAwayEvents = ['mouseup', 'touchend'];
var bind = function bind(callback) {
return clickAwayEvents.forEach(function (event) {
return _events2.default.on(document, event, callback);
});
};
var unbind = function unbind(callback) {
return clickAwayEvents.forEach(function (event) {
return _events2.default.off(document, event, callback);
});
};
var ClickAwayListener = function (_Component) {
(0, _inherits3.default)(ClickAwayListener, _Component);
function ClickAwayListener() {
var _ref;
var _temp, _this, _ret;
(0, _classCallCheck3.default)(this, ClickAwayListener);
for (var _len = arguments.length, args = Array(_len), _key = 0; _key < _len; _key++) {
args[_key] = arguments[_key];
}
return _ret = (_temp = (_this = (0, _possibleConstructorReturn3.default)(this, (_ref = ClickAwayListener.__proto__ || (0, _getPrototypeOf2.default)(ClickAwayListener)).call.apply(_ref, [this].concat(args))), _this), _this.handleClickAway = function (event) {
if (event.defaultPrevented) {
return;
}
// IE11 support, which trigger the handleClickAway even after the unbind
if (_this.isCurrentlyMounted) {
var el = _reactDom2.default.findDOMNode(_this);
if (document.documentElement.contains(event.target) && !isDescendant(el, event.target)) {
_this.props.onClickAway(event);
}
}
}, _temp), (0, _possibleConstructorReturn3.default)(_this, _ret);
}
(0, _createClass3.default)(ClickAwayListener, [{
key: 'componentDidMount',
value: function componentDidMount() {
this.isCurrentlyMounted = true;
if (this.props.onClickAway) {
bind(this.handleClickAway);
}
}
}, {
key: 'componentDidUpdate',
value: function componentDidUpdate(prevProps) {
if (prevProps.onClickAway !== this.props.onClickAway) {
unbind(this.handleClickAway);
if (this.props.onClickAway) {
bind(this.handleClickAway);
}
}
}
}, {
key: 'componentWillUnmount',
value: function componentWillUnmount() {
this.isCurrentlyMounted = false;
unbind(this.handleClickAway);
}
}, {
key: 'render',
value: function render() {
return this.props.children;
}
}]);
return ClickAwayListener;
}(_react.Component);
ClickAwayListener.propTypes = process.env.NODE_ENV !== "production" ? {
children: _propTypes2.default.element,
onClickAway: _propTypes2.default.func
} : {};
exports.default = ClickAwayListener;
;