UNPKG

3.9 kBJavaScriptView Raw
1'use strict';
2
3Object.defineProperty(exports, "__esModule", {
4 value: true
5});
6
7var _getPrototypeOf = require('babel-runtime/core-js/object/get-prototype-of');
8
9var _getPrototypeOf2 = _interopRequireDefault(_getPrototypeOf);
10
11var _classCallCheck2 = require('babel-runtime/helpers/classCallCheck');
12
13var _classCallCheck3 = _interopRequireDefault(_classCallCheck2);
14
15var _createClass2 = require('babel-runtime/helpers/createClass');
16
17var _createClass3 = _interopRequireDefault(_createClass2);
18
19var _possibleConstructorReturn2 = require('babel-runtime/helpers/possibleConstructorReturn');
20
21var _possibleConstructorReturn3 = _interopRequireDefault(_possibleConstructorReturn2);
22
23var _inherits2 = require('babel-runtime/helpers/inherits');
24
25var _inherits3 = _interopRequireDefault(_inherits2);
26
27var _react = require('react');
28
29var _propTypes = require('prop-types');
30
31var _propTypes2 = _interopRequireDefault(_propTypes);
32
33var _reactDom = require('react-dom');
34
35var _reactDom2 = _interopRequireDefault(_reactDom);
36
37var _events = require('../utils/events');
38
39var _events2 = _interopRequireDefault(_events);
40
41function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
42
43var isDescendant = function isDescendant(el, target) {
44 if (target !== null) {
45 return el === target || isDescendant(el, target.parentNode);
46 }
47 return false;
48};
49
50var clickAwayEvents = ['mouseup', 'touchend'];
51var bind = function bind(callback) {
52 return clickAwayEvents.forEach(function (event) {
53 return _events2.default.on(document, event, callback);
54 });
55};
56var unbind = function unbind(callback) {
57 return clickAwayEvents.forEach(function (event) {
58 return _events2.default.off(document, event, callback);
59 });
60};
61
62var ClickAwayListener = function (_Component) {
63 (0, _inherits3.default)(ClickAwayListener, _Component);
64
65 function ClickAwayListener() {
66 var _ref;
67
68 var _temp, _this, _ret;
69
70 (0, _classCallCheck3.default)(this, ClickAwayListener);
71
72 for (var _len = arguments.length, args = Array(_len), _key = 0; _key < _len; _key++) {
73 args[_key] = arguments[_key];
74 }
75
76 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) {
77 if (event.defaultPrevented) {
78 return;
79 }
80
81 // IE11 support, which trigger the handleClickAway even after the unbind
82 if (_this.isCurrentlyMounted) {
83 var el = _reactDom2.default.findDOMNode(_this);
84
85 if (document.documentElement.contains(event.target) && !isDescendant(el, event.target)) {
86 _this.props.onClickAway(event);
87 }
88 }
89 }, _temp), (0, _possibleConstructorReturn3.default)(_this, _ret);
90 }
91
92 (0, _createClass3.default)(ClickAwayListener, [{
93 key: 'componentDidMount',
94 value: function componentDidMount() {
95 this.isCurrentlyMounted = true;
96 if (this.props.onClickAway) {
97 bind(this.handleClickAway);
98 }
99 }
100 }, {
101 key: 'componentDidUpdate',
102 value: function componentDidUpdate(prevProps) {
103 if (prevProps.onClickAway !== this.props.onClickAway) {
104 unbind(this.handleClickAway);
105 if (this.props.onClickAway) {
106 bind(this.handleClickAway);
107 }
108 }
109 }
110 }, {
111 key: 'componentWillUnmount',
112 value: function componentWillUnmount() {
113 this.isCurrentlyMounted = false;
114 unbind(this.handleClickAway);
115 }
116 }, {
117 key: 'render',
118 value: function render() {
119 return this.props.children;
120 }
121 }]);
122 return ClickAwayListener;
123}(_react.Component);
124
125ClickAwayListener.propTypes = process.env.NODE_ENV !== "production" ? {
126 children: _propTypes2.default.element,
127 onClickAway: _propTypes2.default.func
128} : {};
129exports.default = ClickAwayListener;
\No newline at end of file