UNPKG

apeman-react-mixins

Version:
158 lines (139 loc) 13.3 kB
/** * Mixin to add touch handlers. * @mixin ApTouchMixin */ 'use strict'; Object.defineProperty(exports, "__esModule", { value: true }); var _ApTouchMixin; var _react = require('react'); var _react2 = _interopRequireDefault(_react); var _reactDom = require('react-dom'); var _reactDom2 = _interopRequireDefault(_reactDom); function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } function _defineProperty(obj, key, value) { if (key in obj) { Object.defineProperty(obj, key, { value: value, enumerable: true, configurable: true, writable: true }); } else { obj[key] = value; } return obj; } var TOUCH_HAMMER_KEY = '_apTouchHammer'; function createTouchHammer(node, props, getData) { if (!node) { return; } var Hammer = require('hammerjs'); var hammer = new Hammer(node); if (props.touchOptions) { hammer.set(props.touchOptions); } Object.keys(ApTouchMixin.propTypes).filter(function (key) { return !!props[key]; }).forEach(function (key) { if (/^on/.test(key)) { (function () { var event = key.replace(/^on/, '').toLowerCase(); var handler = props[key]; hammer.on(event, function (e) { e.data = getData(); // Set touching data. handler(e); }); })(); } if (/Direction$/.test(key)) { var gesture = key.replace(/Direction$/, ''); hammer.get(gesture).set({ direction: Hammer['DIRECTION_' + props[key]] }); } if (/Threshold$/.test(key)) { var threshold = key.replace(/Threshold$/, ''); hammer.get(threshold).set({ threshold: props[key] }); } }); return hammer; } function destroyTouchHammer(hammer) { if (!hammer) { return; } hammer.stop(); hammer.destroy(); } function supportsTouch(props) { var touchableKey = Object.keys(ApTouchMixin.propTypes); var _iteratorNormalCompletion = true; var _didIteratorError = false; var _iteratorError = undefined; try { for (var _iterator = Object.keys(props)[Symbol.iterator](), _step; !(_iteratorNormalCompletion = (_step = _iterator.next()).done); _iteratorNormalCompletion = true) { var key = _step.value; var hit = !! ~touchableKey.indexOf(key); if (hit) { return true; } } } catch (err) { _didIteratorError = true; _iteratorError = err; } finally { try { if (!_iteratorNormalCompletion && _iterator.return) { _iterator.return(); } } finally { if (_didIteratorError) { throw _iteratorError; } } } return false; } /** Enum for touching */ var touchEnums = { directions: ['NONE', 'LEFT', 'RIGHT', 'UP', 'DOWN', 'HORIZONTAL', 'VERTICAL', 'ALL'] }; /** @lends ApTouchMixin */ var ApTouchMixin = (_ApTouchMixin = {}, _defineProperty(_ApTouchMixin, TOUCH_HAMMER_KEY, null), _defineProperty(_ApTouchMixin, 'propTypes', { onTap: _react.PropTypes.func, onDoubleTap: _react.PropTypes.func, onPan: _react.PropTypes.func, onPanStart: _react.PropTypes.func, onPanMove: _react.PropTypes.func, onPanEnd: _react.PropTypes.func, onPanCancel: _react.PropTypes.func, onSwipe: _react.PropTypes.func, onPress: _react.PropTypes.func, onPressUp: _react.PropTypes.func, onPinch: _react.PropTypes.func, onPinchStart: _react.PropTypes.func, onPinchMove: _react.PropTypes.func, onPinchEnd: _react.PropTypes.func, onPinchCancel: _react.PropTypes.func, onRotate: _react.PropTypes.func, onRotateStart: _react.PropTypes.func, onRotateMove: _react.PropTypes.func, onRotateEnd: _react.PropTypes.func, onRotateCancel: _react.PropTypes.func, touchOptions: _react.PropTypes.object, panThreshold: _react.PropTypes.number, panDirection: _react.PropTypes.oneOf(touchEnums.directions), swipeDirection: _react.PropTypes.oneOf(touchEnums.directions) }), _defineProperty(_ApTouchMixin, 'statics', {}), _defineProperty(_ApTouchMixin, 'componentWillMount', function componentWillMount() { var s = this; s.getTouchData = s.getTouchData || function () { return undefined; }; }), _defineProperty(_ApTouchMixin, 'componentDidMount', function componentDidMount() { var s = this; var touchable = supportsTouch(s.props); var getData = function getData() { return s.getTouchData(); }; if (touchable) { s[TOUCH_HAMMER_KEY] = createTouchHammer(_reactDom2.default.findDOMNode(s), s.props, getData); } }), _defineProperty(_ApTouchMixin, 'componentWillUnmount', function componentWillUnmount() { var s = this; var hammer = s[TOUCH_HAMMER_KEY]; if (hammer) { destroyTouchHammer(hammer); } delete s[TOUCH_HAMMER_KEY]; }), _ApTouchMixin); exports.default = Object.freeze(ApTouchMixin); //# sourceMappingURL=data:application/json;base64,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RCxDQUF4QjtBQUNEO0FBQ0YsQ0F6REMsMEZBMkRzQjtBQUN0QixNQUFNLElBQUksSUFBVjtBQUNBLE1BQUksU0FBUyxFQUFHLGdCQUFILENBQWI7QUFDQSxNQUFJLE1BQUosRUFBWTtBQUNWLHVCQUFtQixNQUFuQjtBQUNEO0FBQ0QsU0FBTyxFQUFHLGdCQUFILENBQVA7QUFDRCxDQWxFQyxpQkFBSjs7a0JBcUVlLE9BQU8sTUFBUCxDQUFjLFlBQWQsQyIsImZpbGUiOiJhcF90b3VjaF9taXhpbi5qcyIsInNvdXJjZVJvb3QiOiIvVXNlcnMvb2t1bmlzaGluaXNoaS9Qcm9qZWN0cy9hcGVtYW4tcHJvamVjdHMvYXBlbWFuLXJlYWN0LW1peGlucy9saWIiLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIE1peGluIHRvIGFkZCB0b3VjaCBoYW5kbGVycy5cbiAqIEBtaXhpbiBBcFRvdWNoTWl4aW5cbiAqL1xuXG4ndXNlIHN0cmljdCdcblxuaW1wb3J0IFJlYWN0LCB7UHJvcFR5cGVzIGFzIHR5cGVzfSBmcm9tICdyZWFjdCdcbmltcG9ydCBSZWFjdERPTSBmcm9tICdyZWFjdC1kb20nXG5cbmNvbnN0IFRPVUNIX0hBTU1FUl9LRVkgPSAnX2FwVG91Y2hIYW1tZXInXG5cbmZ1bmN0aW9uIGNyZWF0ZVRvdWNoSGFtbWVyIChub2RlLCBwcm9wcywgZ2V0RGF0YSkge1xuICBpZiAoIW5vZGUpIHtcbiAgICByZXR1cm5cbiAgfVxuICBsZXQgSGFtbWVyID0gcmVxdWlyZSgnaGFtbWVyanMnKVxuICBsZXQgaGFtbWVyID0gbmV3IEhhbW1lcihub2RlKVxuICBpZiAocHJvcHMudG91Y2hPcHRpb25zKSB7XG4gICAgaGFtbWVyLnNldChwcm9wcy50b3VjaE9wdGlvbnMpXG4gIH1cbiAgT2JqZWN0LmtleXMoQXBUb3VjaE1peGluLnByb3BUeXBlcylcbiAgICAuZmlsdGVyKChrZXkpID0+ICEhcHJvcHNbIGtleSBdKVxuICAgIC5mb3JFYWNoKChrZXkpID0+IHtcbiAgICAgIGlmICgvXm9uLy50ZXN0KGtleSkpIHtcbiAgICAgICAgbGV0IGV2ZW50ID0ga2V5LnJlcGxhY2UoL15vbi8sICcnKS50b0xvd2VyQ2FzZSgpXG4gICAgICAgIGxldCBoYW5kbGVyID0gcHJvcHNbIGtleSBdXG4gICAgICAgIGhhbW1lci5vbihldmVudCwgKGUpID0+IHtcbiAgICAgICAgICBlLmRhdGEgPSBnZXREYXRhKCkgLy8gU2V0IHRvdWNoaW5nIGRhdGEuXG4gICAgICAgICAgaGFuZGxlcihlKVxuICAgICAgICB9KVxuICAgICAgfVxuICAgICAgaWYgKC9EaXJlY3Rpb24kLy50ZXN0KGtleSkpIHtcbiAgICAgICAgbGV0IGdlc3R1cmUgPSBrZXkucmVwbGFjZSgvRGlyZWN0aW9uJC8sICcnKVxuICAgICAgICBoYW1tZXIuZ2V0KGdlc3R1cmUpLnNldCh7IGRpcmVjdGlvbjogSGFtbWVyWyAnRElSRUNUSU9OXycgKyBwcm9wc1sga2V5IF0gXSB9KVxuICAgICAgfVxuICAgICAgaWYgKC9UaHJlc2hvbGQkLy50ZXN0KGtleSkpIHtcbiAgICAgICAgbGV0IHRocmVzaG9sZCA9IGtleS5yZXBsYWNlKC9UaHJlc2hvbGQkLywgJycpXG4gICAgICAgIGhhbW1lci5nZXQodGhyZXNob2xkKS5zZXQoeyB0aHJlc2hvbGQ6IHByb3BzWyBrZXkgXSB9KVxuICAgICAgfVxuICAgIH0pXG4gIHJldHVybiBoYW1tZXJcbn1cblxuZnVuY3Rpb24gZGVzdHJveVRvdWNoSGFtbWVyIChoYW1tZXIpIHtcbiAgaWYgKCFoYW1tZXIpIHtcbiAgICByZXR1cm5cbiAgfVxuICBoYW1tZXIuc3RvcCgpXG4gIGhhbW1lci5kZXN0cm95KClcbn1cblxuZnVuY3Rpb24gc3VwcG9ydHNUb3VjaCAocHJvcHMpIHtcbiAgbGV0IHRvdWNoYWJsZUtleSA9IE9iamVjdC5rZXlzKEFwVG91Y2hNaXhpbi5wcm9wVHlwZXMpXG4gIGZvciAobGV0IGtleSBvZiBPYmplY3Qua2V5cyhwcm9wcykpIHtcbiAgICBsZXQgaGl0ID0gISF+dG91Y2hhYmxlS2V5LmluZGV4T2Yoa2V5KVxuICAgIGlmIChoaXQpIHtcbiAgICAgIHJldHVybiB0cnVlXG4gICAgfVxuICB9XG4gIHJldHVybiBmYWxzZVxufVxuXG4vKiogRW51bSBmb3IgdG91Y2hpbmcgKi9cbmNvbnN0IHRvdWNoRW51bXMgPSB7XG4gIGRpcmVjdGlvbnM6IFtcbiAgICAnTk9ORScsXG4gICAgJ0xFRlQnLFxuICAgICdSSUdIVCcsXG4gICAgJ1VQJyxcbiAgICAnRE9XTicsXG4gICAgJ0hPUklaT05UQUwnLFxuICAgICdWRVJUSUNBTCcsXG4gICAgJ0FMTCdcbiAgXVxufVxuXG4vKiogQGxlbmRzIEFwVG91Y2hNaXhpbiAqL1xubGV0IEFwVG91Y2hNaXhpbiA9IHtcblxuICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLVxuICAvLyBDdXN0b21cbiAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS1cblxuICBbVE9VQ0hfSEFNTUVSX0tFWV06IG51bGwsXG5cbiAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS1cbiAgLy8gU3BlY3NcbiAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS1cblxuICBwcm9wVHlwZXM6IHtcbiAgICBvblRhcDogdHlwZXMuZnVuYyxcbiAgICBvbkRvdWJsZVRhcDogdHlwZXMuZnVuYyxcbiAgICBvblBhbjogdHlwZXMuZnVuYyxcbiAgICBvblBhblN0YXJ0OiB0eXBlcy5mdW5jLFxuICAgIG9uUGFuTW92ZTogdHlwZXMuZnVuYyxcbiAgICBvblBhbkVuZDogdHlwZXMuZnVuYyxcbiAgICBvblBhbkNhbmNlbDogdHlwZXMuZnVuYyxcbiAgICBvblN3aXBlOiB0eXBlcy5mdW5jLFxuICAgIG9uUHJlc3M6IHR5cGVzLmZ1bmMsXG4gICAgb25QcmVzc1VwOiB0eXBlcy5mdW5jLFxuICAgIG9uUGluY2g6IHR5cGVzLmZ1bmMsXG4gICAgb25QaW5jaFN0YXJ0OiB0eXBlcy5mdW5jLFxuICAgIG9uUGluY2hNb3ZlOiB0eXBlcy5mdW5jLFxuICAgIG9uUGluY2hFbmQ6IHR5cGVzLmZ1bmMsXG4gICAgb25QaW5jaENhbmNlbDogdHlwZXMuZnVuYyxcbiAgICBvblJvdGF0ZTogdHlwZXMuZnVuYyxcbiAgICBvblJvdGF0ZVN0YXJ0OiB0eXBlcy5mdW5jLFxuICAgIG9uUm90YXRlTW92ZTogdHlwZXMuZnVuYyxcbiAgICBvblJvdGF0ZUVuZDogdHlwZXMuZnVuYyxcbiAgICBvblJvdGF0ZUNhbmNlbDogdHlwZXMuZnVuYyxcbiAgICB0b3VjaE9wdGlvbnM6IHR5cGVzLm9iamVjdCxcbiAgICBwYW5UaHJlc2hvbGQ6IHR5cGVzLm51bWJlcixcbiAgICBwYW5EaXJlY3Rpb246IHR5cGVzLm9uZU9mKHRvdWNoRW51bXMuZGlyZWN0aW9ucyksXG4gICAgc3dpcGVEaXJlY3Rpb246IHR5cGVzLm9uZU9mKHRvdWNoRW51bXMuZGlyZWN0aW9ucylcbiAgfSxcblxuICBzdGF0aWNzOiB7fSxcblxuICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLVxuICAvLyBMaWZlY3ljbGVcbiAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS1cblxuICBjb21wb25lbnRXaWxsTW91bnQgKCkge1xuICAgIGNvbnN0IHMgPSB0aGlzXG4gICAgcy5nZXRUb3VjaERhdGEgPSBzLmdldFRvdWNoRGF0YSB8fCAoKCkgPT4gdW5kZWZpbmVkKVxuICB9LFxuXG4gIGNvbXBvbmVudERpZE1vdW50ICgpIHtcbiAgICBjb25zdCBzID0gdGhpc1xuICAgIGxldCB0b3VjaGFibGUgPSBzdXBwb3J0c1RvdWNoKHMucHJvcHMpXG4gICAgbGV0IGdldERhdGEgPSAoKSA9PiBzLmdldFRvdWNoRGF0YSgpXG4gICAgaWYgKHRvdWNoYWJsZSkge1xuICAgICAgc1sgVE9VQ0hfSEFNTUVSX0tFWSBdID0gY3JlYXRlVG91Y2hIYW1tZXIoUmVhY3RET00uZmluZERPTU5vZGUocyksIHMucHJvcHMsIGdldERhdGEpXG4gICAgfVxuICB9LFxuXG4gIGNvbXBvbmVudFdpbGxVbm1vdW50ICgpIHtcbiAgICBjb25zdCBzID0gdGhpc1xuICAgIGxldCBoYW1tZXIgPSBzWyBUT1VDSF9IQU1NRVJfS0VZIF1cbiAgICBpZiAoaGFtbWVyKSB7XG4gICAgICBkZXN0cm95VG91Y2hIYW1tZXIoaGFtbWVyKVxuICAgIH1cbiAgICBkZWxldGUgc1sgVE9VQ0hfSEFNTUVSX0tFWSBdXG4gIH1cbn1cblxuZXhwb3J0IGRlZmF1bHQgT2JqZWN0LmZyZWV6ZShBcFRvdWNoTWl4aW4pXG4iXX0=