@@ -19,6 +19,8 @@ import Animated, {
1919 useDerivedValue ,
2020 useSharedValue ,
2121 withSpring ,
22+ interpolate ,
23+ Extrapolate ,
2224} from "react-native-reanimated" ;
2325
2426export 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