{"version":3,"file":"useTouchMove.mjs","sources":["../../../../../../../packages/components/tabs/src/hooks/useTouchMove.ts"],"sourcesContent":["import type { Ref } from 'vue';\nimport { useState } from '@antdv/hooks';\nimport { onBeforeUnmount, onMounted, ref } from 'vue';\n\ntype TouchEventHandler = (e: TouchEvent) => void;\ntype WheelEventHandler = (e: WheelEvent) => void;\n\nconst MIN_SWIPE_DISTANCE = 0.1;\nconst STOP_SWIPE_DISTANCE = 0.01;\nconst REFRESH_INTERVAL = 20;\nconst SPEED_OFF_MULTIPLE = 0.995 ** REFRESH_INTERVAL;\n// ================================= Hook =================================\nexport default function useTouchMove(\n  domRef: Ref<HTMLDivElement>,\n  onOffset: (offsetX: number, offsetY: number) => boolean,\n) {\n  const [touchPosition, setTouchPosition] = useState<{ x: number, y: number }>();\n  const [lastTimestamp, setLastTimestamp] = useState<number>(0);\n  const [lastTimeDiff, setLastTimeDiff] = useState<number>(0);\n  const [lastOffset, setLastOffset] = useState<{ x: number, y: number }>();\n  const motionInterval = ref<any>();\n\n  // ========================= Events =========================\n  // >>> Touch events\n  function onTouchStart(e: TouchEvent) {\n    const { screenX, screenY } = e.touches[0];\n    setTouchPosition({ x: screenX, y: screenY });\n    clearInterval(motionInterval.value);\n  }\n\n  function onTouchMove(e: TouchEvent) {\n    if (!touchPosition.value) return;\n\n    e.preventDefault();\n    const { screenX, screenY } = e.touches[0];\n    const offsetX = screenX - touchPosition.value.x;\n    const offsetY = screenY - touchPosition.value.y;\n    onOffset(offsetX, offsetY);\n    setTouchPosition({ x: screenX, y: screenY });\n    const now = Date.now();\n    setLastTimeDiff(now - lastTimestamp.value);\n    setLastTimestamp(now);\n    setLastOffset({ x: offsetX, y: offsetY });\n  }\n\n  function onTouchEnd() {\n    if (!touchPosition.value) return;\n    const lastOffsetValue = lastOffset.value;\n    setTouchPosition(null);\n    setLastOffset(null);\n\n    // Swipe if needed\n    if (lastOffsetValue) {\n      const distanceX = lastOffsetValue.x / lastTimeDiff.value;\n      const distanceY = lastOffsetValue.y / lastTimeDiff.value;\n      const absX = Math.abs(distanceX);\n      const absY = Math.abs(distanceY);\n\n      // Skip swipe if low distance\n      if (Math.max(absX, absY) < MIN_SWIPE_DISTANCE) return;\n\n      let currentX = distanceX;\n      let currentY = distanceY;\n\n      motionInterval.value = setInterval(() => {\n        if (Math.abs(currentX) < STOP_SWIPE_DISTANCE && Math.abs(currentY) < STOP_SWIPE_DISTANCE) {\n          clearInterval(motionInterval.value);\n          return;\n        }\n\n        currentX *= SPEED_OFF_MULTIPLE;\n        currentY *= SPEED_OFF_MULTIPLE;\n        onOffset(currentX * REFRESH_INTERVAL, currentY * REFRESH_INTERVAL);\n      }, REFRESH_INTERVAL);\n    }\n  }\n\n  // >>> Wheel event\n  const lastWheelDirectionRef = ref<'x' | 'y'>();\n\n  function onWheel(e: WheelEvent) {\n    const { deltaX, deltaY } = e;\n\n    // Convert both to x & y since wheel only happened on PC\n    let mixed = 0;\n    const absX = Math.abs(deltaX);\n    const absY = Math.abs(deltaY);\n    if (absX === absY) {\n      mixed = lastWheelDirectionRef.value === 'x' ? deltaX : deltaY;\n    } else if (absX > absY) {\n      mixed = deltaX;\n      lastWheelDirectionRef.value = 'x';\n    } else {\n      mixed = deltaY;\n      lastWheelDirectionRef.value = 'y';\n    }\n\n    if (onOffset(-mixed, -mixed))\n      e.preventDefault();\n  }\n\n  // ========================= Effect =========================\n  const touchEventsRef = ref<{\n    onTouchStart: TouchEventHandler\n    onTouchMove: TouchEventHandler\n    onTouchEnd: TouchEventHandler\n    onWheel: WheelEventHandler\n  }>({\n    onTouchStart,\n    onTouchMove,\n    onTouchEnd,\n    onWheel,\n  });\n  function onProxyTouchStart(e: TouchEvent) {\n    touchEventsRef.value.onTouchStart(e);\n  }\n  function onProxyTouchMove(e: TouchEvent) {\n    touchEventsRef.value.onTouchMove(e);\n  }\n  function onProxyTouchEnd(e: TouchEvent) {\n    touchEventsRef.value.onTouchEnd(e);\n  }\n  function onProxyWheel(e: WheelEvent) {\n    touchEventsRef.value.onWheel(e);\n  }\n  onMounted(() => {\n    document.addEventListener('touchmove', onProxyTouchMove, { passive: false });\n    document.addEventListener('touchend', onProxyTouchEnd, { passive: false });\n\n    // No need to clean up since element removed\n    domRef.value?.addEventListener('touchstart', onProxyTouchStart, { passive: false });\n    domRef.value?.addEventListener('wheel', onProxyWheel, { passive: false });\n  });\n\n  onBeforeUnmount(() => {\n    document.removeEventListener('touchmove', onProxyTouchMove);\n    document.removeEventListener('touchend', onProxyTouchEnd);\n  });\n}\n"],"names":[],"mappings":"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"}