xdesign-vue-next
Version:
XDesign Component for vue-next
1 lines • 4.68 kB
Source Map (JSON)
{"version":3,"file":"useDraggable.mjs","sources":["../../../src/tree/hooks/useDraggable.ts"],"sourcesContent":["import { ref, toRefs, inject } from 'vue';\nimport throttle from 'lodash/throttle';\nimport { TreeNode } from '../../_common/js/tree/tree-node';\nimport { DropPosition } from '../interface';\nimport { dragInjectKey } from '../constants';\n\nexport default function useDraggable(props: { nodeRef: HTMLElement | undefined; node: TreeNode }) {\n const { nodeRef, node } = toRefs(props);\n const onDrag = inject(dragInjectKey);\n\n const isDragOver = ref(false);\n const isDragging = ref(false);\n const dropPosition = ref<DropPosition>(0);\n\n const updateDropPosition = throttle((e: DragEvent) => {\n if (typeof window === 'undefined') return;\n if (!nodeRef.value) return;\n\n const rect = nodeRef.value.getBoundingClientRect();\n const offsetY = window.pageYOffset + rect.top;\n const { pageY } = e;\n const gapHeight = rect.height / 4;\n const diff = pageY - offsetY;\n\n // 其实三元可行\n if (diff < gapHeight) {\n dropPosition.value = -1;\n } else if (diff < rect.height - gapHeight) {\n dropPosition.value = 0;\n } else {\n dropPosition.value = 1;\n }\n });\n\n const setDragStatus = (status: 'dragStart' | 'dragOver' | 'dragLeave' | 'dragEnd' | 'drop', e: DragEvent) => {\n switch (status) {\n case 'dragStart':\n isDragging.value = true;\n dropPosition.value = 0;\n onDrag.onDragStart?.({ node: node.value, e });\n e.dataTransfer.effectAllowed = 'move';\n break;\n case 'dragEnd':\n isDragging.value = false;\n isDragOver.value = false;\n dropPosition.value = 0;\n updateDropPosition.cancel();\n onDrag.onDragEnd?.({ node: node.value, e });\n break;\n case 'dragOver':\n isDragOver.value = true;\n updateDropPosition(e);\n onDrag.onDragOver?.({ node: node.value, e });\n break;\n case 'dragLeave':\n isDragOver.value = false;\n dropPosition.value = 0;\n updateDropPosition.cancel();\n onDrag.onDragLeave?.({ node: node.value, e });\n break;\n case 'drop':\n onDrag.onDrop?.({ node: node.value, dropPosition: dropPosition.value, e });\n isDragOver.value = false;\n updateDropPosition.cancel();\n break;\n default:\n break;\n }\n };\n\n return {\n isDragOver,\n isDragging,\n dropPosition,\n setDragStatus,\n };\n}\n"],"names":["throttle","dropPosition","e","isDragOver","isDragging","setDragStatus"],"mappings":"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"}