{"version":3,"file":"moving.mjs","sources":["../../../../../../../packages/components/captcha/src/hooks/moving.ts"],"sourcesContent":["import { computed, isRef, ref } from 'vue'\n\nimport { throttle } from './performance'\nimport { useListener } from './listener'\n\nimport type { Ref } from 'vue'\n\nexport interface MovingState {\n  xStart: number\n  yStart: number\n  xEnd: number\n  yEnd: number\n  clientX: number\n  clientY: number\n  deltaX: number\n  deltaY: number\n  lazy: boolean\n  [custom: string]: unknown\n}\n\nexport interface UseMovingOptions {\n  /**\n   * 作用的目标元素的 Ref\n   */\n  target?: Ref<HTMLElement | null | undefined>\n  /**\n   * 横向位置的初始值\n   */\n  x?: number\n  /**\n   * 纵向位置的初始值\n   */\n  y?: number\n  /**\n   * 为否为懒加载，开启后会在 End 事件再更新位置状态\n   */\n  lazy?: boolean\n  /**\n   * 事件的 capture 选项\n   *\n   * @default true\n   */\n  capture?: boolean\n  /**\n   * 是否阻止 MouseDown 事件冒泡和默认行为\n   *\n   * @default true\n   */\n  stopMouse?: boolean\n  /**\n   * 是否阻止 TouchStart 事件冒泡和默认行为\n   *\n   * @default true\n   */\n  stopTouch?: boolean\n  /**\n   * 移动开始时的回调函数，返回 false 可以阻止本次移动\n   */\n  onStart?: (state: MovingState, event: PointerEvent) => any\n  /**\n   * 移动中的回调函数\n   */\n  onMove?: (state: MovingState, event: PointerEvent) => void\n  /**\n   * 移动结束时的回调函数\n   */\n  onEnd?: (state: MovingState, event: PointerEvent) => void\n}\n\nfunction disableEvent<E extends Event>(event: E) {\n  if (event.cancelable) {\n    event.stopPropagation()\n    event.preventDefault()\n  }\n}\n\nexport function useMoving(options: UseMovingOptions) {\n  const target = options.target || ref(null)\n  const x = isRef(options.x) ? options.x : ref(0)\n  const y = isRef(options.y) ? options.y : ref(0)\n  const lazy = isRef(options.lazy) ? options.lazy : ref(false)\n\n  const { capture = true, stopMouse = true, stopTouch = true } = options\n\n  const moving = ref(false)\n  const internalState: MovingState = {\n    xStart: 0,\n    yStart: 0,\n    xEnd: 0,\n    yEnd: 0,\n    clientX: 0,\n    clientY: 0,\n    deltaX: 0,\n    deltaY: 0,\n    lazy: false,\n  }\n\n  let current = 0\n  let record = 0\n\n  const throttleMove = throttle((event: PointerEvent) => {\n    if (record < current) return\n\n    updateState(event)\n\n    if (!internalState.lazy) {\n      x.value = internalState.xEnd\n      y.value = internalState.yEnd\n    }\n\n    options.onMove?.(internalState, event)\n  })\n\n  function start(event: PointerEvent) {\n    Object.assign(internalState, {\n      xStart: x.value,\n      yStart: y.value,\n      xEnd: x.value,\n      yEnd: y.value,\n      clientX: event.clientX,\n      clientY: event.clientY,\n      lazy: lazy.value,\n    })\n\n    if (options.onStart?.(internalState, event) === false) {\n      return\n    }\n\n    document.addEventListener('pointermove', move, { capture })\n    document.addEventListener('pointerup', end, { capture })\n\n    record = current\n    moving.value = true\n  }\n\n  function move(event: PointerEvent) {\n    disableEvent(event)\n    throttleMove(event)\n  }\n\n  function end(event: PointerEvent) {\n    document.removeEventListener('pointermove', move, { capture })\n    document.removeEventListener('pointerup', end, { capture })\n\n    updateState(event)\n\n    if (internalState.lazy) {\n      x.value = internalState.xEnd\n      y.value = internalState.yEnd\n    }\n\n    moving.value = false\n    ++current\n\n    options.onEnd?.(internalState, event)\n  }\n\n  function updateState(event: PointerEvent) {\n    const { clientX, clientY } = event\n    const {\n      xStart,\n      yStart,\n      clientX: clientXStart,\n      clientY: clientYStart,\n    } = internalState\n    const deltaX = clientX - clientXStart\n    const deltaY = clientY - clientYStart\n\n    internalState.deltaX = deltaX\n    internalState.deltaY = deltaY\n    internalState.xEnd = xStart + deltaX\n    internalState.yEnd = yStart + deltaY\n  }\n\n  useListener(target, 'pointerdown', start, { capture })\n\n  stopMouse && useListener(target, 'mousedown', disableEvent, { capture })\n  stopTouch && useListener(target, 'touchstart', disableEvent, { capture })\n\n  return {\n    target,\n    moving: computed(() => moving.value),\n    x,\n    y,\n    lazy,\n  }\n}\n"],"names":[],"mappings":"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"}