Skip to content

Commit 3340272

Browse files
committed
Some progress
1 parent 04a14f1 commit 3340272

File tree

6 files changed

+78
-43
lines changed

6 files changed

+78
-43
lines changed

packages/react-native-sortables/src/providers/grid/layout/GridLayoutProvider.tsx

Lines changed: 33 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -9,7 +9,12 @@ import {
99
useMutableValue
1010
} from '../../../integrations/reanimated';
1111
import type { GridLayoutContextType } from '../../../types';
12-
import { useCommonValuesContext, useMeasurementsContext } from '../../shared';
12+
import { calculateSnapOffset } from '../../../utils';
13+
import {
14+
useCommonValuesContext,
15+
useCustomHandleContext,
16+
useMeasurementsContext
17+
} from '../../shared';
1318
import { createProvider } from '../../utils';
1419
import { calculateActiveItemCrossOffset, calculateLayout } from './utils';
1520

@@ -39,15 +44,20 @@ const { GridLayoutProvider, useGridLayoutContext } = createProvider(
3944
rowHeight
4045
}) => {
4146
const {
47+
activeItemDimensions,
4248
activeItemKey,
4349
containerWidth,
4450
indexToKey,
4551
itemHeights,
4652
itemPositions,
4753
itemWidths,
4854
keyToIndex,
49-
shouldAnimateLayout
55+
shouldAnimateLayout,
56+
snapOffsetX,
57+
snapOffsetY,
58+
touchPosition
5059
} = useCommonValuesContext();
60+
const { activeHandleMeasurements } = useCustomHandleContext() ?? {};
5161
const { applyControlledContainerDimensions } = useMeasurementsContext();
5262
const debugContext = useDebugContext();
5363

@@ -119,22 +129,39 @@ const { GridLayoutProvider, useGridLayoutContext } = createProvider(
119129
}),
120130
(props, previousProps) => {
121131
const activeKey = activeItemKey.value;
122-
if (activeKey !== null) {
123-
const calculatedOffset = calculateActiveItemCrossOffset(
132+
if (activeKey !== null && activeItemDimensions.value) {
133+
let calculatedOffset = calculateActiveItemCrossOffset(
124134
activeKey,
125135
keyToIndex.value,
126136
itemPositions.value,
127137
props
128138
);
129-
139+
if (calculatedOffset !== additionalCrossOffset.value) {
140+
const touchY = touchPosition.value?.y ?? 0;
141+
const snapY = calculateSnapOffset(
142+
snapOffsetY.value,
143+
snapOffsetY.value,
144+
activeHandleMeasurements?.value ?? activeItemDimensions.value,
145+
touchPosition.value
146+
).y;
147+
calculatedOffset += snapY - touchY;
148+
}
130149
additionalCrossOffset.value = calculatedOffset;
131150
} else {
132151
additionalCrossOffset.value = 0;
133152
}
134153

135154
const layout = calculateLayout(props, additionalCrossOffset.value);
155+
if (!layout) {
156+
return;
157+
}
158+
159+
// Update item positions
160+
itemPositions.value = layout.itemPositions;
161+
// Update controlled container dimensions
162+
applyControlledContainerDimensions(layout.controlledContainerDimensions);
136163

137-
// On web, animate layout only if parent container is not resized
164+
// On the web, animate layout only if parent container is not resized
138165
// (e.g. skip animation when the browser window is resized)
139166
shouldAnimateLayout.value =
140167
!IS_WEB ||
@@ -144,15 +171,6 @@ const { GridLayoutProvider, useGridLayoutContext } = createProvider(
144171
? props.itemWidths === previousProps?.itemWidths
145172
: props.itemHeights === previousProps?.itemHeights;
146173

147-
if (!layout || !itemHeights.value || !itemWidths.value) {
148-
return;
149-
}
150-
151-
// Update item positions
152-
itemPositions.value = layout.itemPositions;
153-
// Update controlled container dimensions
154-
applyControlledContainerDimensions(layout.controlledContainerDimensions);
155-
156174
// DEBUG ONLY
157175
if (debugCrossGapRects) {
158176
for (let i = 0; i < layout.crossAxisOffsets.length - 1; i++) {

packages/react-native-sortables/src/providers/grid/layout/updates/common.ts

Lines changed: 9 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -28,6 +28,7 @@ export const createGridStrategy =
2828
containerWidth,
2929
indexToKey,
3030
itemHeights,
31+
itemPositions,
3132
itemWidths
3233
} = useCommonValuesContext();
3334
const { additionalCrossOffset, crossGap, isVertical, mainGap, numGroups } =
@@ -59,27 +60,25 @@ export const createGridStrategy =
5960
}
6061

6162
useAnimatedReaction(
62-
() => additionalCrossOffset.value,
63-
additionalOffset => {
63+
() => ({
64+
additionalOffset: additionalCrossOffset.value,
65+
indexToKey: othersIndexToKey.value,
66+
itemPositions: itemPositions.value
67+
}),
68+
props => {
6469
othersLayout.value = calculateLayout(
6570
{
6671
gaps: {
6772
cross: crossGap.value,
6873
main: mainGap.value
6974
},
70-
indexToKey: othersIndexToKey.value,
75+
indexToKey: props.indexToKey,
7176
isVertical,
7277
itemHeights: itemHeights.value,
7378
itemWidths: itemWidths.value,
7479
numGroups
7580
},
76-
additionalOffset
77-
);
78-
79-
console.log(
80-
'othersLayout',
81-
othersLayout.value,
82-
additionalCrossOffset.value
81+
props.additionalOffset
8382
);
8483
}
8584
);
Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,9 +1,9 @@
1+
'worklet';
2+
13
export const getMainIndex = (index: number, numGroups: number): number => {
2-
'worklet';
34
return +index % numGroups;
45
};
56

67
export const getCrossIndex = (index: number, numGroups: number): number => {
7-
'worklet';
88
return Math.floor(+index / numGroups);
99
};

packages/react-native-sortables/src/providers/grid/layout/utils/layout.ts

Lines changed: 0 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -31,8 +31,6 @@ export const calculateLayout = (
3131
const crossAxisOffsets = [additionalCrossOffset];
3232
const itemPositions: Record<string, Vector> = {};
3333

34-
console.log({ additionalCrossOffset, itemHeights });
35-
3634
let mainCoordinate: Coordinate;
3735
let crossCoordinate: Coordinate;
3836
let crossItemSizes;

packages/react-native-sortables/src/providers/shared/DragProvider.ts

Lines changed: 15 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -28,9 +28,9 @@ import type {
2828
} from '../../types';
2929
import { DragActivationState, LayerState } from '../../types';
3030
import {
31+
calculateSnapOffset,
3132
getItemDimensions,
32-
getKeyToIndex,
33-
getOffsetDistance
33+
getKeyToIndex
3434
} from '../../utils';
3535
import { createProvider } from '../utils';
3636
import { useAutoScrollContext } from './AutoScrollProvider';
@@ -141,9 +141,9 @@ const { DragProvider, useDragContext } = createProvider('Drag')<
141141
offsetX: snapOffsetX.value,
142142
offsetY: snapOffsetY.value,
143143
progress: activeAnimationProgress.value,
144-
snapDimensions:
144+
snapAreaDimensions:
145145
activeHandleMeasurements?.value ?? activeItemDimensions.value,
146-
snapOffset: activeHandleOffset?.value,
146+
snapAreaOffset: activeHandleOffset?.value,
147147
startTouch: touchStartTouch.value,
148148
startTouchPosition: dragStartTouchPosition.value,
149149
touch: currentTouch.value
@@ -159,8 +159,8 @@ const { DragProvider, useDragContext } = createProvider('Drag')<
159159
offsetX,
160160
offsetY,
161161
progress,
162-
snapDimensions,
163-
snapOffset,
162+
snapAreaDimensions,
163+
snapAreaOffset,
164164
startTouch,
165165
startTouchPosition,
166166
touch
@@ -170,7 +170,7 @@ const { DragProvider, useDragContext } = createProvider('Drag')<
170170
containerH === null ||
171171
containerW === null ||
172172
!activeDimensions ||
173-
!snapDimensions ||
173+
!snapAreaDimensions ||
174174
!itemTouchOffset ||
175175
!startTouchPosition ||
176176
!touch ||
@@ -195,12 +195,14 @@ const { DragProvider, useDragContext } = createProvider('Drag')<
195195
let tY = itemTouchOffset.y;
196196

197197
if (enableSnap) {
198-
tX =
199-
(snapOffset?.x ?? 0) +
200-
getOffsetDistance(offsetX, snapDimensions.width);
201-
tY =
202-
(snapOffset?.y ?? 0) +
203-
getOffsetDistance(offsetY, snapDimensions.height);
198+
const offset = calculateSnapOffset(
199+
offsetX,
200+
offsetY,
201+
snapAreaDimensions,
202+
snapAreaOffset
203+
);
204+
tX = offset.x;
205+
tY = offset.y;
204206
}
205207

206208
const translate = (from: number, to: number) =>

packages/react-native-sortables/src/utils/layout.ts

Lines changed: 19 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,5 @@
1-
import type { Offset, Vector } from '../types';
1+
import type { Maybe } from '../helperTypes';
2+
import type { Dimensions, Offset, Vector } from '../types';
23
import { gt, lt } from './equality';
34
import { error } from './logs';
45

@@ -20,6 +21,23 @@ export const getOffsetDistance = (
2021
return distance * percentage;
2122
};
2223

24+
export const calculateSnapOffset = (
25+
snapOffsetX: Offset,
26+
snapOffsetY: Offset,
27+
snapAreaDimensions: Dimensions,
28+
snapAreaOffset?: Maybe<Vector>
29+
) => {
30+
'worklet';
31+
return {
32+
x:
33+
(snapAreaOffset?.x ?? 0) +
34+
getOffsetDistance(snapOffsetX, snapAreaDimensions.width),
35+
y:
36+
(snapAreaOffset?.y ?? 0) +
37+
getOffsetDistance(snapOffsetY, snapAreaDimensions.height)
38+
};
39+
};
40+
2341
export const reorderInsert = (
2442
indexToKey: Array<string>,
2543
fromIndex: number,

0 commit comments

Comments
 (0)