{"version":3,"file":"useSwipe.mjs","sources":["../../src/swipe-cell/useSwipe.ts"],"sourcesContent":["/* eslint-disable no-undef */\n\nimport type { ComputedRef, Ref, MaybeRef } from 'vue';\nimport { computed, reactive, ref } from 'vue';\nimport { useEventListener } from '@vueuse/core';\nimport { isObject } from 'lodash-es';\nimport { preventDefault } from '../shared/dom';\nimport { isBrowser } from '../shared';\n\nconst noop = () => {};\n\ntype Position = {\n  x: number;\n  y: number;\n};\n\nexport type UseSwipeDirection = 'up' | 'down' | 'left' | 'right' | 'none';\n\nexport interface UseSwipeOptions {\n  /**\n   * @default 50\n   */\n  threshold?: number;\n\n  /**\n   * Listener options\n   */\n  listenerOptions?: boolean | { passive?: boolean; capture?: boolean };\n\n  /**\n   * Callback on swipe start\n   */\n  onSwipeStart?: (e: TouchEvent) => void;\n\n  /**\n   * Callback on swipe moves\n   */\n  onSwipe?: (e: TouchEvent) => void;\n\n  /**\n   * Callback on swipe ends\n   */\n  onSwipeEnd?: (e: TouchEvent, direction: UseSwipeDirection) => void;\n}\n\nexport interface UseSwipeReturn {\n  isPassiveEventSupported: boolean;\n  isSwiping: Ref<boolean>;\n  direction: ComputedRef<UseSwipeDirection>;\n  coordsStart: Readonly<Position>;\n  coordsEnd: Readonly<Position>;\n  lengthX: ComputedRef<number>;\n  lengthY: ComputedRef<number>;\n  stop: () => void;\n}\n\n/**\n * Reactive swipe detection.\n *\n * @param target\n * @param options\n */\nexport function useSwipe(\n  target: MaybeRef<EventTarget | null | undefined>,\n  options = {} as UseSwipeOptions,\n): UseSwipeReturn {\n  const { threshold = 50, onSwipe, onSwipeEnd, onSwipeStart, listenerOptions = false } = options;\n\n  const coordsStart = reactive<Position>({ x: 0, y: 0 });\n  const coordsEnd = reactive<Position>({ x: 0, y: 0 });\n\n  const diffX = computed(() => coordsStart.x - coordsEnd.x);\n  const diffY = computed(() => coordsStart.y - coordsEnd.y);\n\n  const { max, abs } = Math;\n  const isThresholdExceeded = computed(() => max(abs(diffX.value), abs(diffY.value)) >= threshold);\n\n  const isSwiping = ref(false);\n\n  const direction = computed((): UseSwipeDirection => {\n    if (!isThresholdExceeded.value) return 'none';\n\n    if (abs(diffX.value) > abs(diffY.value)) {\n      return diffX.value > 0 ? 'left' : 'right';\n    }\n\n    return diffY.value > 0 ? 'up' : 'down';\n  });\n\n  const getTouchEventCoords = (e: TouchEvent) => [e.touches[0].clientX, e.touches[0].clientY];\n\n  const updateCoordsStart = (x: number, y: number) => {\n    coordsStart.x = x;\n    coordsStart.y = y;\n  };\n\n  const updateCoordsEnd = (x: number, y: number) => {\n    coordsEnd.x = x;\n    coordsEnd.y = y;\n  };\n\n  const isPassiveEventSupported = checkPassiveEventSupport();\n\n  const onTouchEnd = (e: TouchEvent) => {\n    if (isSwiping.value) onSwipeEnd?.(e, direction.value);\n\n    isSwiping.value = false;\n  };\n\n  const stops = [\n    useEventListener(\n      target,\n      'touchstart',\n      (e: TouchEvent) => {\n        if (e.touches.length !== 1) return;\n        if (\n          listenerOptions === true ||\n          (isObject(listenerOptions) && listenerOptions.capture && !listenerOptions.passive)\n        )\n          preventDefault(e, false);\n        const [x, y] = getTouchEventCoords(e);\n        updateCoordsStart(x, y);\n        updateCoordsEnd(x, y);\n        onSwipeStart?.(e);\n      },\n      listenerOptions,\n    ),\n\n    useEventListener(\n      target,\n      'touchmove',\n      (e: TouchEvent) => {\n        if (e.touches.length !== 1) return;\n        const [x, y] = getTouchEventCoords(e);\n        updateCoordsEnd(x, y);\n        if (!isSwiping.value && isThresholdExceeded.value) isSwiping.value = true;\n        if (isSwiping.value) onSwipe?.(e);\n      },\n      listenerOptions,\n    ),\n\n    useEventListener(target, 'touchend', onTouchEnd, listenerOptions),\n    useEventListener(target, 'touchcancel', onTouchEnd, listenerOptions),\n  ];\n\n  const stop = () => stops.forEach((s) => s());\n\n  return {\n    isPassiveEventSupported,\n    isSwiping,\n    direction,\n    coordsStart,\n    coordsEnd,\n    lengthX: diffX,\n    lengthY: diffY,\n    stop,\n  };\n}\n\n/**\n * This is a polyfill for passive event support detection\n * @see https://github.com/WICG/EventListenerOptions/blob/gh-pages/explainer.md\n */\nfunction checkPassiveEventSupport(document = isBrowser ? window.document : undefined) {\n  if (!document) return false;\n  let supportsPassive = false;\n  const optionsBlock: AddEventListenerOptions = {\n    get passive() {\n      supportsPassive = true;\n      return false;\n    },\n  };\n  document.addEventListener('x', noop, optionsBlock);\n  document.removeEventListener('x', noop);\n  return supportsPassive;\n}\n"],"names":["noop","useSwipe","target","options","arguments","length","undefined","_options$threshold","threshold","onSwipe","onSwipeEnd","onSwipeStart","_options$listenerOpti","listenerOptions","coordsStart","reactive","x","y","coordsEnd","diffX","computed","diffY","max","Math","abs","isThresholdExceeded","value","isSwiping","ref","direction","getTouchEventCoords","e","touches","clientX","clientY","updateCoordsStart","updateCoordsEnd","isPassiveEventSupported","checkPassiveEventSupport","onTouchEnd","stops","useEventListener","isObject","capture","passive","preventDefault","_getTouchEventCoords","_getTouchEventCoords2","_slicedToArray","_getTouchEventCoords3","_getTouchEventCoords4","stop","forEach","s","lengthX","lengthY","document","isBrowser","window","supportsPassive","optionsBlock","addEventListener","removeEventListener"],"mappings":"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"}