rxjs-gestures
Version:
A library for reacting to future user input.
367 lines (293 loc) • 16.3 kB
JavaScript
'use strict';
Object.defineProperty(exports, "__esModule", {
value: true
});
exports.Gestures = undefined;
var _typeof = typeof Symbol === "function" && typeof Symbol.iterator === "symbol" ? function (obj) { return typeof obj; } : function (obj) { return obj && typeof Symbol === "function" && obj.constructor === Symbol && obj !== Symbol.prototype ? "symbol" : typeof obj; };
var _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }();
exports.install = install;
var _symbolObservable = require('symbol-observable');
var _symbolObservable2 = _interopRequireDefault(_symbolObservable);
var _support = require('./support');
var _Observable2 = require('rxjs/Observable');
var _ReplaySubject = require('rxjs/ReplaySubject');
var _operators = require('./operators');
var _animationFrame = require('rxjs/scheduler/animationFrame');
function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
function _toConsumableArray(arr) { if (Array.isArray(arr)) { for (var i = 0, arr2 = Array(arr.length); i < arr.length; i++) { arr2[i] = arr[i]; } return arr2; } else { return Array.from(arr); } }
function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } }
function _possibleConstructorReturn(self, call) { if (!self) { throw new ReferenceError("this hasn't been initialised - super() hasn't been called"); } return call && (typeof call === "object" || typeof call === "function") ? call : self; }
function _inherits(subClass, superClass) { if (typeof superClass !== "function" && superClass !== null) { throw new TypeError("Super expression must either be null or a function, not " + typeof superClass); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } }); if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass; }
var mouseEvents = {
start: 'mousedown', end: 'mouseup',
move: 'mousemove', cancel: 'mouseleave',
wheel: 'wheel'
};
var touchEvents = {
start: 'touchstart', end: 'touchend',
move: 'touchmove', cancel: 'touchcancel'
};
function identity(x) {
return x;
}
function getIdentifier(_ref) {
var _ref$identifier = _ref.identifier,
identifier = _ref$identifier === undefined ? 'mouse' : _ref$identifier;
return identifier;
}
function getReplaySubject1() {
return new _ReplaySubject.ReplaySubject(1);
}
function getTopLevelElement() {
return typeof window !== 'undefined' ? window : typeof document !== 'undefined' ? document : global;
}
function install() {
var _class, _temp;
var topLevelElement = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : getTopLevelElement();
return wrapStaticObservableMethods(_Observable2.Observable, (_temp = _class = function (_Gestures) {
_inherits(InstalledGestures, _Gestures);
function InstalledGestures() {
_classCallCheck(this, InstalledGestures);
return _possibleConstructorReturn(this, (InstalledGestures.__proto__ || Object.getPrototypeOf(InstalledGestures)).apply(this, arguments));
}
_createClass(InstalledGestures, [{
key: 'lift',
value: function lift(operator) {
var observable = new InstalledGestures(this);
observable.operator = operator;
return observable;
}
}]);
return InstalledGestures;
}(Gestures), _class.topLevelElement = topLevelElement, _temp));
}
var Gestures = function (_Observable) {
_inherits(Gestures, _Observable);
function Gestures(target) {
_classCallCheck(this, Gestures);
for (var _len = arguments.length, events = Array(_len > 1 ? _len - 1 : 0), _key = 1; _key < _len; _key++) {
events[_key - 1] = arguments[_key];
}
if (!target || typeof target === 'function' || (typeof target === 'undefined' ? 'undefined' : _typeof(target)) !== 'object') {
var _this2 = _possibleConstructorReturn(this, (Gestures.__proto__ || Object.getPrototypeOf(Gestures)).call(this, target));
} else if (typeof target[_symbolObservable2.default] === 'function') {
var _this2 = _possibleConstructorReturn(this, (Gestures.__proto__ || Object.getPrototypeOf(Gestures)).call(this));
_this2.source = target[_symbolObservable2.default]();
} else if (events.length === 1) {
var _this2 = _possibleConstructorReturn(this, (Gestures.__proto__ || Object.getPrototypeOf(Gestures)).call(this));
_this2.source = _Observable2.Observable.fromEvent(target, event[0]);
} else {
var _this2 = _possibleConstructorReturn(this, (Gestures.__proto__ || Object.getPrototypeOf(Gestures)).call(this));
_this2.source = _Observable2.Observable.merge.apply(_Observable2.Observable, _toConsumableArray(events.map(function (event) {
return _Observable2.Observable.fromEvent(target, event);
})));
}
return _possibleConstructorReturn(_this2);
}
_createClass(Gestures, [{
key: 'lift',
value: function lift(operator) {
var observable = new Gestures(this);
observable.operator = operator;
return observable;
}
}, {
key: 'preventDefault',
value: function preventDefault() {
return this.lift(new _operators.PreventDefaultOperator());
}
}, {
key: 'stopPropagation',
value: function stopPropagation() {
var immediate = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : false;
return this.lift(new _operators.StopPropagationOperator(immediate));
}
}, {
key: 'decelerate',
value: function decelerate() {
var coefficientOfFriction = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : 25;
var speedLimit = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : 3000;
var scheduler = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : _animationFrame.animationFrame;
return this.lift(new _operators.DecelerateOperator(coefficientOfFriction, speedLimit, scheduler));
}
}, {
key: 'inside',
value: function inside(_ref2) {
var radiusX = _ref2.x,
radiusY = _ref2.y;
return this.filter(function (_ref3) {
var movementXTotal = _ref3.movementXTotal,
movementYTotal = _ref3.movementYTotal;
return !(0, _support.epsilon)(radiusX, radiusY, movementXTotal, movementYTotal);
});
}
}, {
key: 'outside',
value: function outside(_ref4) {
var radiusX = _ref4.x,
radiusY = _ref4.y;
return this.filter(function (_ref5) {
var movementXTotal = _ref5.movementXTotal,
movementYTotal = _ref5.movementYTotal;
return (0, _support.epsilon)(radiusX, radiusY, movementXTotal, movementYTotal);
});
}
}, {
key: 'normalize',
value: function normalize(origin) {
var Gestures_ = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : this.constructor;
var scheduler = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : _animationFrame.animationFrame;
return this.lift(new _operators.NormalizeOperator(origin, Gestures_, scheduler));
}
}], [{
key: 'startsById',
value: function startsById() {
var target = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : this.topLevelElement;
var inputs = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : 1;
return this.start(target).groupBy(getIdentifier, null, null, getReplaySubject1).take(inputs);
}
}, {
key: 'start',
value: function start() {
var target = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : this.topLevelElement;
return new this(target, mouseEvents.start, touchEvents.start).lift(new _operators.MultitouchOperator());
}
}, {
key: 'move',
value: function move() {
var target = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : this.topLevelElement;
return new this(target, mouseEvents.move, touchEvents.move).lift(new _operators.MultitouchOperator());
}
}, {
key: 'end',
value: function end() {
var target = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : this.topLevelElement;
return new this(target, mouseEvents.end, touchEvents.end).lift(new _operators.MultitouchOperator());
}
}, {
key: 'cancel',
value: function cancel() {
var target = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : this.topLevelElement;
return new this(target, mouseEvents.cancel, touchEvents.cancel).lift(new _operators.MultitouchOperator());
}
}, {
key: 'wheel',
value: function wheel() {
var target = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : this.topLevelElement;
return new this(target, mouseEvents.wheel).lift(new _operators.MultitouchOperator());
}
}, {
key: 'tap',
value: function tap() {
var starts = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : this.topLevelElement;
var ends = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {};
var _this3 = this;
var cancels = arguments[2];
var options = arguments.length > 3 && arguments[3] !== undefined ? arguments[3] : {};
var _ref6 = arguments.length <= 2 ? ends : options,
_ref6$inputs = _ref6.inputs,
inputs = _ref6$inputs === undefined ? 1 : _ref6$inputs,
_ref6$timeout = _ref6.timeout,
timeout = _ref6$timeout === undefined ? 250 : _ref6$timeout,
_ref6$radius = _ref6.radius,
radius = _ref6$radius === undefined ? { x: 10, y: 10 } : _ref6$radius;
if (arguments.length <= 2) {
return this.startsById(starts, inputs).lift(new _operators.TapOperator(timeout, radius, this));
}
ends = ends instanceof this && ends || new this(ends);
starts = starts instanceof this && starts || new this(starts);
return starts.preventDefault().normalize(null, this).mergeMap(function (start) {
return ends.preventDefault().normalize(start, _this3).inside(radius).timeoutWith(timeout, _Observable2.Observable.empty());
}).takeUntil(cancels).take(1);
}
}, {
key: 'press',
value: function press() {
var starts = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : this.topLevelElement;
var moves = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {};
var ends = arguments[2];
var _this4 = this;
var cancels = arguments[3];
var options = arguments.length > 4 && arguments[4] !== undefined ? arguments[4] : {};
var _ref7 = arguments.length <= 2 ? moves : options,
_ref7$inputs = _ref7.inputs,
inputs = _ref7$inputs === undefined ? 1 : _ref7$inputs,
_ref7$delay = _ref7.delay,
delay = _ref7$delay === undefined ? 0 : _ref7$delay,
_ref7$radius = _ref7.radius,
radius = _ref7$radius === undefined ? { x: 10, y: 10 } : _ref7$radius;
if (arguments.length <= 2) {
return this.startsById(starts, inputs).lift(new _operators.PressOperator(delay, radius, this));
}
starts = starts instanceof this && starts || new this(starts);
if (delay <= 0) {
return starts.normalize(null, this).take(1);
}
moves = moves instanceof this && moves || new this(moves);
return starts.preventDefault().normalize(null, this).mergeMap(function (start) {
return _Observable2.Observable.timer(delay).withLatestFrom(moves.normalize(start, _this4).startWith(start), function (i, move) {
return move;
}).takeUntil(ends.merge(cancels).merge(moves.normalize(start, _this4).outside(radius)));
}).take(1);
}
}, {
key: 'pan',
value: function pan() {
var starts = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : this.topLevelElement;
var moves = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {};
var ends = arguments[2];
var _this5 = this;
var cancels = arguments[3];
var options = arguments.length > 4 && arguments[4] !== undefined ? arguments[4] : {};
var _ref8 = arguments.length <= 2 ? moves : options,
_ref8$inputs = _ref8.inputs,
inputs = _ref8$inputs === undefined ? 1 : _ref8$inputs,
_ref8$delay = _ref8.delay,
delay = _ref8$delay === undefined ? 0 : _ref8$delay,
_ref8$radius = _ref8.radius,
radius = _ref8$radius === undefined ? { x: 10, y: 10 } : _ref8$radius;
if (arguments.length <= 2) {
return this.startsById(starts, inputs).lift(new _operators.PanOperator(delay, radius, this));
}
ends = ends instanceof this && ends || new this(ends);
moves = moves instanceof this && moves || new this(moves);
starts = starts instanceof this && starts || new this(starts);
return starts.preventDefault().mergeMap(function (start) {
return moves.normalize(start, _this5).startWith(start);
}).takeUntil(ends.merge(cancels));
}
}]);
return Gestures;
}(_Observable2.Observable);
Gestures.topLevelElement = getTopLevelElement();
exports.Gestures = Gestures = wrapStaticObservableMethods(_Observable2.Observable, Gestures);
exports.Gestures = Gestures;
exports.default = Gestures;
function wrapStaticObservableMethods(Observable, Gestures) {
function createStaticWrapper(staticMethodName) {
return function () {
return new Gestures(Observable[staticMethodName].apply(Observable, arguments));
};
}
for (var staticMethodName in Observable) {
Gestures[staticMethodName] = createStaticWrapper(staticMethodName);
}
Gestures.bindCallback = function () {
for (var _len2 = arguments.length, args = Array(_len2), _key2 = 0; _key2 < _len2; _key2++) {
args[_key2] = arguments[_key2];
}
return function () {
return new Gestures(Observable.bindCallback.apply(Observable, args).apply(undefined, arguments));
};
};
Gestures.bindNodeCallback = function () {
for (var _len3 = arguments.length, args = Array(_len3), _key3 = 0; _key3 < _len3; _key3++) {
args[_key3] = arguments[_key3];
}
return function () {
return new Gestures(Observable.bindNodeCallback.apply(Observable, args).apply(undefined, arguments));
};
};
return Gestures;
}
//# sourceMappingURL=Gestures.js.map