Skip to content

Commit daa841d

Browse files
authored
Swipeable and drawer, new api (#3803)
## Description This PR changes reanimated swipeable and reanimated drawer components implementations to use new hooks API. ## Test plan Check whether 'new swipable' and 'reanimated drawer layout' work in the example app
1 parent 2a90922 commit daa841d

File tree

5 files changed

+160
-232
lines changed

5 files changed

+160
-232
lines changed

packages/react-native-gesture-handler/src/components/ReanimatedDrawerLayout.tsx

Lines changed: 77 additions & 100 deletions
Original file line numberDiff line numberDiff line change
@@ -36,16 +36,18 @@ import Animated, {
3636
withSpring,
3737
} from 'react-native-reanimated';
3838

39-
import { GestureObjects as Gesture } from '../handlers/gestures/gestureObjects';
40-
import { GestureDetector } from '../handlers/gestures/GestureDetector';
4139
import {
4240
UserSelect,
4341
ActiveCursor,
4442
MouseButton,
4543
HitSlop,
46-
GestureStateChangeEvent,
4744
} from '../handlers/gestureHandlerCommon';
48-
import { PanGestureHandlerEventPayload } from '../handlers/GestureHandlerEventPayload';
45+
import {
46+
PanGestureStateChangeEvent,
47+
usePan,
48+
useTap,
49+
} from '../v3/hooks/gestures';
50+
import { GestureDetector } from '../v3/detectors';
4951

5052
const DRAG_TOSS = 0.05;
5153

@@ -432,9 +434,9 @@ const DrawerLayout = forwardRef<DrawerLayoutMethods, DrawerLayoutProps>(
432434
);
433435

434436
const handleRelease = useCallback(
435-
(event: GestureStateChangeEvent<PanGestureHandlerEventPayload>) => {
437+
(event: PanGestureStateChangeEvent) => {
436438
'worklet';
437-
let { translationX: dragX, velocityX, x: touchX } = event;
439+
let { translationX: dragX, velocityX, x: touchX } = event.handlerData;
438440

439441
if (drawerPosition !== DrawerPosition.LEFT) {
440442
// See description in _updateAnimatedEvent about why events are flipped
@@ -497,20 +499,18 @@ const DrawerLayout = forwardRef<DrawerLayoutMethods, DrawerLayoutProps>(
497499
[animateDrawer]
498500
);
499501

500-
const overlayDismissGesture = useMemo(
501-
() =>
502-
Gesture.Tap()
503-
.maxDistance(25)
504-
.onEnd(() => {
505-
if (
506-
isDrawerOpen.value &&
507-
drawerLockMode !== DrawerLockMode.LOCKED_OPEN
508-
) {
509-
closeDrawer();
510-
}
511-
}),
512-
[closeDrawer, isDrawerOpen, drawerLockMode]
513-
);
502+
const overlayDismissGesture = useTap({
503+
maxDistance: 25,
504+
onEnd: () => {
505+
'worklet';
506+
if (
507+
isDrawerOpen.value &&
508+
drawerLockMode !== DrawerLockMode.LOCKED_OPEN
509+
) {
510+
closeDrawer();
511+
}
512+
},
513+
});
514514

515515
const overlayAnimatedStyle = useAnimatedStyle(() => ({
516516
opacity: openValue.value,
@@ -522,86 +522,63 @@ const DrawerLayout = forwardRef<DrawerLayoutMethods, DrawerLayoutProps>(
522522
[drawerWidth, isFromLeft]
523523
);
524524

525-
const panGesture = useMemo(() => {
526-
return Gesture.Pan()
527-
.activeCursor(activeCursor)
528-
.mouseButton(mouseButton)
529-
.hitSlop(drawerOpened ? fillHitSlop : edgeHitSlop)
530-
.minDistance(drawerOpened ? 100 : 0)
531-
.activeOffsetX(gestureOrientation * minSwipeDistance)
532-
.failOffsetY([-15, 15])
533-
.simultaneousWithExternalGesture(overlayDismissGesture)
534-
.enableTrackpadTwoFingerGesture(enableTrackpadTwoFingerGesture)
535-
.enabled(
536-
drawerState !== DrawerState.SETTLING &&
537-
(drawerOpened
538-
? drawerLockMode !== DrawerLockMode.LOCKED_OPEN
539-
: drawerLockMode !== DrawerLockMode.LOCKED_CLOSED)
540-
)
541-
.onStart(() => {
542-
emitStateChanged(DrawerState.DRAGGING, false);
543-
runOnJS(setDrawerState)(DrawerState.DRAGGING);
544-
if (keyboardDismissMode === DrawerKeyboardDismissMode.ON_DRAG) {
545-
runOnJS(dismissKeyboard)();
546-
}
547-
if (hideStatusBar) {
548-
runOnJS(setStatusBarHidden)(true, statusBarAnimation);
549-
}
550-
})
551-
.onUpdate((event) => {
552-
const startedOutsideTranslation = isFromLeft
553-
? interpolate(
554-
event.x,
555-
[0, drawerWidth, drawerWidth + 1],
556-
[0, drawerWidth, drawerWidth]
557-
)
558-
: interpolate(
559-
event.x - containerWidth,
560-
[-drawerWidth - 1, -drawerWidth, 0],
561-
[drawerWidth, drawerWidth, 0]
562-
);
563-
564-
const startedInsideTranslation =
565-
sideCorrection *
566-
(event.translationX +
567-
(drawerOpened ? drawerWidth * -gestureOrientation : 0));
568-
569-
const adjustedTranslation = Math.max(
570-
drawerOpened ? startedOutsideTranslation : 0,
571-
startedInsideTranslation
572-
);
573-
574-
openValue.value = interpolate(
575-
adjustedTranslation,
576-
[-drawerWidth, 0, drawerWidth],
577-
[1, 0, 1],
578-
Extrapolation.CLAMP
579-
);
580-
})
581-
.onEnd(handleRelease);
582-
}, [
583-
drawerLockMode,
584-
openValue,
585-
drawerWidth,
586-
emitStateChanged,
587-
gestureOrientation,
588-
handleRelease,
589-
edgeHitSlop,
590-
fillHitSlop,
591-
minSwipeDistance,
592-
hideStatusBar,
593-
keyboardDismissMode,
594-
overlayDismissGesture,
595-
drawerOpened,
596-
isFromLeft,
597-
containerWidth,
598-
sideCorrection,
599-
drawerState,
600-
activeCursor,
601-
enableTrackpadTwoFingerGesture,
602-
mouseButton,
603-
statusBarAnimation,
604-
]);
525+
const panGesture = usePan({
526+
activeCursor: activeCursor,
527+
mouseButton: mouseButton,
528+
hitSlop: drawerOpened ? fillHitSlop : edgeHitSlop,
529+
activeOffsetX: gestureOrientation * minSwipeDistance,
530+
failOffsetY: [-15, 15],
531+
simultaneousWith: overlayDismissGesture,
532+
enableTrackpadTwoFingerGesture: enableTrackpadTwoFingerGesture,
533+
enabled:
534+
drawerState !== DrawerState.SETTLING &&
535+
(drawerOpened
536+
? drawerLockMode !== DrawerLockMode.LOCKED_OPEN
537+
: drawerLockMode !== DrawerLockMode.LOCKED_CLOSED),
538+
onStart: () => {
539+
'worklet';
540+
emitStateChanged(DrawerState.DRAGGING, false);
541+
runOnJS(setDrawerState)(DrawerState.DRAGGING);
542+
if (keyboardDismissMode === DrawerKeyboardDismissMode.ON_DRAG) {
543+
runOnJS(dismissKeyboard)();
544+
}
545+
if (hideStatusBar) {
546+
runOnJS(setStatusBarHidden)(true, statusBarAnimation);
547+
}
548+
},
549+
onUpdate: (event) => {
550+
'worklet';
551+
const startedOutsideTranslation = isFromLeft
552+
? interpolate(
553+
event.handlerData.x,
554+
[0, drawerWidth, drawerWidth + 1],
555+
[0, drawerWidth, drawerWidth]
556+
)
557+
: interpolate(
558+
event.handlerData.x - containerWidth,
559+
[-drawerWidth - 1, -drawerWidth, 0],
560+
[drawerWidth, drawerWidth, 0]
561+
);
562+
563+
const startedInsideTranslation =
564+
sideCorrection *
565+
(event.handlerData.translationX +
566+
(drawerOpened ? drawerWidth * -gestureOrientation : 0));
567+
568+
const adjustedTranslation = Math.max(
569+
drawerOpened ? startedOutsideTranslation : 0,
570+
startedInsideTranslation
571+
);
572+
573+
openValue.value = interpolate(
574+
adjustedTranslation,
575+
[-drawerWidth, 0, drawerWidth],
576+
[1, 0, 1],
577+
Extrapolation.CLAMP
578+
);
579+
},
580+
onEnd: handleRelease,
581+
});
605582

606583
// When using RTL, row and row-reverse flex directions are flipped.
607584
const reverseContentDirection = I18nManager.isRTL

0 commit comments

Comments
 (0)