apeman-react-touchable
Version:
apeman react package for touchable component.
218 lines (186 loc) • 18.4 kB
JavaScript
/**
* Higher order component with touching feature
* @function withTouch
* @param {function} Component - A component constructor
* @returns {function} - Wrapped component
*/
'use strict';
Object.defineProperty(exports, "__esModule", {
value: true
});
var _toConsumableArray2 = require('babel-runtime/helpers/toConsumableArray');
var _toConsumableArray3 = _interopRequireDefault(_toConsumableArray2);
var _assign = require('babel-runtime/core-js/object/assign');
var _assign2 = _interopRequireDefault(_assign);
var _getIterator2 = require('babel-runtime/core-js/get-iterator');
var _getIterator3 = _interopRequireDefault(_getIterator2);
var _keys = require('babel-runtime/core-js/object/keys');
var _keys2 = _interopRequireDefault(_keys);
var _breact = require('breact');
var _react = require('react');
var _react2 = _interopRequireDefault(_react);
var _reactDom = require('react-dom');
var _reactDom2 = _interopRequireDefault(_reactDom);
var _asobj = require('asobj');
var _enums = require('./enums');
var _new_hammer = require('./helpers/new_hammer');
var _new_hammer2 = _interopRequireDefault(_new_hammer);
function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
var propTypes = {
/** Handler for "tap" event */
onTap: _react.PropTypes.func,
/** Handler for "doubletap" event */
onDoubleTap: _react.PropTypes.func,
/** Handler for "pan" event */
onPan: _react.PropTypes.func,
/** Handler for "panstart" event */
onPanStart: _react.PropTypes.func,
/** Handler for "panmove" event */
onPanMove: _react.PropTypes.func,
/** Handler for "panend" event */
onPanEnd: _react.PropTypes.func,
/** Handler for "pancancel" event */
onPanCancel: _react.PropTypes.func,
/** Handler for "swipe" event */
onSwipe: _react.PropTypes.func,
/** Handler for "press" event */
onPress: _react.PropTypes.func,
/** Handler for "pressup" event */
onPressUp: _react.PropTypes.func,
/** Handler for "pinch" event */
onPinch: _react.PropTypes.func,
/** Handler for "pinchstart" event */
onPinchStart: _react.PropTypes.func,
/** Handler for "pinchmove" event */
onPinchMove: _react.PropTypes.func,
/** Handler for "pinchend" event */
onPinchEnd: _react.PropTypes.func,
/** Handler for "pinchcancel" event */
onPinchCancel: _react.PropTypes.func,
/** Handler for "rotate" event */
onRotate: _react.PropTypes.func,
/** Handler for "rotatestart" event */
onRotateStart: _react.PropTypes.func,
/** Handler for "rotatemove" event */
onRotateMove: _react.PropTypes.func,
/** Handler for "rotateend" event */
onRotateEnd: _react.PropTypes.func,
/** Handler for "rotatecancel" event */
onRotateCancel: _react.PropTypes.func,
/** Options for touch */
touchOptions: _react.PropTypes.object,
/** Pixcel for pan threshold */
panThreshold: _react.PropTypes.number,
/** Direction for pan */
panDirection: _react.PropTypes.oneOf(_enums.directions),
/** Direction for swipe */
swipeDirection: _react.PropTypes.oneOf(_enums.directions)
};
function createTouchHammer(node, props, getData) {
if (!node) {
return;
}
var hammer = (0, _new_hammer2.default)(node);
if (props.touchOptions) {
hammer.set(props.touchOptions);
}
(0, _keys2.default)(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.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 = (0, _keys2.default)(propTypes);
var _iteratorNormalCompletion = true;
var _didIteratorError = false;
var _iteratorError = undefined;
try {
for (var _iterator = (0, _getIterator3.default)((0, _keys2.default)(props)), _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;
}
/** @lends withTouch */
function withTouch(Component) {
var config = arguments.length <= 1 || arguments[1] === undefined ? {} : arguments[1];
var getTouchData = config.getTouchData;
var spec = (0, _assign2.default)({
displayName: 'withTouch',
propTypes: propTypes,
render: function render() {
var s = this;
var props = s.props;
var wrappedProps = (0, _asobj.clone)(props, {
without: (0, _keys2.default)(propTypes || {})
});
wrappedProps.hasTouch = !!props.onTap;
var children = _react2.default.Children.toArray(props.children);
return _react2.default.createElement.apply(_react2.default, [Component, wrappedProps].concat((0, _toConsumableArray3.default)(children)));
},
componentDidMount: function componentDidMount() {
var s = this;
var touchable = supportsTouch(s.props);
var getData = function getData() {
return s.getTouchData ? s.getTouchData() : undefined;
};
if (touchable) {
s.touchHammer = createTouchHammer(_reactDom2.default.findDOMNode(s), s.props, getData);
}
},
componentWillUnmount: function componentWillUnmount() {
var s = this;
var hammer = s.touchHammer;
if (hammer) {
destroyTouchHammer(hammer);
}
delete s.touchHammer;
}
}, { getTouchData: getTouchData });
return (0, _breact.wrap)(Component, spec);
}
exports.default = withTouch;
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIndpdGhfdG91Y2guanN4Il0sIm5hbWVzIjpbInByb3BUeXBlcyIsIm9uVGFwIiwiZnVuYyIsIm9uRG91YmxlVGFwIiwib25QYW4iLCJvblBhblN0YXJ0Iiwib25QYW5Nb3ZlIiwib25QYW5FbmQiLCJvblBhbkNhbmNlbCIsIm9uU3dpcGUiLCJvblByZXNzIiwib25QcmVzc1VwIiwib25QaW5jaCIsIm9uUGluY2hTdGFydCIsIm9uUGluY2hNb3ZlIiwib25QaW5jaEVuZCIsIm9uUGluY2hDYW5jZWwiLCJvblJvdGF0ZSIsIm9uUm90YXRlU3RhcnQiLCJvblJvdGF0ZU1vdmUiLCJvblJvdGF0ZUVuZCIsIm9uUm90YXRlQ2FuY2VsIiwidG91Y2hPcHRpb25zIiwib2JqZWN0IiwicGFuVGhyZXNob2xkIiwibnVtYmVyIiwicGFuRGlyZWN0aW9uIiwib25lT2YiLCJzd2lwZURpcmVjdGlvbiIsImNyZWF0ZVRvdWNoSGFtbWVyIiwibm9kZSIsInByb3BzIiwiZ2V0RGF0YSIsImhhbW1lciIsInNldCIsImZpbHRlciIsImtleSIsImZvckVhY2giLCJ0ZXN0IiwiZXZlbnQiLCJyZXBsYWNlIiwidG9Mb3dlckNhc2UiLCJoYW5kbGVyIiwib24iLCJlIiwiZGF0YSIsImdlc3R1cmUiLCJnZXQiLCJkaXJlY3Rpb24iLCJIYW1tZXIiLCJ0aHJlc2hvbGQiLCJkZXN0cm95VG91Y2hIYW1tZXIiLCJzdG9wIiwiZGVzdHJveSIsInN1cHBvcnRzVG91Y2giLCJ0b3VjaGFibGVLZXkiLCJoaXQiLCJpbmRleE9mIiwid2l0aFRvdWNoIiwiQ29tcG9uZW50IiwiY29uZmlnIiwiZ2V0VG91Y2hEYXRhIiwic3BlYyIsImRpc3BsYXlOYW1lIiwicmVuZGVyIiwicyIsIndyYXBwZWRQcm9wcyIsIndpdGhvdXQiLCJoYXNUb3VjaCIsImNoaWxkcmVuIiwiQ2hpbGRyZW4iLCJ0b0FycmF5IiwiY3JlYXRlRWxlbWVudCIsImNvbXBvbmVudERpZE1vdW50IiwidG91Y2hhYmxlIiwidW5kZWZp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Um9vdCI6ImxpYiIsInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogSGlnaGVyIG9yZGVyIGNvbXBvbmVudCB3aXRoIHRvdWNoaW5nIGZlYXR1cmVcbiAqIEBmdW5jdGlvbiB3aXRoVG91Y2hcbiAqIEBwYXJhbSB7ZnVuY3Rpb259IENvbXBvbmVudCAtIEEgY29tcG9uZW50IGNvbnN0cnVjdG9yXG4gKiBAcmV0dXJucyB7ZnVuY3Rpb259IC0gV3JhcHBlZCBjb21wb25lbnRcbiAqL1xuJ3VzZSBzdHJpY3QnXG5cbmltcG9ydCB7d3JhcH0gZnJvbSAnYnJlYWN0J1xuaW1wb3J0IFJlYWN0LCB7UHJvcFR5cGVzIGFzIHR5cGVzfSBmcm9tICdyZWFjdCdcbmltcG9ydCBSZWFjdERPTSBmcm9tICdyZWFjdC1kb20nXG5pbXBvcnQge2Nsb25lfSBmcm9tICdhc29iaidcbmltcG9ydCB7ZGlyZWN0aW9uc30gZnJvbSAnLi9lbnVtcydcbmltcG9ydCBuZXdIYW1tZXIgZnJvbSAnLi9oZWxwZXJzL25ld19oYW1tZXInXG5cbmNvbnN0IHByb3BUeXBlcyA9IHtcbiAgLyoqIEhhbmRsZXIgZm9yIFwidGFwXCIgZXZlbnQgKi9cbiAgb25UYXA6IHR5cGVzLmZ1bmMsXG4gIC8qKiBIYW5kbGVyIGZvciBcImRvdWJsZXRhcFwiIGV2ZW50ICovXG4gIG9uRG91YmxlVGFwOiB0eXBlcy5mdW5jLFxuICAvKiogSGFuZGxlciBmb3IgXCJwYW5cIiBldmVudCAqL1xuICBvblBhbjogdHlwZXMuZnVuYyxcbiAgLyoqIEhhbmRsZXIgZm9yIFwicGFuc3RhcnRcIiBldmVudCAqL1xuICBvblBhblN0YXJ0OiB0eXBlcy5mdW5jLFxuICAvKiogSGFuZGxlciBmb3IgXCJwYW5tb3ZlXCIgZXZlbnQgKi9cbiAgb25QYW5Nb3ZlOiB0eXBlcy5mdW5jLFxuICAvKiogSGFuZGxlciBmb3IgXCJwYW5lbmRcIiBldmVudCAqL1xuICBvblBhbkVuZDogdHlwZXMuZnVuYyxcbiAgLyoqIEhhbmRsZXIgZm9yIFwicGFuY2FuY2VsXCIgZXZlbnQgKi9cbiAgb25QYW5DYW5jZWw6IHR5cGVzLmZ1bmMsXG4gIC8qKiBIYW5kbGVyIGZvciBcInN3aXBlXCIgZXZlbnQgKi9cbiAgb25Td2lwZTogdHlwZXMuZnVuYyxcbiAgLyoqIEhhbmRsZXIgZm9yIFwicHJlc3NcIiBldmVudCAqL1xuICBvblByZXNzOiB0eXBlcy5mdW5jLFxuICAvKiogSGFuZGxlciBmb3IgXCJwcmVzc3VwXCIgZXZlbnQgKi9cbiAgb25QcmVzc1VwOiB0eXBlcy5mdW5jLFxuICAvKiogSGFuZGxlciBmb3IgXCJwaW5jaFwiIGV2ZW50ICovXG4gIG9uUGluY2g6IHR5cGVzLmZ1bmMsXG4gIC8qKiBIYW5kbGVyIGZvciBcInBpbmNoc3RhcnRcIiBldmVudCAqL1xuICBvblBpbmNoU3RhcnQ6IHR5cGVzLmZ1bmMsXG4gIC8qKiBIYW5kbGVyIGZvciBcInBpbmNobW92ZVwiIGV2ZW50ICovXG4gIG9uUGluY2hNb3ZlOiB0eXBlcy5mdW5jLFxuICAvKiogSGFuZGxlciBmb3IgXCJwaW5jaGVuZFwiIGV2ZW50ICovXG4gIG9uUGluY2hFbmQ6IHR5cGVzLmZ1bmMsXG4gIC8qKiBIYW5kbGVyIGZvciBcInBpbmNoY2FuY2VsXCIgZXZlbnQgKi9cbiAgb25QaW5jaENhbmNlbDogdHlwZXMuZnVuYyxcbiAgLyoqIEhhbmRsZXIgZm9yIFwicm90YXRlXCIgZXZlbnQgKi9cbiAgb25Sb3RhdGU6IHR5cGVzLmZ1bmMsXG4gIC8qKiBIYW5kbGVyIGZvciBcInJvdGF0ZXN0YXJ0XCIgZXZlbnQgKi9cbiAgb25Sb3RhdGVTdGFydDogdHlwZXMuZnVuYyxcbiAgLyoqIEhhbmRsZXIgZm9yIFwicm90YXRlbW92ZVwiIGV2ZW50ICovXG4gIG9uUm90YXRlTW92ZTogdHlwZXMuZnVuYyxcbiAgLyoqIEhhbmRsZXIgZm9yIFwicm90YXRlZW5kXCIgZXZlbnQgKi9cbiAgb25Sb3RhdGVFbmQ6IHR5cGVzLmZ1bmMsXG4gIC8qKiBIYW5kbGVyIGZvciBcInJvdGF0ZWNhbmNlbFwiIGV2ZW50ICovXG4gIG9uUm90YXRlQ2FuY2VsOiB0eXBlcy5mdW5jLFxuICAvKiogT3B0aW9ucyBmb3IgdG91Y2ggKi9cbiAgdG91Y2hPcHRpb25zOiB0eXBlcy5vYmplY3QsXG4gIC8qKiBQaXhjZWwgZm9yIHBhbiB0aHJlc2hvbGQgKi9cbiAgcGFuVGhyZXNob2xkOiB0eXBlcy5udW1iZXIsXG4gIC8qKiBEaXJlY3Rpb24gZm9yIHBhbiAqL1xuICBwYW5EaXJlY3Rpb246IHR5cGVzLm9uZU9mKGRpcmVjdGlvbnMpLFxuICAvKiogRGlyZWN0aW9uIGZvciBzd2lwZSAqL1xuICBzd2lwZURpcmVjdGlvbjogdHlwZXMub25lT2YoZGlyZWN0aW9ucylcbn1cblxuZnVuY3Rpb24gY3JlYXRlVG91Y2hIYW1tZXIgKG5vZGUsIHByb3BzLCBnZXREYXRhKSB7XG4gIGlmICghbm9kZSkge1xuICAgIHJldHVyblxuICB9XG4gIGxldCBoYW1tZXIgPSBuZXdIYW1tZXIobm9kZSlcbiAgaWYgKHByb3BzLnRvdWNoT3B0aW9ucykge1xuICAgIGhhbW1lci5zZXQocHJvcHMudG91Y2hPcHRpb25zKVxuICB9XG4gIE9iamVjdC5rZXlzKHByb3BUeXBlcylcbiAgICAuZmlsdGVyKChrZXkpID0+ICEhcHJvcHNbIGtleSBdKVxuICAgIC5mb3JFYWNoKChrZXkpID0+IHtcbiAgICAgIGlmICgvXm9uLy50ZXN0KGtleSkpIHtcbiAgICAgICAgbGV0IGV2ZW50ID0ga2V5LnJlcGxhY2UoL15vbi8sICcnKS50b0xvd2VyQ2FzZSgpXG4gICAgICAgIGxldCBoYW5kbGVyID0gcHJvcHNbIGtleSBdXG4gICAgICAgIGhhbW1lci5vbihldmVudCwgKGUpID0+IHtcbiAgICAgICAgICBlLmRhdGEgPSBnZXREYXRhKCkgLy8gU2V0IHRvdWNoaW5nIGRhdGEuXG4gICAgICAgICAgaGFuZGxlcihlKVxuICAgICAgICB9KVxuICAgICAgfVxuICAgICAgaWYgKC9EaXJlY3Rpb24kLy50ZXN0KGtleSkpIHtcbiAgICAgICAgbGV0IGdlc3R1cmUgPSBrZXkucmVwbGFjZSgvRGlyZWN0aW9uJC8sICcnKVxuICAgICAgICBoYW1tZXIuZ2V0KGdlc3R1cmUpLnNldCh7IGRpcmVjdGlvbjogaGFtbWVyLkhhbW1lclsgJ0RJUkVDVElPTl8nICsgcHJvcHNbIGtleSBdIF0gfSlcbiAgICAgIH1cbiAgICAgIGlmICgvVGhyZXNob2xkJC8udGVzdChrZXkpKSB7XG4gICAgICAgIGxldCB0aHJlc2hvbGQgPSBrZXkucmVwbGFjZSgvVGhyZXNob2xkJC8sICcnKVxuICAgICAgICBoYW1tZXIuZ2V0KHRocmVzaG9sZCkuc2V0KHsgdGhyZXNob2xkOiBwcm9wc1sga2V5IF0gfSlcbiAgICAgIH1cbiAgICB9KVxuICByZXR1cm4gaGFtbWVyXG59XG5cbmZ1bmN0aW9uIGRlc3Ryb3lUb3VjaEhhbW1lciAoaGFtbWVyKSB7XG4gIGlmICghaGFtbWVyKSB7XG4gICAgcmV0dXJuXG4gIH1cbiAgaGFtbWVyLnN0b3AoKVxuICBoYW1tZXIuZGVzdHJveSgpXG59XG5cbmZ1bmN0aW9uIHN1cHBvcnRzVG91Y2ggKHByb3BzKSB7XG4gIGxldCB0b3VjaGFibGVLZXkgPSBPYmplY3Qua2V5cyhwcm9wVHlwZXMpXG4gIGZvciAobGV0IGtleSBvZiBPYmplY3Qua2V5cyhwcm9wcykpIHtcbiAgICBsZXQgaGl0ID0gISF+dG91Y2hhYmxlS2V5LmluZGV4T2Yoa2V5KVxuICAgIGlmIChoaXQpIHtcbiAgICAgIHJldHVybiB0cnVlXG4gICAgfVxuICB9XG4gIHJldHVybiBmYWxzZVxufVxuXG4vKiogQGxlbmRzIHdpdGhUb3VjaCAqL1xuZnVuY3Rpb24gd2l0aFRvdWNoIChDb21wb25lbnQsIGNvbmZpZyA9IHt9KSB7XG4gIGxldCB7IGdldFRvdWNoRGF0YSB9ID0gY29uZmlnXG4gIGxldCBzcGVjID0gT2JqZWN0LmFzc2lnbih7XG4gICAgZGlzcGxheU5hbWU6ICd3aXRoVG91Y2gnLFxuXG4gICAgcHJvcFR5cGVzLFxuXG4gICAgcmVuZGVyICgpIHtcbiAgICAgIGNvbnN0IHMgPSB0aGlzXG4gICAgICBsZXQgeyBwcm9wcyB9ID0gc1xuICAgICAgbGV0IHdyYXBwZWRQcm9wcyA9IGNsb25lKHByb3BzLCB7XG4gICAgICAgIHdpdGhvdXQ6IE9iamVjdC5rZXlzKHByb3BUeXBlcyB8fCB7fSlcbiAgICAgIH0pXG4gICAgICB3cmFwcGVkUHJvcHMuaGFzVG91Y2ggPSAhIShwcm9wcy5vblRhcClcbiAgICAgIGxldCBjaGlsZHJlbiA9IFJlYWN0LkNoaWxkcmVuLnRvQXJyYXkocHJvcHMuY2hpbGRyZW4pXG4gICAgICByZXR1cm4gUmVhY3QuY3JlYXRlRWxlbWVudChDb21wb25lbnQsIHdyYXBwZWRQcm9wcywgLi4uY2hpbGRyZW4pXG4gICAgfSxcblxuICAgIGNvbXBvbmVudERpZE1vdW50ICgpIHtcbiAgICAgIGNvbnN0IHMgPSB0aGlzXG4gICAgICBsZXQgdG91Y2hhYmxlID0gc3VwcG9ydHNUb3VjaChzLnByb3BzKVxuICAgICAgbGV0IGdldERhdGEgPSAoKSA9PiBzLmdldFRvdWNoRGF0YSA/IHMuZ2V0VG91Y2hEYXRhKCkgOiB1bmRlZmluZWRcbiAgICAgIGlmICh0b3VjaGFibGUpIHtcbiAgICAgICAgcy50b3VjaEhhbW1lciA9IGNyZWF0ZVRvdWNoSGFtbWVyKFJlYWN0RE9NLmZpbmRET01Ob2RlKHMpLCBzLnByb3BzLCBnZXREYXRhKVxuICAgICAgfVxuICAgIH0sXG5cbiAgICBjb21wb25lbnRXaWxsVW5tb3VudCAoKSB7XG4gICAgICBjb25zdCBzID0gdGhpc1xuICAgICAgbGV0IGhhbW1lciA9IHMudG91Y2hIYW1tZXJcbiAgICAgIGlmIChoYW1tZXIpIHtcbiAgICAgICAgZGVzdHJveVRvdWNoSGFtbWVyKGhhbW1lcilcbiAgICAgIH1cbiAgICAgIGRlbGV0ZSBzLnRvdWNoSGFtbWVyXG4gICAgfVxuICB9LCB7IGdldFRvdWNoRGF0YSB9KVxuICByZXR1cm4gd3JhcChDb21wb25lbnQsIHNwZWMpXG59XG5cbmV4cG9ydCBkZWZhdWx0IHdpdGhUb3VjaFxuIl19