Skip to content

Commit 05f1706

Browse files
committed
feat: extract drag loging back into hook (#148)
1 parent 87390e1 commit 05f1706

File tree

4 files changed

+227
-228
lines changed

4 files changed

+227
-228
lines changed

packages/core/src/controlledEnvironment/DragAndDropProvider.tsx

+38-55
Original file line numberDiff line numberDiff line change
@@ -12,18 +12,15 @@ import { useGetViableDragPositions } from './useGetViableDragPositions';
1212
import { useSideEffect } from '../useSideEffect';
1313
import { buildMapForTrees } from '../utils';
1414
import { useCallSoon } from '../useCallSoon';
15-
import { computeItemHeight } from './layoutUtils';
1615
import { useStableHandler } from '../useStableHandler';
1716
import { useGetOriginalItemOrder } from '../useGetOriginalItemOrder';
18-
import { DraggingPositionEvaluator } from './DraggingPositionEvaluator';
19-
import { useGetGetParentOfLinearItem } from './useGetParentOfLinearItem';
17+
import { useDraggingPosition } from '../drag/useDraggingPosition';
2018

2119
const DragAndDropContext = React.createContext<DragAndDropContextProps>(
2220
null as any
2321
);
2422
export const useDragAndDrop = () => React.useContext(DragAndDropContext);
2523

26-
// TODO tidy up
2724
export 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
);

packages/core/src/controlledEnvironment/DraggingPositionEvaluator.ts

-154
This file was deleted.

0 commit comments

Comments
 (0)