mirror of
https://github.com/CherryHQ/cherry-studio.git
synced 2026-01-09 14:59:27 +08:00
feat(hooks): 添加useDrag钩子实现拖拽功能
This commit is contained in:
parent
cf9ffafdc3
commit
25827cdf8d
38
src/renderer/src/hooks/useDrag.ts
Normal file
38
src/renderer/src/hooks/useDrag.ts
Normal file
@ -0,0 +1,38 @@
|
|||||||
|
import { useCallback, useState } from 'react'
|
||||||
|
|
||||||
|
export const useDrag = <T extends HTMLElement>(onDrop: (e: React.DragEvent<T>) => Promise<void> | void) => {
|
||||||
|
const [isDragging, setIsDragging] = useState(false)
|
||||||
|
|
||||||
|
const handleDragOver = useCallback((e: React.DragEvent<T>) => {
|
||||||
|
e.preventDefault()
|
||||||
|
e.stopPropagation()
|
||||||
|
}, [])
|
||||||
|
|
||||||
|
const handleDragEnter = useCallback((e: React.DragEvent<T>) => {
|
||||||
|
e.preventDefault()
|
||||||
|
e.stopPropagation()
|
||||||
|
setIsDragging(true)
|
||||||
|
}, [])
|
||||||
|
|
||||||
|
const handleDragLeave = useCallback((e: React.DragEvent<T>) => {
|
||||||
|
e.preventDefault()
|
||||||
|
e.stopPropagation()
|
||||||
|
// 确保是离开当前元素,而不是进入子元素
|
||||||
|
if (e.currentTarget.contains(e.relatedTarget as Node)) {
|
||||||
|
return
|
||||||
|
}
|
||||||
|
setIsDragging(false)
|
||||||
|
}, [])
|
||||||
|
|
||||||
|
const handleDrop = useCallback(
|
||||||
|
async (e: React.DragEvent<T>) => {
|
||||||
|
e.preventDefault()
|
||||||
|
e.stopPropagation()
|
||||||
|
setIsDragging(false)
|
||||||
|
await onDrop(e)
|
||||||
|
},
|
||||||
|
[onDrop]
|
||||||
|
)
|
||||||
|
|
||||||
|
return { isDragging, handleDragOver, handleDragEnter, handleDragLeave, handleDrop }
|
||||||
|
}
|
||||||
Loading…
Reference in New Issue
Block a user