{"version":3,"sources":["../../src/directives/touch.ts"],"names":[],"mappings":"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","sourcesContent":["import { VNodeDirective, VNode } from 'vue/types/vnode'\nimport { keys } from '../util/helpers'\n\nexport interface TouchStoredHandlers {\n  touchstart: (e: TouchEvent) => void\n  touchend: (e: TouchEvent) => void\n  touchmove: (e: TouchEvent) => void\n}\n\ninterface TouchHandlers {\n  start?: (wrapperEvent: TouchEvent & TouchWrapper) => void\n  end?: (wrapperEvent: TouchEvent & TouchWrapper) => void\n  move?: (wrapperEvent: TouchEvent & TouchWrapper) => void\n  left?: (wrapper: TouchWrapper) => void\n  right?: (wrapper: TouchWrapper) => void\n  up?: (wrapper: TouchWrapper) => void\n  down?: (wrapper: TouchWrapper) => void\n}\n\nexport interface TouchWrapper extends TouchHandlers {\n  touchstartX: number\n  touchstartY: number\n  touchmoveX: number\n  touchmoveY: number\n  touchendX: number\n  touchendY: number\n  offsetX: number\n  offsetY: number\n}\n\ninterface TouchVNodeDirective extends VNodeDirective {\n  value?: TouchHandlers & {\n    parent?: boolean\n    options?: AddEventListenerOptions\n  }\n}\n\nconst handleGesture = (wrapper: TouchWrapper) => {\n  const { touchstartX, touchendX, touchstartY, touchendY } = wrapper\n  const dirRatio = 0.5\n  const minDistance = 16\n  wrapper.offsetX = touchendX - touchstartX\n  wrapper.offsetY = touchendY - touchstartY\n\n  if (Math.abs(wrapper.offsetY) < dirRatio * Math.abs(wrapper.offsetX)) {\n    wrapper.left && (touchendX < touchstartX - minDistance) && wrapper.left(wrapper)\n    wrapper.right && (touchendX > touchstartX + minDistance) && wrapper.right(wrapper)\n  }\n\n  if (Math.abs(wrapper.offsetX) < dirRatio * Math.abs(wrapper.offsetY)) {\n    wrapper.up && (touchendY < touchstartY - minDistance) && wrapper.up(wrapper)\n    wrapper.down && (touchendY > touchstartY + minDistance) && wrapper.down(wrapper)\n  }\n}\n\nfunction touchstart (event: TouchEvent, wrapper: TouchWrapper) {\n  const touch = event.changedTouches[0]\n  wrapper.touchstartX = touch.clientX\n  wrapper.touchstartY = touch.clientY\n\n  wrapper.start &&\n    wrapper.start(Object.assign(event, wrapper))\n}\n\nfunction touchend (event: TouchEvent, wrapper: TouchWrapper) {\n  const touch = event.changedTouches[0]\n  wrapper.touchendX = touch.clientX\n  wrapper.touchendY = touch.clientY\n\n  wrapper.end &&\n    wrapper.end(Object.assign(event, wrapper))\n\n  handleGesture(wrapper)\n}\n\nfunction touchmove (event: TouchEvent, wrapper: TouchWrapper) {\n  const touch = event.changedTouches[0]\n  wrapper.touchmoveX = touch.clientX\n  wrapper.touchmoveY = touch.clientY\n\n  wrapper.move && wrapper.move(Object.assign(event, wrapper))\n}\n\nfunction createHandlers (value: TouchHandlers): TouchStoredHandlers {\n  const wrapper = {\n    touchstartX: 0,\n    touchstartY: 0,\n    touchendX: 0,\n    touchendY: 0,\n    touchmoveX: 0,\n    touchmoveY: 0,\n    offsetX: 0,\n    offsetY: 0,\n    left: value.left,\n    right: value.right,\n    up: value.up,\n    down: value.down,\n    start: value.start,\n    move: value.move,\n    end: value.end\n  }\n\n  return {\n    touchstart: (e: TouchEvent) => touchstart(e, wrapper),\n    touchend: (e: TouchEvent) => touchend(e, wrapper),\n    touchmove: (e: TouchEvent) => touchmove(e, wrapper)\n  }\n}\n\nfunction inserted (el: HTMLElement, binding: TouchVNodeDirective, vnode: VNode) {\n  const value = binding.value!\n  const target = value.parent ? el.parentElement : el\n  const options = value.options || { passive: true }\n\n  // Needed to pass unit tests\n  if (!target) return\n\n  const handlers = createHandlers(binding.value!)\n  target._touchHandlers = Object(target._touchHandlers)\n  target._touchHandlers![vnode.context!._uid] = handlers\n\n  keys(handlers).forEach(eventName => {\n    target.addEventListener(eventName, handlers[eventName] as EventListener, options)\n  })\n}\n\nfunction unbind (el: HTMLElement, binding: TouchVNodeDirective, vnode: VNode) {\n  const target = binding.value!.parent ? el.parentElement : el\n  if (!target || !target._touchHandlers) return\n\n  const handlers = target._touchHandlers[vnode.context!._uid]\n  keys(handlers).forEach(eventName => {\n    target.removeEventListener(eventName, handlers[eventName])\n  })\n  delete target._touchHandlers[vnode.context!._uid]\n}\n\nexport default {\n  inserted,\n  unbind\n}\n"],"sourceRoot":""}