Skip to content

Commit 6bc986c

Browse files
committed
feat: track canvas drageEnter & dragLeave (WIP)
1 parent ab76b39 commit 6bc986c

File tree

3 files changed

+25
-7
lines changed

3 files changed

+25
-7
lines changed

example/src/demos/FileDragDrop.tsx

+10-3
Original file line numberDiff line numberDiff line change
@@ -24,14 +24,21 @@ export default function Box() {
2424
return (
2525
<Canvas
2626
{...preventDragDropDefaults}
27-
onDropMissed={(e) => console.log('drop missed!')}
28-
onDragOverMissed={(e) => setActiveBg(1)}>
27+
onDropMissed={(e) => {
28+
console.log('drop missed!')
29+
setActiveBg(0)
30+
}}
31+
onDragOverMissed={(e) => setActiveBg(1)}
32+
onDragLeave={() => setActiveBg(0)}>
2933
<color attach="background" args={[bgColor]} />
3034
<a.mesh
3135
rotation-y={rotation}
3236
scale-x={scale}
3337
scale-z={scale}
34-
onDrop={(e) => console.log('dropped!', e)}
38+
onDrop={(e) => {
39+
console.log('dropped!')
40+
setActive(0)
41+
}}
3542
onDragOverEnter={() => {
3643
setActive(1)
3744
setActiveBg(0)

packages/fiber/src/core/events.ts

+12-2
Original file line numberDiff line numberDiff line change
@@ -41,9 +41,12 @@ export type Events = {
4141
onClick: EventListener
4242
onContextMenu: EventListener
4343
onDoubleClick: EventListener
44+
onDragEnter: EventListener
45+
onDragLeave: EventListener
4446
onDragOverEnter: EventListener
4547
onDragOverLeave: EventListener
4648
onDrop: EventListener
49+
onDropMissed: EventListener
4750
onWheel: EventListener
4851
onPointerDown: EventListener
4952
onPointerUp: EventListener
@@ -57,6 +60,8 @@ export type EventHandlers = {
5760
onClick?: (event: ThreeEvent<MouseEvent>) => void
5861
onContextMenu?: (event: ThreeEvent<MouseEvent>) => void
5962
onDoubleClick?: (event: ThreeEvent<MouseEvent>) => void
63+
onDragEnter?: (event: ThreeEvent<DragEvent>) => void
64+
onDragLeave?: (event: ThreeEvent<DragEvent>) => void
6065
onDragOverEnter?: (event: ThreeEvent<DragEvent>) => void
6166
onDragOverLeave?: (event: ThreeEvent<DragEvent>) => void
6267
onDragOverMissed?: (event: DragEvent) => void
@@ -113,6 +118,8 @@ export function getEventPriority() {
113118
case 'click':
114119
case 'contextmenu':
115120
case 'dblclick':
121+
case 'dragenter':
122+
case 'dragleave':
116123
case 'drop':
117124
case 'pointercancel':
118125
case 'pointerdown':
@@ -186,7 +193,9 @@ export function createEvents(store: UseBoundStore<RootState>) {
186193
['Move', 'Over', 'Enter', 'Out', 'Leave'].some(
187194
(name) => (obj as unknown as Instance).__r3f?.handlers[('onPointer' + name) as keyof EventHandlers],
188195
) ||
189-
['Over'].some((name) => (obj as unknown as Instance).__r3f?.handlers[('onDrag' + name) as keyof EventHandlers]),
196+
['Over', 'Enter', 'Leave'].some(
197+
(name) => (obj as unknown as Instance).__r3f?.handlers[('onDrag' + name) as keyof EventHandlers],
198+
),
190199
)
191200
}
192201

@@ -401,6 +410,7 @@ export function createEvents(store: UseBoundStore<RootState>) {
401410
switch (name) {
402411
case 'onPointerLeave':
403412
case 'onPointerCancel':
413+
case 'onDragLeave':
404414
return () => cancelPointer([])
405415
case 'onLostPointerCapture':
406416
return (event: DomEvent) => {
@@ -423,7 +433,7 @@ export function createEvents(store: UseBoundStore<RootState>) {
423433

424434
// Get fresh intersects
425435
const isPointerMove = name === 'onPointerMove'
426-
const isDragOver = name === 'onDragOverEnter' || name === 'onDragOverLeave'
436+
const isDragOver = name === 'onDragOver'
427437
const isDrop = name === 'onDrop'
428438
const isClickEvent = name === 'onClick' || name === 'onContextMenu' || name === 'onDoubleClick'
429439
const filter = isPointerMove ? filterPointerEvents : undefined

packages/fiber/src/web/events.ts

+3-2
Original file line numberDiff line numberDiff line change
@@ -6,8 +6,9 @@ const DOM_EVENTS = {
66
onClick: ['click', false],
77
onContextMenu: ['contextmenu', false],
88
onDoubleClick: ['dblclick', false],
9-
onDragOverEnter: ['dragover', false],
10-
onDragOverLeave: ['dragover', false],
9+
onDragEnter: ['dragenter', false],
10+
onDragLeave: ['dragleave', false],
11+
onDragOver: ['dragover', false],
1112
onDrop: ['drop', false],
1213
onWheel: ['wheel', true],
1314
onPointerDown: ['pointerdown', true],

0 commit comments

Comments
 (0)