{"version":3,"file":"useDrag.mjs","sources":["../../../src/upload/hooks/useDrag.ts"],"sourcesContent":["import { ref, onBeforeUnmount } from 'vue';\nimport type { Ref, ShallowRef, ComputedRef, CSSProperties } from 'vue';\nimport type { TdUploadProps, UploadFile, UploadChangeContext } from '../type';\n\ninterface UploadFileWithUid extends UploadFile {\n  __uid?: string;\n}\n\nlet globalUidCounter = 0;\nconst keySeeds = new Map<string, number>();\n\n// 设置 file 的唯一id\nfunction setDragKey(file: UploadFileWithUid, existing: Set<string>): string {\n  if (file.__uid) return file.__uid;\n\n  const parts = [file.name, file.size, file.lastModified, file.type, file.url].filter(\n    (p) => p !== undefined && p !== null && p !== '',\n  );\n  let base = parts.length > 0 ? `u_${encodeURIComponent(parts.join('|'))}` : `u_${++globalUidCounter}`;\n\n  if (existing.has(base)) {\n    const seed = keySeeds.get(base) ?? 0;\n    let n = seed + 1;\n    while (existing.has(`${base}-${n}`)) n++;\n    keySeeds.set(base, n);\n    base = `${base}-${n}`;\n  }\n\n  file.__uid = base;\n  existing.add(base);\n  return base;\n}\n\nexport interface UseDragReturn {\n  /** 是否处于拖拽中 */\n  dragging: Ref<boolean>;\n  /** 被拖 item 在 sortedFiles 中的当前 index */\n  dragIndex: Ref<number>;\n  /** 拖拽排序用的本地文件数组 */\n  sortedFiles: Ref<UploadFile[]>;\n  /** 浮动 clone 是否可见 */\n  cloneVisible: Ref<boolean>;\n  /** 浮动 clone 的内联样式 */\n  cloneStyle: Ref<CSSProperties>;\n  /** clone 显示的文件内容 */\n  cloneFile: Ref<UploadFile | null>;\n  /** 获取 file 的唯一 key */\n  getDragKey: (file: UploadFileWithUid) => string;\n  /** 同步 sortedFiles 与 displayFiles（非拖拽时调用） */\n  syncFiles: (files: UploadFile[]) => void;\n  /** 触摸开始：启动长按定时器 */\n  onTouchstart: (e: TouchEvent, index: number) => void;\n  /** 触摸移动：更新 clone 位置 + 碰撞检测 */\n  onTouchmove: (e: TouchEvent) => void;\n  /** 触摸结束：归位动画 + 提交排序结果 */\n  onTouchend: (e: TouchEvent) => void;\n  /** 触摸取消：清理状态 */\n  onTouchcancel: (e: TouchEvent) => void;\n  /** 拖拽刚结束 300ms 内为 true，用于屏蔽误触预览 */\n  dragEnded: Ref<boolean>;\n}\n\nexport default function useDrag(\n  props: TdUploadProps,\n  uploadClass: ComputedRef<string>,\n  setUploadValue: (value: UploadFile[], context: UploadChangeContext) => void,\n  toUploadFilesRef?: ShallowRef<UploadFile[]>,\n): UseDragReturn {\n  const dragging = ref(false);\n  const dragIndex = ref(-1);\n  const sortedFiles = ref<UploadFile[]>([]);\n  const cloneVisible = ref(false);\n  const cloneStyle = ref<CSSProperties>({});\n  const cloneFile = ref<UploadFile | null>(null);\n  const dragEnded = ref(false);\n\n  let longPressTimer = 0;\n  let dragEndedTimer = 0;\n  const TIMEOUT_DURATION = 300;\n\n  onBeforeUnmount(() => {\n    clearTimeout(longPressTimer);\n    clearTimeout(dragEndedTimer);\n  });\n\n  const getDragKey = (file: UploadFileWithUid): string => file?.__uid || '';\n\n  const syncFiles = (files: UploadFile[]) => {\n    if (!dragging.value) {\n      const existing = new Set<string>();\n      files.forEach((f) => setDragKey(f as UploadFileWithUid, existing));\n      sortedFiles.value = [...files];\n    }\n  };\n\n  let cachedItemWidth = 0;\n  let cachedItemHeight = 0;\n  let startFingerX = 0;\n  let startFingerY = 0;\n  let hasMoved = false;\n  let longPressTarget: HTMLElement | null = null;\n\n  // 拖拽开始时的布局参数\n  let layout: {\n    containerLeft: number;\n    containerTop: number;\n    columns: number;\n    cellWidth: number;\n    cellHeight: number;\n    // 列表布局：每个 item 的 Y 偏移和高度\n    itemTops: number[];\n    itemHeights: number[];\n  } | null = null;\n\n  // 长按\n  const onTouchstart = (e: TouchEvent, index: number) => {\n    if (!props.draggable || dragging.value) return;\n\n    const touch = e.touches?.[0];\n    if (!touch) return;\n\n    startFingerX = touch.clientX;\n    startFingerY = touch.clientY;\n    hasMoved = false;\n    longPressTarget = e.currentTarget as HTMLElement;\n\n    longPressTimer = window.setTimeout(() => onLongPress(index), TIMEOUT_DURATION);\n  };\n\n  const onLongPress = (index: number) => {\n    const target = longPressTarget;\n    if (!target) return;\n\n    const file = sortedFiles.value[index];\n    if (!file) return;\n\n    const rect = target.getBoundingClientRect();\n    cachedItemWidth = rect.width;\n    cachedItemHeight = rect.height;\n\n    const container = target.closest(`.${uploadClass.value}`);\n    if (container) {\n      const containerRect = container.getBoundingClientRect();\n      const dragItems = container.querySelectorAll('[data-drag-key]');\n\n      if (props.theme === 'list') {\n        // 列表布局：缓存每个 item 的相对 top 和 height\n        const itemTops: number[] = [];\n        const itemHeights: number[] = [];\n        dragItems.forEach((el) => {\n          const r = (el as HTMLElement).getBoundingClientRect();\n          itemTops.push(r.top - containerRect.top);\n          itemHeights.push(r.height);\n        });\n        layout = {\n          containerLeft: containerRect.left,\n          containerTop: containerRect.top,\n          columns: 1,\n          cellWidth: containerRect.width,\n          cellHeight: cachedItemHeight,\n          itemTops,\n          itemHeights,\n        };\n      } else {\n        // 宫格布局：推算列数和 cell 尺寸\n        let columns = 4;\n        let cellWidth = containerRect.width / 4;\n        let cellHeight = cachedItemHeight;\n\n        if (dragItems.length >= 2) {\n          const firstRect = (dragItems[0] as HTMLElement).getBoundingClientRect();\n          for (let i = 1; i < dragItems.length; i++) {\n            const r = (dragItems[i] as HTMLElement).getBoundingClientRect();\n            if (r.top === firstRect.top && r.left > firstRect.left) {\n              cellWidth = r.left - firstRect.left;\n              columns = Math.round(containerRect.width / cellWidth) || 4;\n              break;\n            }\n          }\n          for (let i = columns; i < dragItems.length; i++) {\n            const r = (dragItems[i] as HTMLElement).getBoundingClientRect();\n            if (r.top > firstRect.top) {\n              cellHeight = r.top - firstRect.top;\n              break;\n            }\n          }\n        }\n\n        layout = {\n          containerLeft: containerRect.left,\n          containerTop: containerRect.top,\n          columns,\n          cellWidth,\n          cellHeight,\n          itemTops: [],\n          itemHeights: [],\n        };\n      }\n    }\n\n    dragging.value = true;\n    dragIndex.value = index;\n    cloneVisible.value = true;\n    cloneFile.value = file;\n    hasMoved = false;\n\n    const isList = props.theme === 'list';\n    cloneStyle.value = {\n      position: 'fixed',\n      left: `${rect.left}px`,\n      top: `${rect.top}px`,\n      width: `${rect.width}px`,\n      height: `${rect.height}px`,\n      zIndex: 9999,\n      pointerEvents: 'none',\n      transform: isList ? undefined : 'scale(1.05)',\n      boxShadow: isList ? '0 4px 16px rgba(0, 0, 0, 0.15)' : '0 8px 24px rgba(0, 0, 0, 0.2)',\n      transition: 'transform 0.15s ease, box-shadow 0.15s ease',\n      borderRadius: isList ? undefined : '8px',\n      overflow: 'hidden',\n    };\n\n    props.onDrag?.({ file, index });\n  };\n\n  // 拖拽\n  const onTouchmove = (e: TouchEvent) => {\n    const touch = e.touches?.[0] || e.changedTouches?.[0];\n    if (!touch) return;\n\n    // 指针移动超过 10px 才取消长按定时\n    if (!dragging.value) {\n      const dx = Math.abs(touch.clientX - startFingerX);\n      const dy = Math.abs(touch.clientY - startFingerY);\n      if (dx > 10 || dy > 10) {\n        clearTimeout(longPressTimer);\n        longPressTarget = null;\n      }\n      return;\n    }\n\n    if (e.cancelable) e?.preventDefault();\n\n    hasMoved = true;\n\n    // clone 跟随指针\n    cloneStyle.value = {\n      ...cloneStyle.value,\n      left: `${touch.clientX - cachedItemWidth / 2}px`,\n      top: `${touch.clientY - cachedItemHeight / 2}px`,\n      transition: 'transform 0.15s ease, box-shadow 0.15s ease',\n    };\n\n    // 碰撞检测\n    if (!layout) return;\n    const targetIndex = detectTargetSlot(touch.clientX, touch.clientY);\n    if (targetIndex === -1 || targetIndex === dragIndex.value) return;\n\n    // 重排 sortedFiles\n    const newFiles = [...sortedFiles.value];\n    const [moved] = newFiles.splice(dragIndex.value, 1);\n    newFiles.splice(targetIndex, 0, moved);\n    sortedFiles.value = newFiles.filter(Boolean);\n    dragIndex.value = targetIndex;\n  };\n\n  // 碰撞检测\n  const detectTargetSlot = (fingerX: number, fingerY: number): number => {\n    if (!layout) return -1;\n    const count = sortedFiles.value.length;\n    if (count <= 1) return -1;\n\n    const relX = fingerX - layout.containerLeft;\n    const relY = fingerY - layout.containerTop;\n\n    if (layout.itemTops.length > 0) {\n      return detectListSlot(relY, count);\n    }\n    return detectGridSlot(relX, relY, count);\n  };\n\n  const detectGridSlot = (relX: number, relY: number, count: number): number => {\n    const col = Math.floor(relX / (layout?.cellWidth ?? 1));\n    const row = Math.floor(relY / (layout?.cellHeight ?? 1));\n    const targetIndex = row * (layout?.columns ?? 1) + col;\n    return Math.max(0, Math.min(targetIndex, count - 1));\n  };\n\n  const detectListSlot = (relY: number, count: number): number => {\n    if (!layout || count === 0) return -1;\n\n    const itemH = layout.cellHeight;\n    const gap = layout.itemTops.length > 1 ? layout.itemTops[1] - layout.itemTops[0] - (layout.itemHeights[0] || 0) : 0;\n    const slotSize = itemH + gap;\n    if (slotSize <= 0) return 0;\n\n    const firstItemTop = layout.itemTops[0] || 0;\n    const adjustedY = relY - firstItemTop - itemH / 2;\n    if (adjustedY < 0) return 0;\n\n    const slotIndex = Math.floor(adjustedY / slotSize);\n    if (slotIndex >= count) return count - 1;\n\n    // 上半部分放当前 index，下半部分放下一个 index\n    const posInSlot = adjustedY - slotIndex * slotSize;\n    return posInSlot > itemH / 2 ? Math.min(slotIndex + 1, count - 1) : slotIndex;\n  };\n\n  const onTouchend = () => {\n    clearTimeout(longPressTimer);\n\n    // 拖拽刚结束，300ms 内置 true，屏蔽误触预览\n    dragEnded.value = true;\n    dragEndedTimer = window.setTimeout(() => {\n      dragEnded.value = false;\n    }, TIMEOUT_DURATION);\n\n    if (!dragging.value) {\n      longPressTarget = null;\n      return;\n    }\n\n    // 没有实际移动\n    if (!hasMoved) {\n      resetState();\n      return;\n    }\n\n    // clone 动画归位到目标 item 位置\n    const dragFile = cloneFile.value;\n    const dragKey = dragFile ? getDragKey(dragFile) : -1;\n\n    requestAnimationFrame(() => {\n      // 通过 data-drag-key 属性查找被拖 item 的 DOM 元素\n      const container = longPressTarget?.closest(`.${uploadClass.value}`);\n      const targetEl = container?.querySelector(`[data-drag-key=\"${dragKey}\"]`) as HTMLElement;\n\n      if (targetEl) {\n        const rect = targetEl.getBoundingClientRect();\n        cloneStyle.value = {\n          ...cloneStyle.value,\n          left: `${rect.left}px`,\n          top: `${rect.top}px`,\n          width: `${rect.width}px`,\n          height: `${rect.height}px`,\n          transform: 'scale(1)',\n          boxShadow: 'none',\n          transition: 'all 0.3s ease',\n        };\n      } else {\n        cloneStyle.value = {\n          ...cloneStyle.value,\n          opacity: '0',\n          transition: 'opacity 0.3s ease',\n        };\n      }\n\n      const finalFiles = [...sortedFiles.value];\n\n      // 将所有排序后的文件写入 uploadValue\n      props.onDrop?.(finalFiles);\n      setUploadValue(finalFiles, { trigger: 'sort', files: finalFiles });\n      if (toUploadFilesRef) {\n        toUploadFilesRef.value = [];\n      }\n      resetState();\n    });\n  };\n\n  const onTouchcancel = () => {\n    clearTimeout(longPressTimer);\n    // 取消拖拽，恢复原始顺序\n    resetState();\n    longPressTarget = null;\n  };\n\n  const resetState = () => {\n    dragging.value = false;\n    dragIndex.value = -1;\n    cloneVisible.value = false;\n    cloneFile.value = null;\n    cloneStyle.value = {};\n    hasMoved = false;\n    cachedItemWidth = 0;\n    cachedItemHeight = 0;\n    longPressTarget = null;\n    layout = null;\n  };\n\n  return {\n    dragging,\n    dragIndex,\n    sortedFiles,\n    cloneVisible,\n    cloneStyle,\n    cloneFile,\n    getDragKey,\n    syncFiles,\n    onTouchstart,\n    onTouchmove,\n    onTouchend,\n    onTouchcancel,\n    dragEnded,\n  };\n}\n"],"names":["globalUidCounter","keySeeds","Map","setDragKey","file","existing","__uid","parts","name","size","lastModified","type","url","filter","p","base","length","concat","encodeURIComponent","join","has","_keySeeds$get","seed","get","n","set","add","useDrag","props","uploadClass","setUploadValue","toUploadFilesRef","dragging","ref","dragIndex","sortedFiles","cloneVisible","cloneStyle","cloneFile","dragEnded","longPressTimer","dragEndedTimer","TIMEOUT_DURATION","onBeforeUnmount","clearTimeout","getDragKey","syncFiles","files","value","Set","forEach","f","_toConsumableArray","cachedItemWidth","cachedItemHeight","startFingerX","startFingerY","hasMoved","longPressTarget","layout","onTouchstart","e","index","_e$touches","draggable","touch","touches","clientX","clientY","currentTarget","window","setTimeout","onLongPress","_props$onDrag","target","rect","getBoundingClientRect","width","height","container","closest","containerRect","dragItems","querySelectorAll","theme","itemTops","itemHeights","el","r","push","top","containerLeft","left","containerTop","columns","cellWidth","cellHeight","firstRect","i","Math","round","isList","position","zIndex","pointerEvents","transform","boxShadow","transition","borderRadius","overflow","onDrag","call","onTouchmove","_e$touches2","_e$changedTouches","changedTouches","dx","abs","dy","cancelable","preventDefault","_objectSpread","targetIndex","detectTargetSlot","newFiles","_newFiles$splice","splice","_newFiles$splice2","_slicedToArray","moved","Boolean","fingerX","fingerY","count","relX","relY","detectListSlot","detectGridSlot","_layout$cellWidth","_layout","_layout$cellHeight","_layout2","_layout$columns","_layout3","col","floor","row","max","min","itemH","gap","slotSize","firstItemTop","adjustedY","slotIndex","posInSlot","onTouchend","resetState","dragFile","dragKey","requestAnimationFrame","_longPressTarget","_props$onDrop","targetEl","querySelector","opacity","finalFiles","onDrop","trigger","onTouchcancel"],"mappings":"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"}