@@ -22,8 +22,19 @@ const getHoveringPosition = (
2222) => {
2323 const hoveringPosition = ( clientY - treeTop ) / itemHeight ;
2424
25+ const treeLinearItems = linearItems [ treeId ] ;
2526 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 ] ;
2738 const targetItem = items [ targetLinearItem . item ] ;
2839 let offset : 'top' | 'bottom' | undefined ;
2940
@@ -42,6 +53,7 @@ const getHoveringPosition = (
4253export const useOnDragOverTreeHandler = (
4354 lastDragCode : string ,
4455 setLastDragCode : ( code : string ) => void ,
56+ draggingItems : TreeItem [ ] | undefined ,
4557 itemHeight : number ,
4658 onDragAtPosition : ( draggingPosition : DraggingPosition | undefined ) => void ,
4759 onPerformDrag : ( draggingPosition : DraggingPosition ) => void
@@ -53,7 +65,7 @@ export const useOnDragOverTreeHandler = (
5365 linearItems,
5466 items,
5567 canReorderItems,
56- viewState ,
68+ trees ,
5769 } = useTreeEnvironment ( ) ;
5870 const getParentOfLinearItem = useGetGetParentOfLinearItem ( ) ;
5971
@@ -63,6 +75,10 @@ export const useOnDragOverTreeHandler = (
6375 treeId : string ,
6476 containerRef : React . MutableRefObject < HTMLElement | undefined >
6577 ) => {
78+ if ( ! draggingItems ) {
79+ return ;
80+ }
81+
6682 if ( ! canDragAndDrop ) {
6783 return ;
6884 }
@@ -78,6 +94,18 @@ export const useOnDragOverTreeHandler = (
7894 const treeBb = containerRef . current . getBoundingClientRect ( ) ;
7995 const outsideContainer = isOutsideOfContainer ( e , treeBb ) ;
8096
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+
81109 let { linearIndex, offset } = getHoveringPosition (
82110 e . clientY ,
83111 treeBb . top ,
@@ -130,7 +158,11 @@ export const useOnDragOverTreeHandler = (
130158
131159 const parent = getParentOfLinearItem ( linearIndex , treeId ) ;
132160
133- if ( viewState [ treeId ] ?. selectedItems ?. includes ( targetItem . item ) ) {
161+ if (
162+ draggingItems . some (
163+ draggingItem => draggingItem . index === targetItem . item
164+ )
165+ ) {
134166 return ;
135167 }
136168
@@ -178,6 +210,7 @@ export const useOnDragOverTreeHandler = (
178210 canDropOnFolder ,
179211 canDropOnNonFolder ,
180212 canReorderItems ,
213+ draggingItems ,
181214 getParentOfLinearItem ,
182215 itemHeight ,
183216 items ,
@@ -186,7 +219,7 @@ export const useOnDragOverTreeHandler = (
186219 onDragAtPosition ,
187220 onPerformDrag ,
188221 setLastDragCode ,
189- viewState ,
222+ trees ,
190223 ]
191224 ) ;
192225} ;
0 commit comments