apeman-react-mixins
Version:
React mixin set of apeman.
141 lines (112 loc) • 8.71 kB
JavaScript
/**
* Mixin to detect outside tap.
* @mixin ApOutsideMixin
*/
;
Object.defineProperty(exports, "__esModule", {
value: true
});
var _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }();
var _react = require('react');
var _react2 = _interopRequireDefault(_react);
var _reactDom = require('react-dom');
var _reactDom2 = _interopRequireDefault(_reactDom);
var _defaults = require('defaults');
var _defaults2 = _interopRequireDefault(_defaults);
function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } }
var BodyTapRecognizer = function () {
function BodyTapRecognizer() {
_classCallCheck(this, BodyTapRecognizer);
var s = this;
s._hammer = null;
}
_createClass(BodyTapRecognizer, [{
key: 'getDOMNode',
value: function getDOMNode() {
var s = this;
return document.body;
}
}, {
key: 'getHammer',
value: function getHammer() {
var s = this;
var _hammer = s._hammer;
if (_hammer) {
return _hammer;
}
var Hammer = require('hammerjs');
s._hammer = new Hammer(s.getDOMNode());
return s.getHammer();
}
}, {
key: 'addOutsideListener',
value: function addOutsideListener(listener) {
var s = this,
hammer = s.getHammer();
hammer.on('tap', listener);
}
}, {
key: 'removeOutsideListener',
value: function removeOutsideListener(listener) {
var s = this,
hammer = s.getHammer();
hammer.off('tap', listener);
}
}]);
return BodyTapRecognizer;
}();
Object.assign(BodyTapRecognizer, {
singleton: new BodyTapRecognizer()
});
/** @lends ApOutsideMixin */
var ApOutsideMixin = {
// --------------------
// Custom
// --------------------
$apOutsideMixed: true,
statics: {},
handleTapForOutside: function handleTapForOutside(e) {
var s = this;
var props = s.props;
var node = _reactDom2.default.findDOMNode(s);
if (!node) {
return;
}
var contained = node.contains(e.target);
if (!contained) {
s.outsideDidTap(e);
if (props.onOutside) {
props.onOutside(e);
}
}
},
// --------------------
// Specs
// --------------------
propTypes: {
onOutside: _react.PropTypes.func
},
// --------------------
// Lifecycle
// --------------------
componentWillMount: function componentWillMount() {
var s = this;
var noop = function noop() {
return undefined;
};
(0, _defaults2.default)(s, {
outsideDidTap: noop
});
},
componentDidMount: function componentDidMount() {
var s = this;
BodyTapRecognizer.singleton.addOutsideListener(s.handleTapForOutside);
},
componentWillUnmount: function componentWillUnmount() {
var s = this;
BodyTapRecognizer.singleton.removeOutsideListener(s.handleTapForOutside);
}
};
exports.default = Object.freeze(ApOutsideMixin);
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbImFwX291dHNpZGVfbWl4aW4uanN4Il0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7Ozs7O0FBS0E7Ozs7Ozs7O0FBRUE7Ozs7QUFDQTs7OztBQUNBOzs7Ozs7OztJQUVNLGlCO0FBQ0osK0JBQWU7QUFBQTs7QUFDYixRQUFNLElBQUksSUFBVjs7QUFFQSxNQUFFLE9BQUYsR0FBWSxJQUFaO0FBQ0Q7Ozs7aUNBRWE7QUFDWixVQUFNLElBQUksSUFBVjtBQUNBLGFBQU8sU0FBUyxJQUFoQjtBQUNEOzs7Z0NBRVk7QUFDWCxVQUFNLElBQUksSUFBVjtBQURXLFVBRUwsT0FGSyxHQUVPLENBRlAsQ0FFTCxPQUZLOztBQUdYLFVBQUksT0FBSixFQUFhO0FBQ1gsZUFBTyxPQUFQO0FBQ0Q7QUFDRCxVQUFNLFNBQVMsUUFBUSxVQUFSLENBQWY7QUFDQSxRQUFFLE9BQUYsR0FBWSxJQUFJLE1BQUosQ0FBVyxFQUFFLFVBQUYsRUFBWCxDQUFaO0FBQ0EsYUFBTyxFQUFFLFNBQUYsRUFBUDtBQUNEOzs7dUNBRW1CLFEsRUFBVTtBQUM1QixVQUFNLElBQUksSUFBVjtVQUNFLFNBQVMsRUFBRSxTQUFGLEVBRFg7QUFFQSxhQUFPLEVBQVAsQ0FBVSxLQUFWLEVBQWlCLFFBQWpCO0FBQ0Q7OzswQ0FFc0IsUSxFQUFVO0FBQy9CLFVBQU0sSUFBSSxJQUFWO1VBQ0UsU0FBUyxFQUFFLFNBQUYsRUFEWDtBQUVBLGFBQU8sR0FBUCxDQUFXLEtBQVgsRUFBa0IsUUFBbEI7QUFDRDs7Ozs7O0FBR0gsT0FBTyxNQUFQLENBQWMsaUJBQWQsRUFBaUM7QUFDL0IsYUFBVyxJQUFJLGlCQUFKO0FBRG9CLENBQWpDOzs7QUFLQSxJQUFJLGlCQUFpQjs7Ozs7QUFLbkIsbUJBQWlCLElBTEU7O0FBT25CLFdBQVMsRUFQVTs7QUFTbkIscUJBVG1CLCtCQVNDLENBVEQsRUFTSTtBQUNmLFlBQUksSUFBSjtBQUNKLFFBQUUsS0FBRixHQUFZLENBQVosQ0FBRSxLQUFGO0FBQ0EsZUFBTyxtQkFBUyxXQUFULENBQXFCLENBQXJCLENBQVA7QUFDRixRQUFJLENBQUMsSUFBTCxFQUFXO0FBQ1Q7QUFDRDtBQUNELFFBQUksWUFBWSxLQUFLLFFBQUwsQ0FBYyxFQUFFLE1BQWhCLENBQWhCO0FBQ0EsUUFBSSxDQUFDLFNBQUwsRUFBZ0I7QUFDZCxRQUFFLGFBQUYsQ0FBZ0IsQ0FBaEI7QUFDQSxVQUFJLE1BQU0sU0FBVixFQUFxQjtBQUNuQixjQUFNLFNBQU4sQ0FBZ0IsQ0FBaEI7QUFDRDtBQUNGO0FBQ0YsR0F2QmtCOzs7Ozs7O0FBNkJuQixhQUFXO0FBQ1QsZUFBVyxpQkFBTTtBQURSLEdBN0JROzs7Ozs7QUFxQ25CLG9CQXJDbUIsZ0NBcUNHO0FBQ3BCLFFBQU0sSUFBSSxJQUFWOztBQUVBLFFBQUksT0FBTyxTQUFQLElBQU87QUFBQSxhQUFNLFNBQU47QUFBQSxLQUFYO0FBQ0EsNEJBQVMsQ0FBVCxFQUFZO0FBQ1YscUJBQWU7QUFETCxLQUFaO0FBR0QsR0E1Q2tCO0FBOENuQixtQkE5Q21CLCtCQThDRTtBQUNuQixRQUFNLElBQUksSUFBVjtBQUNBLHNCQUFrQixTQUFsQixDQUE0QixrQkFBNUIsQ0FBK0MsRUFBRSxtQkFBakQ7QUFDRCxHQWpEa0I7QUFtRG5CLHNCQW5EbUIsa0NBbURLO0FBQ3RCLFFBQU0sSUFBSSxJQUFWO0FBQ0Esc0JBQWtCLFNBQWxCLENBQTRCLHFCQUE1QixDQUFrRCxFQUFFLG1CQUFwRDtBQUNEO0FBdERrQixDQUFyQjs7a0JBMERlLE9BQU8sTUFBUCxDQUFjLGNBQWQsQyIsImZpbGUiOiJhcF9vdXRzaWRlX21peGluLmpzIiwic291cmNlUm9vdCI6Ii9Vc2Vycy9va3VuaXNoaW5pc2hpL1Byb2plY3RzL2FwZW1hbi1wcm9qZWN0cy9hcGVtYW4tcmVhY3QtbWl4aW5zL2xpYiIsInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogTWl4aW4gdG8gZGV0ZWN0IG91dHNpZGUgdGFwLlxuICogQG1peGluIEFwT3V0c2lkZU1peGluXG4gKi9cblxuJ3VzZSBzdHJpY3QnXG5cbmltcG9ydCBSZWFjdCwge1Byb3BUeXBlcyBhcyB0eXBlc30gZnJvbSAncmVhY3QnXG5pbXBvcnQgUmVhY3RET00gZnJvbSAncmVhY3QtZG9tJ1xuaW1wb3J0IGRlZmF1bHRzIGZyb20gJ2RlZmF1bHRzJ1xuXG5jbGFzcyBCb2R5VGFwUmVjb2duaXplciB7XG4gIGNvbnN0cnVjdG9yICgpIHtcbiAgICBjb25zdCBzID0gdGhpc1xuXG4gICAgcy5faGFtbWVyID0gbnVsbFxuICB9XG5cbiAgZ2V0RE9NTm9kZSAoKSB7XG4gICAgY29uc3QgcyA9IHRoaXNcbiAgICByZXR1cm4gZG9jdW1lbnQuYm9keVxuICB9XG5cbiAgZ2V0SGFtbWVyICgpIHtcbiAgICBjb25zdCBzID0gdGhpc1xuICAgIGxldCB7IF9oYW1tZXIgfSA9IHNcbiAgICBpZiAoX2hhbW1lcikge1xuICAgICAgcmV0dXJuIF9oYW1tZXJcbiAgICB9XG4gICAgY29uc3QgSGFtbWVyID0gcmVxdWlyZSgnaGFtbWVyanMnKVxuICAgIHMuX2hhbW1lciA9IG5ldyBIYW1tZXIocy5nZXRET01Ob2RlKCkpXG4gICAgcmV0dXJuIHMuZ2V0SGFtbWVyKClcbiAgfVxuXG4gIGFkZE91dHNpZGVMaXN0ZW5lciAobGlzdGVuZXIpIHtcbiAgICBjb25zdCBzID0gdGhpcyxcbiAgICAgIGhhbW1lciA9IHMuZ2V0SGFtbWVyKClcbiAgICBoYW1tZXIub24oJ3RhcCcsIGxpc3RlbmVyKVxuICB9XG5cbiAgcmVtb3ZlT3V0c2lkZUxpc3RlbmVyIChsaXN0ZW5lcikge1xuICAgIGNvbnN0IHMgPSB0aGlzLFxuICAgICAgaGFtbWVyID0gcy5nZXRIYW1tZXIoKVxuICAgIGhhbW1lci5vZmYoJ3RhcCcsIGxpc3RlbmVyKVxuICB9XG59XG5cbk9iamVjdC5hc3NpZ24oQm9keVRhcFJlY29nbml6ZXIsIHtcbiAgc2luZ2xldG9uOiBuZXcgQm9keVRhcFJlY29nbml6ZXIoKVxufSlcblxuLyoqIEBsZW5kcyBBcE91dHNpZGVNaXhpbiAqL1xubGV0IEFwT3V0c2lkZU1peGluID0ge1xuXG4gIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tXG4gIC8vIEN1c3RvbVxuICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLVxuICAkYXBPdXRzaWRlTWl4ZWQ6IHRydWUsXG5cbiAgc3RhdGljczoge30sXG5cbiAgaGFuZGxlVGFwRm9yT3V0c2lkZShlKSB7XG4gICAgY29uc3QgcyA9IHRoaXMsXG4gICAgICB7IHByb3BzIH0gPSBzLFxuICAgICAgbm9kZSA9IFJlYWN0RE9NLmZpbmRET01Ob2RlKHMpXG4gICAgaWYgKCFub2RlKSB7XG4gICAgICByZXR1cm5cbiAgICB9XG4gICAgbGV0IGNvbnRhaW5lZCA9IG5vZGUuY29udGFpbnMoZS50YXJnZXQpXG4gICAgaWYgKCFjb250YWluZWQpIHtcbiAgICAgIHMub3V0c2lkZURpZFRhcChlKVxuICAgICAgaWYgKHByb3BzLm9uT3V0c2lkZSkge1xuICAgICAgICBwcm9wcy5vbk91dHNpZGUoZSlcbiAgICAgIH1cbiAgICB9XG4gIH0sXG5cbiAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS1cbiAgLy8gU3BlY3NcbiAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS1cblxuICBwcm9wVHlwZXM6IHtcbiAgICBvbk91dHNpZGU6IHR5cGVzLmZ1bmNcbiAgfSxcblxuICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLVxuICAvLyBMaWZlY3ljbGVcbiAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS1cblxuICBjb21wb25lbnRXaWxsTW91bnQgKCkge1xuICAgIGNvbnN0IHMgPSB0aGlzXG5cbiAgICBsZXQgbm9vcCA9ICgpID0+IHVuZGVmaW5lZFxuICAgIGRlZmF1bHRzKHMsIHtcbiAgICAgIG91dHNpZGVEaWRUYXA6IG5vb3BcbiAgICB9KVxuICB9LFxuXG4gIGNvbXBvbmVudERpZE1vdW50ICgpIHtcbiAgICBjb25zdCBzID0gdGhpc1xuICAgIEJvZHlUYXBSZWNvZ25pemVyLnNpbmdsZXRvbi5hZGRPdXRzaWRlTGlzdGVuZXIocy5oYW5kbGVUYXBGb3JPdXRzaWRlKVxuICB9LFxuXG4gIGNvbXBvbmVudFdpbGxVbm1vdW50ICgpIHtcbiAgICBjb25zdCBzID0gdGhpc1xuICAgIEJvZHlUYXBSZWNvZ25pemVyLnNpbmdsZXRvbi5yZW1vdmVPdXRzaWRlTGlzdGVuZXIocy5oYW5kbGVUYXBGb3JPdXRzaWRlKVxuICB9XG5cbn1cblxuZXhwb3J0IGRlZmF1bHQgT2JqZWN0LmZyZWV6ZShBcE91dHNpZGVNaXhpbilcbiJdfQ==