apeman-react-mixins
Version:
React mixin set of apeman.
162 lines (143 loc) • 13.5 kB
JavaScript
/**
* Mixin to add touch handlers.
* @mixin ApTouchMixin
*/
;
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, {
cssProps: {
userSelect: true
}
});
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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Q0FBcUIsQ0FBckIsQ0FBbEIsRUFBMkMsRUFBRSxLQUE3QyxFQUFvRCxPQUFwRCxDQUF4QjtBQUNEO0FBQ0YsQ0F6REMsMEZBMkRzQjtBQUN0QixNQUFNLElBQUksSUFBVjtBQUNBLE1BQUksU0FBUyxFQUFHLGdCQUFILENBQWI7QUFDQSxNQUFJLE1BQUosRUFBWTtBQUNWLHVCQUFtQixNQUFuQjtBQUNEO0FBQ0QsU0FBTyxFQUFHLGdCQUFILENBQVA7QUFDRCxDQWxFQyxpQkFBSjs7a0JBcUVlLE9BQU8sTUFBUCxDQUFjLFlBQWQsQyIsImZpbGUiOiJhcF90b3VjaF9taXhpbi5qcyIsInNvdXJjZVJvb3QiOiIvVXNlcnMvb2t1bmlzaGluaXNoaS9Qcm9qZWN0cy9hcGVtYW4tcHJvamVjdHMvYXBlbWFuLXJlYWN0LW1peGlucy9saWIiLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIE1peGluIHRvIGFkZCB0b3VjaCBoYW5kbGVycy5cbiAqIEBtaXhpbiBBcFRvdWNoTWl4aW5cbiAqL1xuXG4ndXNlIHN0cmljdCdcblxuaW1wb3J0IFJlYWN0LCB7UHJvcFR5cGVzIGFzIHR5cGVzfSBmcm9tICdyZWFjdCdcbmltcG9ydCBSZWFjdERPTSBmcm9tICdyZWFjdC1kb20nXG5cbmNvbnN0IFRPVUNIX0hBTU1FUl9LRVkgPSAnX2FwVG91Y2hIYW1tZXInXG5cbmZ1bmN0aW9uIGNyZWF0ZVRvdWNoSGFtbWVyIChub2RlLCBwcm9wcywgZ2V0RGF0YSkge1xuICBpZiAoIW5vZGUpIHtcbiAgICByZXR1cm5cbiAgfVxuICBsZXQgSGFtbWVyID0gcmVxdWlyZSgnaGFtbWVyanMnKVxuICBsZXQgaGFtbWVyID0gbmV3IEhhbW1lcihub2RlLCB7XG4gICAgY3NzUHJvcHM6IHtcbiAgICAgIHVzZXJTZWxlY3Q6IHRydWVcbiAgICB9XG4gIH0pXG4gIGlmIChwcm9wcy50b3VjaE9wdGlvbnMpIHtcbiAgICBoYW1tZXIuc2V0KHByb3BzLnRvdWNoT3B0aW9ucylcbiAgfVxuICBPYmplY3Qua2V5cyhBcFRvdWNoTWl4aW4ucHJvcFR5cGVzKVxuICAgIC5maWx0ZXIoKGtleSkgPT4gISFwcm9wc1sga2V5IF0pXG4gICAgLmZvckVhY2goKGtleSkgPT4ge1xuICAgICAgaWYgKC9eb24vLnRlc3Qoa2V5KSkge1xuICAgICAgICBsZXQgZXZlbnQgPSBrZXkucmVwbGFjZSgvXm9uLywgJycpLnRvTG93ZXJDYXNlKClcbiAgICAgICAgbGV0IGhhbmRsZXIgPSBwcm9wc1sga2V5IF1cbiAgICAgICAgaGFtbWVyLm9uKGV2ZW50LCAoZSkgPT4ge1xuICAgICAgICAgIGUuZGF0YSA9IGdldERhdGEoKSAvLyBTZXQgdG91Y2hpbmcgZGF0YS5cbiAgICAgICAgICBoYW5kbGVyKGUpXG4gICAgICAgIH0pXG4gICAgICB9XG4gICAgICBpZiAoL0RpcmVjdGlvbiQvLnRlc3Qoa2V5KSkge1xuICAgICAgICBsZXQgZ2VzdHVyZSA9IGtleS5yZXBsYWNlKC9EaXJlY3Rpb24kLywgJycpXG4gICAgICAgIGhhbW1lci5nZXQoZ2VzdHVyZSkuc2V0KHsgZGlyZWN0aW9uOiBIYW1tZXJbICdESVJFQ1RJT05fJyArIHByb3BzWyBrZXkgXSBdIH0pXG4gICAgICB9XG4gICAgICBpZiAoL1RocmVzaG9sZCQvLnRlc3Qoa2V5KSkge1xuICAgICAgICBsZXQgdGhyZXNob2xkID0ga2V5LnJlcGxhY2UoL1RocmVzaG9sZCQvLCAnJylcbiAgICAgICAgaGFtbWVyLmdldCh0aHJlc2hvbGQpLnNldCh7IHRocmVzaG9sZDogcHJvcHNbIGtleSBdIH0pXG4gICAgICB9XG4gICAgfSlcbiAgcmV0dXJuIGhhbW1lclxufVxuXG5mdW5jdGlvbiBkZXN0cm95VG91Y2hIYW1tZXIgKGhhbW1lcikge1xuICBpZiAoIWhhbW1lcikge1xuICAgIHJldHVyblxuICB9XG4gIGhhbW1lci5zdG9wKClcbiAgaGFtbWVyLmRlc3Ryb3koKVxufVxuXG5mdW5jdGlvbiBzdXBwb3J0c1RvdWNoIChwcm9wcykge1xuICBsZXQgdG91Y2hhYmxlS2V5ID0gT2JqZWN0LmtleXMoQXBUb3VjaE1peGluLnByb3BUeXBlcylcbiAgZm9yIChsZXQga2V5IG9mIE9iamVjdC5rZXlzKHByb3BzKSkge1xuICAgIGxldCBoaXQgPSAhIX50b3VjaGFibGVLZXkuaW5kZXhPZihrZXkpXG4gICAgaWYgKGhpdCkge1xuICAgICAgcmV0dXJuIHRydWVcbiAgICB9XG4gIH1cbiAgcmV0dXJuIGZhbHNlXG59XG5cbi8qKiBFbnVtIGZvciB0b3VjaGluZyAqL1xuY29uc3QgdG91Y2hFbnVtcyA9IHtcbiAgZGlyZWN0aW9uczogW1xuICAgICdOT05FJyxcbiAgICAnTEVGVCcsXG4gICAgJ1JJR0hUJyxcbiAgICAnVVAnLFxuICAgICdET1dOJyxcbiAgICAnSE9SSVpPTlRBTCcsXG4gICAgJ1ZFUlRJQ0FMJyxcbiAgICAnQUxMJ1xuICBdXG59XG5cbi8qKiBAbGVuZHMgQXBUb3VjaE1peGluICovXG5sZXQgQXBUb3VjaE1peGluID0ge1xuXG4gIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tXG4gIC8vIEN1c3RvbVxuICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLVxuXG4gIFtUT1VDSF9IQU1NRVJfS0VZXTogbnVsbCxcblxuICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLVxuICAvLyBTcGVjc1xuICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLVxuXG4gIHByb3BUeXBlczoge1xuICAgIG9uVGFwOiB0eXBlcy5mdW5jLFxuICAgIG9uRG91YmxlVGFwOiB0eXBlcy5mdW5jLFxuICAgIG9uUGFuOiB0eXBlcy5mdW5jLFxuICAgIG9uUGFuU3RhcnQ6IHR5cGVzLmZ1bmMsXG4gICAgb25QYW5Nb3ZlOiB0eXBlcy5mdW5jLFxuICAgIG9uUGFuRW5kOiB0eXBlcy5mdW5jLFxuICAgIG9uUGFuQ2FuY2VsOiB0eXBlcy5mdW5jLFxuICAgIG9uU3dpcGU6IHR5cGVzLmZ1bmMsXG4gICAgb25QcmVzczogdHlwZXMuZnVuYyxcbiAgICBvblByZXNzVXA6IHR5cGVzLmZ1bmMsXG4gICAgb25QaW5jaDogdHlwZXMuZnVuYyxcbiAgICBvblBpbmNoU3RhcnQ6IHR5cGVzLmZ1bmMsXG4gICAgb25QaW5jaE1vdmU6IHR5cGVzLmZ1bmMsXG4gICAgb25QaW5jaEVuZDogdHlwZXMuZnVuYyxcbiAgICBvblBpbmNoQ2FuY2VsOiB0eXBlcy5mdW5jLFxuICAgIG9uUm90YXRlOiB0eXBlcy5mdW5jLFxuICAgIG9uUm90YXRlU3RhcnQ6IHR5cGVzLmZ1bmMsXG4gICAgb25Sb3RhdGVNb3ZlOiB0eXBlcy5mdW5jLFxuICAgIG9uUm90YXRlRW5kOiB0eXBlcy5mdW5jLFxuICAgIG9uUm90YXRlQ2FuY2VsOiB0eXBlcy5mdW5jLFxuICAgIHRvdWNoT3B0aW9uczogdHlwZXMub2JqZWN0LFxuICAgIHBhblRocmVzaG9sZDogdHlwZXMubnVtYmVyLFxuICAgIHBhbkRpcmVjdGlvbjogdHlwZXMub25lT2YodG91Y2hFbnVtcy5kaXJlY3Rpb25zKSxcbiAgICBzd2lwZURpcmVjdGlvbjogdHlwZXMub25lT2YodG91Y2hFbnVtcy5kaXJlY3Rpb25zKVxuICB9LFxuXG4gIHN0YXRpY3M6IHt9LFxuXG4gIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tXG4gIC8vIExpZmVjeWNsZVxuICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLVxuXG4gIGNvbXBvbmVudFdpbGxNb3VudCAoKSB7XG4gICAgY29uc3QgcyA9IHRoaXNcbiAgICBzLmdldFRvdWNoRGF0YSA9IHMuZ2V0VG91Y2hEYXRhIHx8ICgoKSA9PiB1bmRlZmluZWQpXG4gIH0sXG5cbiAgY29tcG9uZW50RGlkTW91bnQgKCkge1xuICAgIGNvbnN0IHMgPSB0aGlzXG4gICAgbGV0IHRvdWNoYWJsZSA9IHN1cHBvcnRzVG91Y2gocy5wcm9wcylcbiAgICBsZXQgZ2V0RGF0YSA9ICgpID0+IHMuZ2V0VG91Y2hEYXRhKClcbiAgICBpZiAodG91Y2hhYmxlKSB7XG4gICAgICBzWyBUT1VDSF9IQU1NRVJfS0VZIF0gPSBjcmVhdGVUb3VjaEhhbW1lcihSZWFjdERPTS5maW5kRE9NTm9kZShzKSwgcy5wcm9wcywgZ2V0RGF0YSlcbiAgICB9XG4gIH0sXG5cbiAgY29tcG9uZW50V2lsbFVubW91bnQgKCkge1xuICAgIGNvbnN0IHMgPSB0aGlzXG4gICAgbGV0IGhhbW1lciA9IHNbIFRPVUNIX0hBTU1FUl9LRVkgXVxuICAgIGlmIChoYW1tZXIpIHtcbiAgICAgIGRlc3Ryb3lUb3VjaEhhbW1lcihoYW1tZXIpXG4gICAgfVxuICAgIGRlbGV0ZSBzWyBUT1VDSF9IQU1NRVJfS0VZIF1cbiAgfVxufVxuXG5leHBvcnQgZGVmYXVsdCBPYmplY3QuZnJlZXplKEFwVG91Y2hNaXhpbilcbiJdfQ==