UNPKG

@ecwenze1/vue-datepicker

Version:

A clean datepicker made with VueJs

110 lines (88 loc) 3.02 kB
/* 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;