@ecwenze1/vue-datepicker
Version:
A clean datepicker made with VueJs
110 lines (88 loc) • 3.02 kB
JavaScript
/* eslint-disable no-underscore-dangle */
const handleGesture = (wrapper) => {
const { touchstartX, touchendX, touchstartY, touchendY } = wrapper;
const dirRatio = 0.5;
const minDistance = 16;
wrapper.offsetX = touchendX - touchstartX;
wrapper.offsetY = touchendY - touchstartY;
if (Math.abs(wrapper.offsetY) < dirRatio * Math.abs(wrapper.offsetX)) {
wrapper.left && (touchendX < touchstartX - minDistance) && wrapper.left(wrapper);
wrapper.right && (touchendX > touchstartX + minDistance) && wrapper.right(wrapper);
}
if (Math.abs(wrapper.offsetX) < dirRatio * Math.abs(wrapper.offsetY)) {
wrapper.up && (touchendY < touchstartY - minDistance) && wrapper.up(wrapper);
wrapper.down && (touchendY > touchstartY + minDistance) && wrapper.down(wrapper);
}
};
function touchstart (event, wrapper) {
const touch = event.changedTouches[0];
wrapper.touchstartX = touch.clientX;
wrapper.touchstartY = touch.clientY;
wrapper.start &&
wrapper.start(Object.assign(event, wrapper));
}
function touchend (event, wrapper) {
const touch = event.changedTouches[0];
wrapper.touchendX = touch.clientX;
wrapper.touchendY = touch.clientY;
wrapper.end &&
wrapper.end(Object.assign(event, wrapper));
handleGesture(wrapper);
}
function touchmove (event, wrapper) {
const touch = event.changedTouches[0];
wrapper.touchmoveX = touch.clientX;
wrapper.touchmoveY = touch.clientY;
wrapper.move && wrapper.move(Object.assign(event, wrapper));
}
function createHandlers (value) {
const wrapper = {
touchstartX: 0,
touchstartY: 0,
touchendX: 0,
touchendY: 0,
touchmoveX: 0,
touchmoveY: 0,
offsetX: 0,
offsetY: 0,
left: value.left,
right: value.right,
up: value.up,
down: value.down,
start: value.start,
move: value.move,
end: value.end,
};
return {
touchstart: (event) => touchstart(event, wrapper),
touchend: (event) => touchend(event, wrapper),
touchmove: (event) => touchmove(event, wrapper),
};
}
function inserted (el, binding, vnode) {
const value = binding.value;
const target = value.parent ? el.parentElement : el;
const options = value.options || { passive: true };
// Needed to pass unit tests
if (!target) return;
const handlers = createHandlers(binding.value);
target._touchHandlers = Object(target._touchHandlers);
target._touchHandlers[vnode.context._uid] = handlers;
Object.keys(handlers).forEach(eventName => {
target.addEventListener(eventName, handlers[eventName], options);
});
}
function unbind (el, binding, vnode) {
const target = binding.value.parent ? el.parentElement : el;
if (!target || !target._touchHandlers) return;
const handlers = target._touchHandlers[vnode.context._uid];
Object.keys(handlers).forEach(eventName => {
target.removeEventListener(eventName, handlers[eventName]);
});
delete target._touchHandlers[vnode.context._uid];
}
export const Touch = {
inserted,
unbind,
};
export default Touch;