Skip to content

Commit 4779735

Browse files
committed
fix empty snap points
1 parent 1675c2a commit 4779735

File tree

1 file changed

+20
-10
lines changed

1 file changed

+20
-10
lines changed

src/index.tsx

Lines changed: 20 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -19,6 +19,8 @@ import Animated, {
1919
useDerivedValue,
2020
useSharedValue,
2121
withSpring,
22+
interpolate,
23+
Extrapolate,
2224
} from "react-native-reanimated";
2325

2426
export enum OpenDirection {
@@ -126,19 +128,25 @@ function SwipeableItem<T>(
126128
[animStatePos]
127129
);
128130

129-
const maxSnapPointLeft = -1 * (Math.max(...snapPointsLeft) || 0);
130-
const maxSnapPointRight = Math.max(...snapPointsRight) || 0;
131+
const maxSnapPointLeft =
132+
-1 * Math.max(...(snapPointsLeft.length ? snapPointsLeft : [0]));
133+
const maxSnapPointRight = Math.max(
134+
...(snapPointsRight.length ? snapPointsRight : [0])
135+
);
131136

132-
const maxTranslateLeft = maxSnapPointLeft - overSwipe;
133-
const maxTranslateRight = maxSnapPointRight + overSwipe;
137+
// Only include overswipe if the max snap point is greater than zero
138+
const maxTranslateLeft =
139+
maxSnapPointLeft - (maxSnapPointLeft ? overSwipe : 0);
140+
const maxTranslateRight =
141+
maxSnapPointRight + (maxSnapPointRight ? overSwipe : 0);
134142

135143
const percentOpenLeft = useDerivedValue(() => {
136-
return swipingLeft.value
144+
return swipingLeft.value && maxSnapPointLeft
137145
? Math.abs(animStatePos.value / maxSnapPointLeft)
138146
: 0;
139147
}, []);
140148
const percentOpenRight = useDerivedValue(() => {
141-
return swipingRight.value
149+
return swipingRight.value && maxSnapPointRight
142150
? Math.abs(animStatePos.value / maxSnapPointRight)
143151
: 0;
144152
}, []);
@@ -227,15 +235,17 @@ function SwipeableItem<T>(
227235
GestureEvent<PanGestureHandlerEventPayload>,
228236
{ startX: number }
229237
>({
230-
onStart: (evt, ctx) => {
238+
onStart: (_evt, ctx) => {
231239
ctx.startX = animStatePos.value;
232240
isGestureActive.value = true;
233241
},
234242
onActive: (evt, ctx) => {
235243
const rawVal = evt.translationX + ctx.startX;
236-
const clampedVal = Math.min(
237-
Math.max(maxTranslateLeft, rawVal),
238-
maxTranslateRight
244+
const clampedVal = interpolate(
245+
rawVal,
246+
[maxTranslateLeft, maxTranslateRight],
247+
[maxTranslateLeft, maxTranslateRight],
248+
Extrapolate.CLAMP
239249
);
240250
animStatePos.value = clampedVal;
241251
},

0 commit comments

Comments
 (0)