@@ -12,18 +12,15 @@ import { useGetViableDragPositions } from './useGetViableDragPositions';
1212import { useSideEffect } from '../useSideEffect' ;
1313import { buildMapForTrees } from '../utils' ;
1414import { useCallSoon } from '../useCallSoon' ;
15- import { computeItemHeight } from './layoutUtils' ;
1615import { useStableHandler } from '../useStableHandler' ;
1716import { useGetOriginalItemOrder } from '../useGetOriginalItemOrder' ;
18- import { DraggingPositionEvaluator } from './DraggingPositionEvaluator' ;
19- import { useGetGetParentOfLinearItem } from './useGetParentOfLinearItem' ;
17+ import { useDraggingPosition } from '../drag/useDraggingPosition' ;
2018
2119const DragAndDropContext = React . createContext < DragAndDropContextProps > (
2220 null as any
2321) ;
2422export const useDragAndDrop = ( ) => React . useContext ( DragAndDropContext ) ;
2523
26- // TODO tidy up
2724export const DragAndDropProvider : React . FC < React . PropsWithChildren > = ( {
2825 children,
2926} ) => {
@@ -38,11 +35,13 @@ export const DragAndDropProvider: React.FC<React.PropsWithChildren> = ({
3835 const getViableDragPositions = useGetViableDragPositions ( ) ;
3936 const callSoon = useCallSoon ( ) ;
4037 const getOriginalItemOrder = useGetOriginalItemOrder ( ) ;
41- const getParentOfLinearItem = useGetGetParentOfLinearItem ( ) ;
42-
43- const [ dropPositionEvaluator , setDropPositionEvaluator ] = useState <
44- DraggingPositionEvaluator | undefined
45- > ( undefined ) ;
38+ const {
39+ initiateDraggingPosition,
40+ resetDraggingPosition,
41+ draggingItems,
42+ getDraggingPosition,
43+ itemHeight,
44+ } = useDraggingPosition ( ) ;
4645
4746 const resetProgrammaticDragIndexForCurrentTree = useCallback (
4847 (
@@ -94,13 +93,13 @@ export const DragAndDropProvider: React.FC<React.PropsWithChildren> = ({
9493 ]
9594 ) ;
9695
97- const resetState = useCallback ( ( ) => {
96+ const resetState = useStableHandler ( ( ) => {
9897 setIsProgrammaticallyDragging ( false ) ;
9998 setViableDragPositions ( { } ) ;
10099 setProgrammaticDragIndex ( 0 ) ;
101100 setDraggingPosition ( undefined ) ;
102- setDropPositionEvaluator ( undefined ) ;
103- } , [ ] ) ;
101+ resetDraggingPosition ( ) ;
102+ } ) ;
104103
105104 useSideEffect (
106105 ( ) => {
@@ -111,12 +110,12 @@ export const DragAndDropProvider: React.FC<React.PropsWithChildren> = ({
111110 ) {
112111 resetProgrammaticDragIndexForCurrentTree (
113112 viableDragPositions [ environment . activeTreeId ] ,
114- dropPositionEvaluator ?. draggingItems
113+ draggingItems
115114 ) ;
116115 }
117116 } ,
118117 [
119- dropPositionEvaluator ?. draggingItems ,
118+ draggingItems ,
120119 environment . activeTreeId ,
121120 environment . linearItems ,
122121 resetProgrammaticDragIndexForCurrentTree ,
@@ -145,23 +144,17 @@ export const DragAndDropProvider: React.FC<React.PropsWithChildren> = ({
145144 const canDropAt = useCanDropAt ( ) ;
146145
147146 const performDrag = ( draggingPosition : DraggingPosition ) => {
148- if (
149- dropPositionEvaluator ?. draggingItems &&
150- ! canDropAt ( draggingPosition , dropPositionEvaluator . draggingItems )
151- ) {
147+ if ( draggingItems && ! canDropAt ( draggingPosition , draggingItems ) ) {
152148 return ;
153149 }
154150
155151 setDraggingPosition ( draggingPosition ) ;
156152 environment . setActiveTree ( draggingPosition . treeId ) ;
157153
158- if (
159- dropPositionEvaluator ?. draggingItems &&
160- environment . activeTreeId !== draggingPosition . treeId
161- ) {
154+ if ( draggingItems && environment . activeTreeId !== draggingPosition . treeId ) {
162155 // TODO maybe do only if draggingItems are different to selectedItems
163156 environment . onSelectItems ?.(
164- dropPositionEvaluator . draggingItems . map ( item => item . index ) ,
157+ draggingItems . map ( item => item . index ) ,
165158 draggingPosition . treeId
166159 ) ;
167160 }
@@ -173,12 +166,8 @@ export const DragAndDropProvider: React.FC<React.PropsWithChildren> = ({
173166 treeId : string ,
174167 containerRef : React . MutableRefObject < HTMLElement | undefined >
175168 ) => {
176- if ( ! dropPositionEvaluator ) return ;
177- const newDraggingPosition = dropPositionEvaluator . getDraggingPosition (
178- e ,
179- treeId ,
180- containerRef
181- ) ;
169+ if ( ! draggingItems ) return ;
170+ const newDraggingPosition = getDraggingPosition ( e , treeId , containerRef ) ;
182171 if ( ! newDraggingPosition ) return ;
183172 if ( newDraggingPosition === 'invalid' ) {
184173 setDraggingPosition ( undefined ) ;
@@ -189,15 +178,15 @@ export const DragAndDropProvider: React.FC<React.PropsWithChildren> = ({
189178 ) ;
190179
191180 const onDropHandler = useStableHandler ( ( ) => {
192- const draggingItems = dropPositionEvaluator ?. draggingItems ;
193- if ( draggingItems && draggingPosition && environment . onDrop ) {
194- environment . onDrop ( draggingItems , draggingPosition ) ;
195-
196- callSoon ( ( ) => {
197- environment . onFocusItem ?.( draggingItems [ 0 ] , draggingPosition . treeId ) ;
198- resetState ( ) ;
199- } ) ;
181+ if ( ! draggingItems || ! draggingPosition || ! environment . onDrop ) {
182+ return ;
200183 }
184+ environment . onDrop ( draggingItems , draggingPosition ) ;
185+
186+ callSoon ( ( ) => {
187+ environment . onFocusItem ?.( draggingItems [ 0 ] , draggingPosition . treeId ) ;
188+ resetState ( ) ;
189+ } ) ;
201190 } ) ;
202191
203192 const onStartDraggingItems = useCallback (
@@ -207,14 +196,7 @@ export const DragAndDropProvider: React.FC<React.PropsWithChildren> = ({
207196 treeId => getViableDragPositions ( treeId , items )
208197 ) ;
209198
210- setDropPositionEvaluator (
211- new DraggingPositionEvaluator (
212- environment ,
213- getParentOfLinearItem ,
214- items ,
215- computeItemHeight ( treeId )
216- )
217- ) ;
199+ initiateDraggingPosition ( treeId , items ) ;
218200
219201 // TODO what if trees have different heights and drag target changes?
220202 setViableDragPositions ( treeViableDragPositions ) ;
@@ -227,9 +209,10 @@ export const DragAndDropProvider: React.FC<React.PropsWithChildren> = ({
227209 }
228210 } ,
229211 [
230- environment ,
231- getParentOfLinearItem ,
212+ environment . activeTreeId ,
213+ environment . treeIds ,
232214 getViableDragPositions ,
215+ initiateDraggingPosition ,
233216 resetProgrammaticDragIndexForCurrentTree ,
234217 ]
235218 ) ;
@@ -299,25 +282,25 @@ export const DragAndDropProvider: React.FC<React.PropsWithChildren> = ({
299282 completeProgrammaticDrag,
300283 programmaticDragUp,
301284 programmaticDragDown,
302- draggingItems : dropPositionEvaluator ?. draggingItems ,
285+ draggingItems,
303286 draggingPosition,
304- itemHeight : dropPositionEvaluator ?. itemHeight ?? 4 ,
287+ itemHeight : itemHeight . current ,
305288 isProgrammaticallyDragging,
306289 onDragOverTreeHandler,
307290 viableDragPositions,
308291 } ) ,
309292 [
310- onStartDraggingItems ,
311- startProgrammaticDrag ,
312293 abortProgrammaticDrag ,
313294 completeProgrammaticDrag ,
314- programmaticDragUp ,
315- programmaticDragDown ,
316- dropPositionEvaluator ?. draggingItems ,
317- dropPositionEvaluator ?. itemHeight ,
295+ draggingItems ,
318296 draggingPosition ,
319297 isProgrammaticallyDragging ,
298+ itemHeight ,
320299 onDragOverTreeHandler ,
300+ onStartDraggingItems ,
301+ programmaticDragDown ,
302+ programmaticDragUp ,
303+ startProgrammaticDrag ,
321304 viableDragPositions ,
322305 ]
323306 ) ;
0 commit comments