@@ -22,8 +22,19 @@ const getHoveringPosition = (
22
22
) => {
23
23
const hoveringPosition = ( clientY - treeTop ) / itemHeight ;
24
24
25
+ const treeLinearItems = linearItems [ treeId ] ;
25
26
const linearIndex = Math . floor ( hoveringPosition ) ;
26
- const targetLinearItem = linearItems [ treeId ] [ linearIndex ] ;
27
+
28
+ if ( linearIndex > treeLinearItems . length - 1 ) {
29
+ return {
30
+ linearIndex : treeLinearItems . length - 1 ,
31
+ targetItem : treeLinearItems [ treeLinearItems . length - 1 ] . item ,
32
+ offset : 'bottom' ,
33
+ targetLinearItem : treeLinearItems [ treeLinearItems . length - 1 ] ,
34
+ } as const ;
35
+ }
36
+
37
+ const targetLinearItem = treeLinearItems [ linearIndex ] ;
27
38
const targetItem = items [ targetLinearItem . item ] ;
28
39
let offset : 'top' | 'bottom' | undefined ;
29
40
@@ -42,6 +53,7 @@ const getHoveringPosition = (
42
53
export const useOnDragOverTreeHandler = (
43
54
lastDragCode : string ,
44
55
setLastDragCode : ( code : string ) => void ,
56
+ draggingItems : TreeItem [ ] | undefined ,
45
57
itemHeight : number ,
46
58
onDragAtPosition : ( draggingPosition : DraggingPosition | undefined ) => void ,
47
59
onPerformDrag : ( draggingPosition : DraggingPosition ) => void
@@ -53,7 +65,7 @@ export const useOnDragOverTreeHandler = (
53
65
linearItems,
54
66
items,
55
67
canReorderItems,
56
- viewState ,
68
+ trees ,
57
69
} = useTreeEnvironment ( ) ;
58
70
const getParentOfLinearItem = useGetGetParentOfLinearItem ( ) ;
59
71
@@ -63,6 +75,10 @@ export const useOnDragOverTreeHandler = (
63
75
treeId : string ,
64
76
containerRef : React . MutableRefObject < HTMLElement | undefined >
65
77
) => {
78
+ if ( ! draggingItems ) {
79
+ return ;
80
+ }
81
+
66
82
if ( ! canDragAndDrop ) {
67
83
return ;
68
84
}
@@ -78,6 +94,18 @@ export const useOnDragOverTreeHandler = (
78
94
const treeBb = containerRef . current . getBoundingClientRect ( ) ;
79
95
const outsideContainer = isOutsideOfContainer ( e , treeBb ) ;
80
96
97
+ if ( linearItems [ treeId ] . length === 0 ) {
98
+ // Empty tree
99
+ onPerformDrag ( {
100
+ targetType : 'root' ,
101
+ treeId,
102
+ depth : 0 ,
103
+ linearIndex : 0 ,
104
+ targetItem : trees [ treeId ] . rootItem ,
105
+ } ) ;
106
+ return ;
107
+ }
108
+
81
109
let { linearIndex, offset } = getHoveringPosition (
82
110
e . clientY ,
83
111
treeBb . top ,
@@ -130,7 +158,11 @@ export const useOnDragOverTreeHandler = (
130
158
131
159
const parent = getParentOfLinearItem ( linearIndex , treeId ) ;
132
160
133
- if ( viewState [ treeId ] ?. selectedItems ?. includes ( targetItem . item ) ) {
161
+ if (
162
+ draggingItems . some (
163
+ draggingItem => draggingItem . index === targetItem . item
164
+ )
165
+ ) {
134
166
return ;
135
167
}
136
168
@@ -178,6 +210,7 @@ export const useOnDragOverTreeHandler = (
178
210
canDropOnFolder ,
179
211
canDropOnNonFolder ,
180
212
canReorderItems ,
213
+ draggingItems ,
181
214
getParentOfLinearItem ,
182
215
itemHeight ,
183
216
items ,
@@ -186,7 +219,7 @@ export const useOnDragOverTreeHandler = (
186
219
onDragAtPosition ,
187
220
onPerformDrag ,
188
221
setLastDragCode ,
189
- viewState ,
222
+ trees ,
190
223
]
191
224
) ;
192
225
} ;
0 commit comments