UNPKG

apeman-react-touchable

Version:
78 lines (63 loc) 5.9 kB
/** * Higher order component with outside touch * @function withOutside * @param {function} Component - A component constructor * @returns {function} - Wrapped component */ 'use strict'; Object.defineProperty(exports, "__esModule", { value: true }); var _breact = require('breact'); var _react = require('react'); var _react2 = _interopRequireDefault(_react); var _reactDom = require('react-dom'); var _reactDom2 = _interopRequireDefault(_reactDom); var _bwindow = require('bwindow'); var _new_hammer = require('./helpers/new_hammer'); var _new_hammer2 = _interopRequireDefault(_new_hammer); function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } /** @lends withOutside */ function withOutside(Component, handleOutSide) { return (0, _breact.wrap)(Component, { propTypes: { onOutside: _react.PropTypes.func }, componentDidMount: function componentDidMount() { var s = this; var body = (0, _bwindow.get)('document.body'); var hammer = (0, _new_hammer2.default)(body); hammer.on('tap', s.handleTapForOutside); s.hammer = hammer; }, componentWillUnmount: function componentWillUnmount() { var s = this; var hammer = s.hammer; hammer.off('tap', s.handleTapForOutside); hammer.destroy(); hammer.stop(); hammer.destroy(); }, handleTapForOutside: function handleTapForOutside(e) { var s = this; var props = s.props; var _props$onOutside = props.onOutside; var onOutside = _props$onOutside === undefined ? function () { return undefined; } : _props$onOutside; var node = _reactDom2.default.findDOMNode(s); if (!node) { return; } var contained = node.contains(e.target); if (!contained) { onOutside(e); if (handleOutSide) { handleOutSide(e, { element: s }); } } } }); } exports.default = withOutside; //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIndpdGhfb3V0c2lkZS5qc3giXSwibmFtZXMiOlsid2l0aE91dHNpZGUiLCJDb21wb25lbnQiLCJoYW5kbGVPdXRTaWRlIiwicHJvcFR5cGVzIiwib25PdXRzaWRlIiwiZnVuYyIsImNvbXBvbmVudERpZE1vdW50IiwicyIsImJvZHkiLCJoYW1tZXIiLCJvbiIsImhhbmRsZVRhcEZvck91dHNpZGUiLCJjb21wb25lbnRXaWxsVW5tb3VudCIsIm9mZiIsImRlc3Ryb3kiLCJzdG9wIiwiZSIsInByb3BzIiwidW5kZWZpbmVkIiwibm9kZSIsImZpbmRET01Ob2RlIiwiY29udGFpbmVkIiwiY29udGFpbnMiLCJ0YXJnZXQiLCJlbGVtZW50Il0sIm1hcHBpbmdzIjoiQUFBQTs7Ozs7O0FBTUE7Ozs7OztBQUVBOztBQUNBOzs7O0FBQ0E7Ozs7QUFDQTs7QUFDQTs7Ozs7O0FBRUE7QUFDQSxTQUFTQSxXQUFULENBQXNCQyxTQUF0QixFQUFpQ0MsYUFBakMsRUFBZ0Q7QUFDOUMsU0FBTyxrQkFBS0QsU0FBTCxFQUFnQjtBQUNyQkUsZUFBVztBQUNUQyxpQkFBVyxpQkFBTUM7QUFEUixLQURVOztBQUtyQkMscUJBTHFCLCtCQUtBO0FBQ25CLFVBQU1DLElBQUksSUFBVjtBQUNBLFVBQUlDLE9BQU8sa0JBQUksZUFBSixDQUFYO0FBQ0EsVUFBSUMsU0FBUywwQkFBVUQsSUFBVixDQUFiO0FBQ0FDLGFBQU9DLEVBQVAsQ0FBVSxLQUFWLEVBQWlCSCxFQUFFSSxtQkFBbkI7QUFDQUosUUFBRUUsTUFBRixHQUFXQSxNQUFYO0FBQ0QsS0FYb0I7QUFZckJHLHdCQVpxQixrQ0FZRztBQUN0QixVQUFNTCxJQUFJLElBQVY7QUFEc0IsVUFFaEJFLE1BRmdCLEdBRUxGLENBRkssQ0FFaEJFLE1BRmdCOztBQUd0QkEsYUFBT0ksR0FBUCxDQUFXLEtBQVgsRUFBa0JOLEVBQUVJLG1CQUFwQjtBQUNBRixhQUFPSyxPQUFQO0FBQ0FMLGFBQU9NLElBQVA7QUFDQU4sYUFBT0ssT0FBUDtBQUNELEtBbkJvQjtBQXFCckJILHVCQXJCcUIsK0JBcUJBSyxDQXJCQSxFQXFCRztBQUN0QixVQUFNVCxJQUFJLElBQVY7QUFEc0IsVUFFaEJVLEtBRmdCLEdBRU5WLENBRk0sQ0FFaEJVLEtBRmdCO0FBQUEsNkJBS2xCQSxLQUxrQixDQUlwQmIsU0FKb0I7QUFBQSxVQUlwQkEsU0FKb0Isb0NBSVI7QUFBQSxlQUFNYyxTQUFOO0FBQUEsT0FKUTs7QUFNdEIsVUFBSUMsT0FBTyxtQkFBU0MsV0FBVCxDQUFxQmIsQ0FBckIsQ0FBWDtBQUNBLFVBQUksQ0FBQ1ksSUFBTCxFQUFXO0FBQ1Q7QUFDRDtBQUNELFVBQUlFLFlBQVlGLEtBQUtHLFFBQUwsQ0FBY04sRUFBRU8sTUFBaEIsQ0FBaEI7QUFDQSxVQUFJLENBQUNGLFNBQUwsRUFBZ0I7QUFDZGpCLGtCQUFVWSxDQUFWO0FBQ0EsWUFBSWQsYUFBSixFQUFtQjtBQUNqQkEsd0JBQWNjLENBQWQsRUFBaUIsRUFBRVEsU0FBU2pCLENBQVgsRUFBakI7QUFDRDtBQUNGO0FBQ0Y7QUF0Q29CLEdBQWhCLENBQVA7QUF3Q0Q7O2tCQUVjUCxXIiwiZmlsZSI6IndpdGhfb3V0c2lkZS5qc3giLCJzb3VyY2VSb290IjoibGliIiwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBIaWdoZXIgb3JkZXIgY29tcG9uZW50IHdpdGggb3V0c2lkZSB0b3VjaFxuICogQGZ1bmN0aW9uIHdpdGhPdXRzaWRlXG4gKiBAcGFyYW0ge2Z1bmN0aW9ufSBDb21wb25lbnQgLSBBIGNvbXBvbmVudCBjb25zdHJ1Y3RvclxuICogQHJldHVybnMge2Z1bmN0aW9ufSAtIFdyYXBwZWQgY29tcG9uZW50XG4gKi9cbid1c2Ugc3RyaWN0J1xuXG5pbXBvcnQgeyB3cmFwIH0gZnJvbSAnYnJlYWN0J1xuaW1wb3J0IFJlYWN0LCB7IFByb3BUeXBlcyBhcyB0eXBlcyB9IGZyb20gJ3JlYWN0J1xuaW1wb3J0IFJlYWN0RE9NIGZyb20gJ3JlYWN0LWRvbSdcbmltcG9ydCB7IGdldCB9IGZyb20gJ2J3aW5kb3cnXG5pbXBvcnQgbmV3SGFtbWVyIGZyb20gJy4vaGVscGVycy9uZXdfaGFtbWVyJ1xuXG4vKiogQGxlbmRzIHdpdGhPdXRzaWRlICovXG5mdW5jdGlvbiB3aXRoT3V0c2lkZSAoQ29tcG9uZW50LCBoYW5kbGVPdXRTaWRlKSB7XG4gIHJldHVybiB3cmFwKENvbXBvbmVudCwge1xuICAgIHByb3BUeXBlczoge1xuICAgICAgb25PdXRzaWRlOiB0eXBlcy5mdW5jXG4gICAgfSxcblxuICAgIGNvbXBvbmVudERpZE1vdW50ICgpIHtcbiAgICAgIGNvbnN0IHMgPSB0aGlzXG4gICAgICBsZXQgYm9keSA9IGdldCgnZG9jdW1lbnQuYm9keScpXG4gICAgICBsZXQgaGFtbWVyID0gbmV3SGFtbWVyKGJvZHkpXG4gICAgICBoYW1tZXIub24oJ3RhcCcsIHMuaGFuZGxlVGFwRm9yT3V0c2lkZSlcbiAgICAgIHMuaGFtbWVyID0gaGFtbWVyXG4gICAgfSxcbiAgICBjb21wb25lbnRXaWxsVW5tb3VudCAoKSB7XG4gICAgICBjb25zdCBzID0gdGhpc1xuICAgICAgbGV0IHsgaGFtbWVyIH0gPSBzXG4gICAgICBoYW1tZXIub2ZmKCd0YXAnLCBzLmhhbmRsZVRhcEZvck91dHNpZGUpXG4gICAgICBoYW1tZXIuZGVzdHJveSgpXG4gICAgICBoYW1tZXIuc3RvcCgpXG4gICAgICBoYW1tZXIuZGVzdHJveSgpXG4gICAgfSxcblxuICAgIGhhbmRsZVRhcEZvck91dHNpZGUgKGUpIHtcbiAgICAgIGNvbnN0IHMgPSB0aGlzXG4gICAgICBsZXQgeyBwcm9wcyB9ID0gc1xuICAgICAgbGV0IHtcbiAgICAgICAgb25PdXRzaWRlID0gKCkgPT4gdW5kZWZpbmVkXG4gICAgICB9ID0gcHJvcHNcbiAgICAgIGxldCBub2RlID0gUmVhY3RET00uZmluZERPTU5vZGUocylcbiAgICAgIGlmICghbm9kZSkge1xuICAgICAgICByZXR1cm5cbiAgICAgIH1cbiAgICAgIGxldCBjb250YWluZWQgPSBub2RlLmNvbnRhaW5zKGUudGFyZ2V0KVxuICAgICAgaWYgKCFjb250YWluZWQpIHtcbiAgICAgICAgb25PdXRzaWRlKGUpXG4gICAgICAgIGlmIChoYW5kbGVPdXRTaWRlKSB7XG4gICAgICAgICAgaGFuZGxlT3V0U2lkZShlLCB7IGVsZW1lbnQ6IHMgfSlcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgfSlcbn1cblxuZXhwb3J0IGRlZmF1bHQgd2l0aE91dHNpZGVcbiJdfQ==