@platform/react
Version:
React refs and helpers.
126 lines (125 loc) • 4.34 kB
JavaScript
;
Object.defineProperty(exports, "__esModule", { value: true });
exports.offsetPosition = exports.position = exports.DragPositionEvent = void 0;
var rxjs_1 = require("rxjs");
var operators_1 = require("rxjs/operators");
var events_1 = require("../events");
var EMPTY = { x: -1, y: -1 };
var DragPositionEvent = (function () {
function DragPositionEvent(options) {
var type = options.type, el = options.el, event = options.event, start = options.start;
this.type = type;
this.el = el;
this.event = event;
this.start = start;
}
Object.defineProperty(DragPositionEvent.prototype, "client", {
get: function () {
var _a = this.event, x = _a.clientX, y = _a.clientY;
return { x: x, y: y };
},
enumerable: false,
configurable: true
});
Object.defineProperty(DragPositionEvent.prototype, "screen", {
get: function () {
var _a = this.event, x = _a.screenX, y = _a.screenY;
return { x: x, y: y };
},
enumerable: false,
configurable: true
});
Object.defineProperty(DragPositionEvent.prototype, "delta", {
get: function () {
var start = this.start || EMPTY;
var _a = this.event, screenX = _a.screenX, screenY = _a.screenY;
var x = screenX - start.x;
var y = screenY - start.y;
return { x: x, y: y };
},
enumerable: false,
configurable: true
});
Object.defineProperty(DragPositionEvent.prototype, "element", {
get: function () {
var position = (0, exports.offsetPosition)(this.el);
var _a = this.event, clientX = _a.clientX, clientY = _a.clientY;
return { x: clientX - position.left, y: clientY - position.top };
},
enumerable: false,
configurable: true
});
DragPositionEvent.prototype.toObject = function () {
return {
type: this.type,
client: this.client,
screen: this.screen,
element: this.element,
delta: this.delta,
start: this.start,
};
};
DragPositionEvent.prototype.clone = function (type) {
return new DragPositionEvent({
type: type,
el: this.el,
event: this.event,
start: this.start,
});
};
return DragPositionEvent;
}());
exports.DragPositionEvent = DragPositionEvent;
var position = function (options) {
var dispose$ = new rxjs_1.Subject();
var events$ = new rxjs_1.Subject();
var mouseUp$ = events_1.events.mouseUp$.pipe((0, operators_1.takeUntil)(dispose$));
var el = options.el;
var start;
var prev;
var move$ = events_1.events.mouseMove$.pipe((0, operators_1.takeUntil)(dispose$), (0, operators_1.map)(function (e) {
if (!start) {
start = { x: e.screenX, y: e.screenY };
}
prev = new DragPositionEvent({
type: 'DRAG',
el: el,
event: e,
start: start,
});
return prev;
}), (0, operators_1.takeUntil)(mouseUp$));
move$.subscribe(function (e) { return events$.next(e); });
mouseUp$.subscribe(function (e) {
var arg = prev
? prev.clone('COMPLETE')
: new DragPositionEvent({
type: 'COMPLETE',
el: el,
event: e,
start: start,
});
events$.next(arg);
api.dispose();
});
var api = {
isComplete: false,
events$: events$.pipe((0, operators_1.share)()),
dispose$: dispose$.pipe((0, operators_1.share)()),
dispose: function () {
dispose$.next();
dispose$.complete();
api.isComplete = true;
},
};
return api;
};
exports.position = position;
var offsetPosition = function (el) {
var rect = el.getBoundingClientRect();
var doc = document.documentElement ? document.documentElement : undefined;
var scrollLeft = window.pageXOffset || (doc ? doc.scrollLeft : 0);
var scrollTop = window.pageYOffset || (doc ? doc.scrollTop : 0);
return { top: rect.top + scrollTop, left: rect.left + scrollLeft };
};
exports.offsetPosition = offsetPosition;