app-datepicker-rtl
Version:
A custom datepicker element based on Google's Material Design built from scratch with lit-element. Fork of app-datepicker by motts.
79 lines (78 loc) • 3.15 kB
JavaScript
import { supportsPassiveEventListener } from '@material/mwc-base/utils.js';
function toPointer(ev) {
const { clientX, clientY, pageX, pageY } = ev;
const x = Math.max(pageX, clientX);
const y = Math.max(pageY, clientY);
const id = ev.identifier || ev.pointerId;
return { x, y, id: id == null ? 0 : id };
}
function getFirstTouch(startPointer, ev) {
const changedTouches = ev.changedTouches;
if (changedTouches == null)
return { newPointer: toPointer(ev), oldPointer: startPointer };
const touches = Array.from(changedTouches, n => toPointer(n));
const newPointer = startPointer == null
? touches[0]
: touches.find(n => n.id === startPointer.id);
return { newPointer, oldPointer: startPointer };
}
function addPassiveEventListener(node, event, callback) {
node.addEventListener(event, callback, supportsPassiveEventListener ? { passive: true } : false);
}
export class Tracker {
constructor(_element, handlers) {
this._element = _element;
this._startPointer = null;
const { down, move, up } = handlers;
this._down = this._onDown(down);
this._move = this._onMove(move);
this._up = this._onUp(up);
if (_element && _element.addEventListener) {
_element.addEventListener('mousedown', this._down);
addPassiveEventListener(_element, 'touchstart', this._down);
addPassiveEventListener(_element, 'touchmove', this._move);
addPassiveEventListener(_element, 'touchend', this._up);
}
}
disconnect() {
const rootEl = this._element;
if (rootEl && rootEl.removeEventListener) {
rootEl.removeEventListener('mousedown', this._down);
rootEl.removeEventListener('touchstart', this._down);
rootEl.removeEventListener('touchmove', this._move);
rootEl.removeEventListener('touchend', this._up);
}
}
_onDown(down) {
return (ev) => {
if (ev instanceof MouseEvent) {
this._element.addEventListener('mousemove', this._move);
this._element.addEventListener('mouseup', this._up);
this._element.addEventListener('mouseleave', this._up);
}
const { newPointer } = getFirstTouch(this._startPointer, ev);
down(newPointer, ev);
this._startPointer = newPointer;
};
}
_onMove(move) {
return (ev) => {
this._updatePointers(move, ev);
};
}
_onUp(up) {
return (ev) => {
this._updatePointers(up, ev, true);
};
}
_updatePointers(cb, ev, shouldReset) {
if (shouldReset && ev instanceof MouseEvent) {
this._element.removeEventListener('mousemove', this._move);
this._element.removeEventListener('mouseup', this._up);
this._element.removeEventListener('mouseleave', this._up);
}
const { newPointer, oldPointer } = getFirstTouch(this._startPointer, ev);
cb(newPointer, oldPointer, ev);
this._startPointer = shouldReset ? null : newPointer;
}
}