apeman-react-mixins
Version:
React mixin set of apeman.
158 lines (139 loc) • 13.3 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);
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=