@@ -12,18 +12,15 @@ import { useGetViableDragPositions } from './useGetViableDragPositions';
12
12
import { useSideEffect } from '../useSideEffect' ;
13
13
import { buildMapForTrees } from '../utils' ;
14
14
import { useCallSoon } from '../useCallSoon' ;
15
- import { computeItemHeight } from './layoutUtils' ;
16
15
import { useStableHandler } from '../useStableHandler' ;
17
16
import { useGetOriginalItemOrder } from '../useGetOriginalItemOrder' ;
18
- import { DraggingPositionEvaluator } from './DraggingPositionEvaluator' ;
19
- import { useGetGetParentOfLinearItem } from './useGetParentOfLinearItem' ;
17
+ import { useDraggingPosition } from '../drag/useDraggingPosition' ;
20
18
21
19
const DragAndDropContext = React . createContext < DragAndDropContextProps > (
22
20
null as any
23
21
) ;
24
22
export const useDragAndDrop = ( ) => React . useContext ( DragAndDropContext ) ;
25
23
26
- // TODO tidy up
27
24
export const DragAndDropProvider : React . FC < React . PropsWithChildren > = ( {
28
25
children,
29
26
} ) => {
@@ -38,11 +35,13 @@ export const DragAndDropProvider: React.FC<React.PropsWithChildren> = ({
38
35
const getViableDragPositions = useGetViableDragPositions ( ) ;
39
36
const callSoon = useCallSoon ( ) ;
40
37
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 ( ) ;
46
45
47
46
const resetProgrammaticDragIndexForCurrentTree = useCallback (
48
47
(
@@ -94,13 +93,13 @@ export const DragAndDropProvider: React.FC<React.PropsWithChildren> = ({
94
93
]
95
94
) ;
96
95
97
- const resetState = useCallback ( ( ) => {
96
+ const resetState = useStableHandler ( ( ) => {
98
97
setIsProgrammaticallyDragging ( false ) ;
99
98
setViableDragPositions ( { } ) ;
100
99
setProgrammaticDragIndex ( 0 ) ;
101
100
setDraggingPosition ( undefined ) ;
102
- setDropPositionEvaluator ( undefined ) ;
103
- } , [ ] ) ;
101
+ resetDraggingPosition ( ) ;
102
+ } ) ;
104
103
105
104
useSideEffect (
106
105
( ) => {
@@ -111,12 +110,12 @@ export const DragAndDropProvider: React.FC<React.PropsWithChildren> = ({
111
110
) {
112
111
resetProgrammaticDragIndexForCurrentTree (
113
112
viableDragPositions [ environment . activeTreeId ] ,
114
- dropPositionEvaluator ?. draggingItems
113
+ draggingItems
115
114
) ;
116
115
}
117
116
} ,
118
117
[
119
- dropPositionEvaluator ?. draggingItems ,
118
+ draggingItems ,
120
119
environment . activeTreeId ,
121
120
environment . linearItems ,
122
121
resetProgrammaticDragIndexForCurrentTree ,
@@ -145,23 +144,17 @@ export const DragAndDropProvider: React.FC<React.PropsWithChildren> = ({
145
144
const canDropAt = useCanDropAt ( ) ;
146
145
147
146
const performDrag = ( draggingPosition : DraggingPosition ) => {
148
- if (
149
- dropPositionEvaluator ?. draggingItems &&
150
- ! canDropAt ( draggingPosition , dropPositionEvaluator . draggingItems )
151
- ) {
147
+ if ( draggingItems && ! canDropAt ( draggingPosition , draggingItems ) ) {
152
148
return ;
153
149
}
154
150
155
151
setDraggingPosition ( draggingPosition ) ;
156
152
environment . setActiveTree ( draggingPosition . treeId ) ;
157
153
158
- if (
159
- dropPositionEvaluator ?. draggingItems &&
160
- environment . activeTreeId !== draggingPosition . treeId
161
- ) {
154
+ if ( draggingItems && environment . activeTreeId !== draggingPosition . treeId ) {
162
155
// TODO maybe do only if draggingItems are different to selectedItems
163
156
environment . onSelectItems ?.(
164
- dropPositionEvaluator . draggingItems . map ( item => item . index ) ,
157
+ draggingItems . map ( item => item . index ) ,
165
158
draggingPosition . treeId
166
159
) ;
167
160
}
@@ -173,12 +166,8 @@ export const DragAndDropProvider: React.FC<React.PropsWithChildren> = ({
173
166
treeId : string ,
174
167
containerRef : React . MutableRefObject < HTMLElement | undefined >
175
168
) => {
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 ) ;
182
171
if ( ! newDraggingPosition ) return ;
183
172
if ( newDraggingPosition === 'invalid' ) {
184
173
setDraggingPosition ( undefined ) ;
@@ -189,15 +178,15 @@ export const DragAndDropProvider: React.FC<React.PropsWithChildren> = ({
189
178
) ;
190
179
191
180
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 ;
200
183
}
184
+ environment . onDrop ( draggingItems , draggingPosition ) ;
185
+
186
+ callSoon ( ( ) => {
187
+ environment . onFocusItem ?.( draggingItems [ 0 ] , draggingPosition . treeId ) ;
188
+ resetState ( ) ;
189
+ } ) ;
201
190
} ) ;
202
191
203
192
const onStartDraggingItems = useCallback (
@@ -207,14 +196,7 @@ export const DragAndDropProvider: React.FC<React.PropsWithChildren> = ({
207
196
treeId => getViableDragPositions ( treeId , items )
208
197
) ;
209
198
210
- setDropPositionEvaluator (
211
- new DraggingPositionEvaluator (
212
- environment ,
213
- getParentOfLinearItem ,
214
- items ,
215
- computeItemHeight ( treeId )
216
- )
217
- ) ;
199
+ initiateDraggingPosition ( treeId , items ) ;
218
200
219
201
// TODO what if trees have different heights and drag target changes?
220
202
setViableDragPositions ( treeViableDragPositions ) ;
@@ -227,9 +209,10 @@ export const DragAndDropProvider: React.FC<React.PropsWithChildren> = ({
227
209
}
228
210
} ,
229
211
[
230
- environment ,
231
- getParentOfLinearItem ,
212
+ environment . activeTreeId ,
213
+ environment . treeIds ,
232
214
getViableDragPositions ,
215
+ initiateDraggingPosition ,
233
216
resetProgrammaticDragIndexForCurrentTree ,
234
217
]
235
218
) ;
@@ -299,25 +282,25 @@ export const DragAndDropProvider: React.FC<React.PropsWithChildren> = ({
299
282
completeProgrammaticDrag,
300
283
programmaticDragUp,
301
284
programmaticDragDown,
302
- draggingItems : dropPositionEvaluator ?. draggingItems ,
285
+ draggingItems,
303
286
draggingPosition,
304
- itemHeight : dropPositionEvaluator ?. itemHeight ?? 4 ,
287
+ itemHeight : itemHeight . current ,
305
288
isProgrammaticallyDragging,
306
289
onDragOverTreeHandler,
307
290
viableDragPositions,
308
291
} ) ,
309
292
[
310
- onStartDraggingItems ,
311
- startProgrammaticDrag ,
312
293
abortProgrammaticDrag ,
313
294
completeProgrammaticDrag ,
314
- programmaticDragUp ,
315
- programmaticDragDown ,
316
- dropPositionEvaluator ?. draggingItems ,
317
- dropPositionEvaluator ?. itemHeight ,
295
+ draggingItems ,
318
296
draggingPosition ,
319
297
isProgrammaticallyDragging ,
298
+ itemHeight ,
320
299
onDragOverTreeHandler ,
300
+ onStartDraggingItems ,
301
+ programmaticDragDown ,
302
+ programmaticDragUp ,
303
+ startProgrammaticDrag ,
321
304
viableDragPositions ,
322
305
]
323
306
) ;
0 commit comments