Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
112 commits
Select commit Hold shift + click to select a range
5736594
updated pan gesture view and pan gesture example to use v3 api
Apr 14, 2026
f201788
removed videos and migarted examples in all gesture pages
Apr 14, 2026
8598093
not using the GestureBasicSrc files other than for legacy and simplif…
Apr 14, 2026
6e2f843
fixed pinch gesture example
Apr 15, 2026
3eb98c2
updated legacy a
Apr 15, 2026
47a9943
fixed the incosistent size of pan gesture example compared to other
Apr 15, 2026
5cbf50d
Merge branch 'main' of github.com:software-mansion/react-native-gestu…
relextm19 Apr 21, 2026
976cc4a
Merge branch 'main' of github.com:software-mansion/react-native-gestu…
relextm19 Apr 22, 2026
1dee9e3
inital strcuture almost
relextm19 Apr 23, 2026
6aa5a1d
runs :)
relextm19 Apr 24, 2026
9cca906
now it works :)
relextm19 Apr 24, 2026
333b150
added navigation
relextm19 Apr 24, 2026
e7aee69
works on debug doesnt work on release :|
relextm19 Apr 24, 2026
2b7a505
most tests run
relextm19 Apr 24, 2026
5eb6e46
fixed pan and fling isses
relextm19 Apr 24, 2026
1091fc7
added e2eApp
relextm19 Apr 24, 2026
609cb9f
doesnt realy work
relextm19 Apr 27, 2026
ffbe065
Merge main
relextm19 Apr 27, 2026
ee7e34a
updated version and tests
relextm19 Apr 28, 2026
25a9fd8
updated fling tests
relextm19 Apr 28, 2026
baf0531
navigation works
relextm19 Apr 29, 2026
aae4472
added a section for composition and interaction
relextm19 Apr 29, 2026
c287b32
added a screen for compteing gestures
relextm19 Apr 30, 2026
3ad73ff
added test for exclusive gestrure
relextm19 Apr 30, 2026
1b49237
added indicators for tests
relextm19 Apr 30, 2026
7c09199
added gesture detector tests
relextm19 May 4, 2026
1560c17
added ci for e2e tests
relextm19 May 5, 2026
0770390
test
relextm19 May 5, 2026
d00dad9
test
relextm19 May 5, 2026
f823ff4
test
relextm19 May 5, 2026
ab5e5bd
test
relextm19 May 5, 2026
e7876c7
switch to npx for detox and install dependecies with brew
relextm19 May 5, 2026
d936e3f
changed the iphone sim version
relextm19 May 5, 2026
39f5ab7
switched sim to ipohone 15
relextm19 May 5, 2026
591093a
test
relextm19 May 5, 2026
2b365bb
configured detox for android
relextm19 May 6, 2026
3e6846f
made the pinch test platfrom specific
relextm19 May 6, 2026
e9fc47e
split the tests by platform
relextm19 May 6, 2026
d91edf3
added rotation gesture tests with argent
relextm19 May 6, 2026
6d7ed9c
changed argent to npx argent for github actions
relextm19 May 6, 2026
4d37b67
added a cache for the e2eApp build
relextm19 May 6, 2026
faffbc5
removed npx detox form the github action
relextm19 May 7, 2026
bbcca42
now cache pods instead of the full build
relextm19 May 7, 2026
0d98a08
added partial cache for the ios build
relextm19 May 7, 2026
5524682
fixed the yarn test command and added an android-e2e action
relextm19 May 7, 2026
7b8a610
allowed the jobs to run in pararell
relextm19 May 7, 2026
6338f20
updated the workfolow for android
relextm19 May 7, 2026
6287097
updated argent usage on the runner
relextm19 May 7, 2026
8a7e559
changed the argent install command
relextm19 May 7, 2026
ae5642e
udpate argent install command:)|
relextm19 May 7, 2026
e533c90
update exclusiove handler test and bump macos version on github runner
relextm19 May 7, 2026
3ab3b9a
udpate xcode version for runner
relextm19 May 7, 2026
8fb7380
idk
relextm19 May 8, 2026
f34abbb
update the macos vestrions for runners|
relextm19 May 8, 2026
0de69dc
updated worklet and react-native versions
relextm19 May 11, 2026
6fe8a09
updated rotation argent handler
relextm19 May 11, 2026
f285710
changed from release to debug on ci
relextm19 May 11, 2026
e678d8f
changed back to release
relextm19 May 11, 2026
362027c
split launching the emulator into two steps in the android config
relextm19 May 11, 2026
445a1a8
merge main
relextm19 May 11, 2026
3cae15b
added adv cache for android
relextm19 May 11, 2026
5898b0b
fixed argent output resolution
relextm19 May 11, 2026
151850c
added a pan distance test
relextm19 May 12, 2026
104a1e9
cleared up the error message for panDistance test
relextm19 May 12, 2026
24b8849
changed argent usage
relextm19 May 12, 2026
46f6064
changed andorid emulator
relextm19 May 12, 2026
42428a9
changed to iphone 15
relextm19 May 12, 2026
4f45ac9
test argent
relextm19 May 13, 2026
887af6b
update macos on runners and change argent usage
relextm19 May 14, 2026
d39cf88
changed xcode version on runenr
relextm19 May 14, 2026
21dcd7e
changed xcode version on runenr
relextm19 May 14, 2026
4be1e52
udpate detox to iphone 17
relextm19 May 14, 2026
9970cb9
removed the cache from android tests
relextm19 May 14, 2026
357d0ce
removed the cache from android tests
relextm19 May 14, 2026
6a52bb0
Merge branch 'main' into @mbert/e2e
m-bert May 18, 2026
eff43f2
Tap test in expo-example
m-bert May 18, 2026
0320633
Do not reset app
m-bert May 18, 2026
f489bda
Remove old pager
m-bert May 18, 2026
834a02e
Setup android
m-bert May 19, 2026
0550e57
Undo some unnecessary changes
m-bert May 19, 2026
3b41658
Undo other changes
m-bert May 19, 2026
3d4fd05
Versions
m-bert May 19, 2026
3bd9660
Docs changes
m-bert May 19, 2026
ee2f30a
newlines
m-bert May 19, 2026
233fa37
Bump expo
m-bert May 19, 2026
6d77004
CI workflow
m-bert May 19, 2026
cf31400
Update xcode on CI
m-bert May 20, 2026
f2d6ab8
Fix lint CI
m-bert May 20, 2026
03c16ef
Remove unused navigation
m-bert May 20, 2026
fe35008
Merge branch 'main' into @mbert/e2e
m-bert May 20, 2026
bdaa7d3
Remove .agents
m-bert May 20, 2026
fbfe639
locks
m-bert May 20, 2026
89ea6ce
Pan Test
m-bert May 20, 2026
a1794e7
Leave only pan test
m-bert May 21, 2026
d27b482
Update CI script
m-bert May 21, 2026
770ba5e
Change android runner to ubuntu
m-bert May 21, 2026
5ea8873
Bump expo to stable 56
m-bert May 21, 2026
30bf81d
Merge branch 'main' into @mbert/e2e
m-bert May 21, 2026
253cb97
Add missing dependency
m-bert May 21, 2026
92cb7ae
Another CI update
m-bert May 21, 2026
ad016d4
Merge branch 'main' into @mbert/e2e
m-bert May 21, 2026
d14b179
Update setup-detox-script
m-bert May 22, 2026
bdad877
Update CI file
m-bert May 22, 2026
73ce94b
New line
m-bert May 22, 2026
d903abc
Format
m-bert May 22, 2026
6aa4d7c
Remove new-app-screen
m-bert May 22, 2026
c51e035
Potential fix for pull request finding
m-bert May 22, 2026
05666dc
Potential fix for pull request finding
m-bert May 22, 2026
656b073
Ramove native-stack
m-bert May 22, 2026
32aa50f
Merge branch '@mbert/e2e' of github.com:software-mansion/react-native…
m-bert May 22, 2026
6a2102d
Run E2E CI when modifying e2e paths
m-bert May 22, 2026
9687289
Merge branch 'main' into @mbert/e2e
m-bert May 22, 2026
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
98 changes: 98 additions & 0 deletions .github/workflows/e2e.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,98 @@
name: E2E Test

on:
pull_request:
paths:
- apps/expo-example/e2e/**
- apps/common-app/src/e2e_screens/**
push:
branches:
- main
workflow_dispatch:
Comment thread
m-bert marked this conversation as resolved.

concurrency:
group: e2e-app-${{ github.ref }}
cancel-in-progress: true

jobs:
ios-e2e:
if: github.repository == 'software-mansion/react-native-gesture-handler'
runs-on: macos-26
env:
WORKING_DIRECTORY: apps/expo-example
steps:
- name: checkout
uses: actions/checkout@v4

- name: Use node 24
uses: actions/setup-node@v6
with:
node-version: 24
cache: yarn

- name: Use latest stable Xcode
uses: maxim-lobanov/setup-xcode@v1
with:
xcode-version: '26.4.1'

- name: Install dependencies
run: yarn --immutable

- name: Setup Detox
run: brew tap wix/brew && brew install applesimutils && npm install -g detox-cli

- name: Build for iOS
working-directory: ${{ env.WORKING_DIRECTORY }}
run: yarn build-detox-ios

- name: Run tests on iOS
working-directory: ${{ env.WORKING_DIRECTORY }}
run: yarn test:ios

android-e2e:
if: github.repository == 'software-mansion/react-native-gesture-handler'
runs-on: ubuntu-latest
env:
WORKING_DIRECTORY: apps/expo-example
steps:
- name: checkout
uses: actions/checkout@v4

- name: Use node 24
uses: actions/setup-node@v6
with:
node-version: 24
cache: yarn

- name: Install emulator system dependencies
run: |
sudo apt-get update
sudo apt-get install -y libpulse0

- name: Enable KVM
run: |
echo 'KERNEL=="kvm", GROUP="kvm", MODE="0666", OPTIONS+="static_node=kvm"' | sudo tee /etc/udev/rules.d/99-kvm4all.rules
sudo udevadm control --reload-rules
sudo udevadm trigger --name-match=kvm

- name: Install dependencies
run: yarn --immutable

- name: Setup Detox
run: npm install -g detox-cli

- name: Build for Android
working-directory: ${{ env.WORKING_DIRECTORY }}
run: yarn build-detox-android

- name: Run tests on Android
uses: reactivecircus/android-emulator-runner@v2
with:
api-level: 33
arch: x86_64
force-avd-creation: true
emulator-options: -no-window -gpu swiftshader_indirect -noaudio -no-boot-anim -camera-back none
disable-animations: true
avd-name: Pixel_9
working-directory: ${{ env.WORKING_DIRECTORY }}
script: adb devices && yarn test:android
4 changes: 2 additions & 2 deletions .github/workflows/ios-build.yml
Original file line number Diff line number Diff line change
Expand Up @@ -19,7 +19,7 @@ jobs:
build:
if: github.repository == 'software-mansion/react-native-gesture-handler'

runs-on: macos-14
runs-on: macos-26
strategy:
matrix:
working-directory: [apps/basic-example, apps/expo-example]
Expand All @@ -34,7 +34,7 @@ jobs:
- name: Use latest stable Xcode
uses: maxim-lobanov/setup-xcode@v1
with:
xcode-version: '16.1'
xcode-version: '26.4.1'

- name: Use Node.js 24
uses: actions/setup-node@v6
Expand Down
26 changes: 13 additions & 13 deletions apps/basic-example/ios/Podfile.lock
Original file line number Diff line number Diff line change
Expand Up @@ -1769,7 +1769,7 @@ PODS:
- ReactCommon/turbomodule/core
- ReactNativeDependencies
- Yoga
- RNReanimated (4.3.0):
- RNReanimated (4.3.1):
- hermes-engine
- RCTRequired
- RCTTypeSafety
Expand All @@ -1791,11 +1791,11 @@ PODS:
- ReactCommon/turbomodule/bridging
- ReactCommon/turbomodule/core
- ReactNativeDependencies
- RNReanimated/apple (= 4.3.0)
- RNReanimated/common (= 4.3.0)
- RNReanimated/apple (= 4.3.1)
- RNReanimated/common (= 4.3.1)
- RNWorklets
- Yoga
- RNReanimated/apple (4.3.0):
- RNReanimated/apple (4.3.1):
- hermes-engine
- RCTRequired
- RCTTypeSafety
Expand All @@ -1819,7 +1819,7 @@ PODS:
- ReactNativeDependencies
- RNWorklets
- Yoga
- RNReanimated/common (4.3.0):
- RNReanimated/common (4.3.1):
- hermes-engine
- RCTRequired
- RCTTypeSafety
Expand All @@ -1843,7 +1843,7 @@ PODS:
- ReactNativeDependencies
- RNWorklets
- Yoga
- RNWorklets (0.8.1):
- RNWorklets (0.8.3):
- hermes-engine
- RCTRequired
- RCTTypeSafety
Expand All @@ -1865,10 +1865,10 @@ PODS:
- ReactCommon/turbomodule/bridging
- ReactCommon/turbomodule/core
- ReactNativeDependencies
- RNWorklets/apple (= 0.8.1)
- RNWorklets/common (= 0.8.1)
- RNWorklets/apple (= 0.8.3)
- RNWorklets/common (= 0.8.3)
- Yoga
- RNWorklets/apple (0.8.1):
- RNWorklets/apple (0.8.3):
- hermes-engine
- RCTRequired
- RCTTypeSafety
Expand All @@ -1891,7 +1891,7 @@ PODS:
- ReactCommon/turbomodule/core
- ReactNativeDependencies
- Yoga
- RNWorklets/common (0.8.1):
- RNWorklets/common (0.8.3):
- hermes-engine
- RCTRequired
- RCTTypeSafety
Expand Down Expand Up @@ -2224,10 +2224,10 @@ SPEC CHECKSUMS:
ReactCommon: fe2a3af8975e63efa60f95fca8c34dc85deee360
ReactNativeDependencies: 129d6b2e7ba29310ebb126db92070ec49cd882df
RNGestureHandler: 4fa4214e42a7c452210a947270fa3552bf96517e
RNReanimated: 64f4b3b33b48b19e0ba76a352571b52b1e931981
RNWorklets: 533b896a04be761c26ec519014a6ccd0fac03781
RNReanimated: 07fe6682b1d90b9d536540614562850503c63dbb
RNWorklets: 2b1732dea513e38333481dc919029c1e14dc647d
Yoga: e83c3121d079541e69f3c5c623faaaf933fb5812

PODFILE CHECKSUM: ecce038d8e4749ee17b7dea28be0590cdc8b4836
PODFILE CHECKSUM: c7c24b794ae37fda7472ce32e653711daa22b88c

COCOAPODS: 1.15.2
5 changes: 5 additions & 0 deletions apps/common-app/App.tsx
Original file line number Diff line number Diff line change
@@ -1,6 +1,7 @@
/* eslint-disable @eslint-react/no-nested-component-definitions */
/* eslint-disable @eslint-react/no-nested-components */
import AsyncStorage from '@react-native-async-storage/async-storage';
import { HeaderBackButton } from '@react-navigation/elements';
import type { ParamListBase } from '@react-navigation/native';
import { NavigationContainer } from '@react-navigation/native';
import type {
Expand Down Expand Up @@ -43,6 +44,9 @@ export default function App() {
<NavigationContainer>
<Stack.Navigator
screenOptions={{
headerLeft: (props) => (
<HeaderBackButton {...props} testID="back-to-home" />
),
cardStyle: {
// It's important to set height for the screen, without it scroll doesn't work on web platform.
height: Dimensions.get('window').height,
Expand Down Expand Up @@ -113,6 +117,7 @@ export default function App() {
return (
<View style={styles.container}>
<ListWithHeader
scrollViewTestID="examples-list"
style={styles.list}
sections={showLegacyVersion ? OLD_EXAMPLES : NEW_EXAMPLES}
keyExtractor={(example) => example.name}
Expand Down
4 changes: 2 additions & 2 deletions apps/common-app/package.json
Original file line number Diff line number Diff line change
Expand Up @@ -23,10 +23,11 @@
"@react-navigation/stack": "^7.2.10",
"@swmansion/icons": "^0.0.1",
"react-native-gesture-handler": "workspace:*",
"react-native-pager-view": "^8.0.1",
"react-native-reanimated": "^4.3.0",
"react-native-safe-area-context": "^5.4.0",
"react-native-screens": "^4.10.0",
"react-native-worklets": "^0.8.1"
"react-native-worklets": "^0.8.3"
},
"devDependencies": {
"@babel/core": "^7.25.2",
Expand All @@ -35,7 +36,6 @@
"@react-native-community/cli": "18.0.1",
"@react-native-community/cli-platform-android": "18.0.0",
"@react-native-community/cli-platform-ios": "18.0.0",
"@react-native-community/viewpager": "5.0.11",
"@react-native/babel-preset": "0.79.0",
"@react-native/eslint-config": "0.79.0",
"@react-native/metro-config": "0.79.0",
Expand Down
8 changes: 5 additions & 3 deletions apps/common-app/src/ListWithHeader/ListWithHeader.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -19,9 +19,10 @@ import Header, { HEADER_HEIGHT } from './Header';

const IS_ANDROID = Platform.OS === 'android';

export function ListWithHeader<ItemT, SectionT>(
props: SectionListProps<ItemT, SectionT>
) {
export function ListWithHeader<ItemT, SectionT>({
scrollViewTestID,
...props
}: SectionListProps<ItemT, SectionT> & { scrollViewTestID?: string }) {
const scrollOffset = useSharedValue(0);
const scrollEnabled = useSharedValue(true);
const androidDragDist = useSharedValue(0);
Expand Down Expand Up @@ -89,6 +90,7 @@ export function ListWithHeader<ItemT, SectionT>(
renderScrollComponent={(props) => (
<ScrollComponentWithOffset
{...props}
testID={scrollViewTestID}
scrollOffset={scrollOffset}
dragGesture={dragGesture}
animatedScrollEnabled={scrollEnabled}
Expand Down
101 changes: 101 additions & 0 deletions apps/common-app/src/e2e_screens/gestures/pan.tsx
Original file line number Diff line number Diff line change
@@ -0,0 +1,101 @@
import { useState } from 'react';
import { Pressable, StyleSheet, Text, View } from 'react-native';
import {
GestureDetector,
ScrollView,
usePanGesture,
} from 'react-native-gesture-handler';

export default function PanScreen() {
const [text, setText] = useState('');

const panGesture = usePanGesture({
onBegin: () => {
setText((prev) => prev + '1');
},
onActivate: () => {
setText((prev) => prev + '2');
},
onUpdate: () => {
setText((prev) => {
// Skip subsequent updates
if (prev[prev.length - 1] === '3') {
return prev;
}
return prev + '3';
});
},
onDeactivate: () => {
setText((prev) => prev + '4');
},
onFinalize: () => {
setText((prev) => prev + '5');
},
runOnJS: true,
});

return (
<View style={styles.container}>
<ScrollView style={styles.scrollContainer}>
<Text testID="state-indicator" style={styles.stateIndicator}>
{text}
</Text>
</ScrollView>
<View testID="container" style={styles.innerContainer}>
<GestureDetector gesture={panGesture}>
<View style={styles.gestureBox} testID="pan-box" />
</GestureDetector>
</View>
<View style={styles.buttonContainer}>
<Pressable
testID="reset"
style={styles.resetButton}
onPress={() => {
setText('');
}}>
<Text>Reset</Text>
</Pressable>
</View>
</View>
);
}

const styles = StyleSheet.create({
container: {
flex: 1,
},
scrollContainer: {
height: 50,
maxHeight: 50,
},
innerContainer: {
flex: 1,
justifyContent: 'space-around',
alignItems: 'center',
},
stateIndicator: {
fontSize: 15,
alignSelf: 'flex-start',
},
gestureBox: {
width: 120,
height: 120,
borderRadius: 20,
backgroundColor: '#4ecdc4',
},
buttonContainer: {
height: 60,
maxHeight: 60,
alignItems: 'center',
justifyContent: 'center',
},
resetButton: {
width: 120,
height: 40,
borderRadius: 20,
backgroundColor: 'royalblue',

justifyContent: 'center',
alignItems: 'center',
},
});
Original file line number Diff line number Diff line change
@@ -1,12 +1,12 @@
import ViewPagerAndroid from '@react-native-community/viewpager';
import React, { Component } from 'react';
import { StyleSheet, Text, View } from 'react-native';
import {
legacy_createNativeWrapper,
LegacyDrawerLayoutAndroid,
} from 'react-native-gesture-handler';
import PagerView from 'react-native-pager-view';

const WrappedViewPagerAndroid = legacy_createNativeWrapper(ViewPagerAndroid, {
const WrappedViewPagerAndroid = legacy_createNativeWrapper(PagerView, {
disallowInterruption: true,
});

Expand Down
5 changes: 5 additions & 0 deletions apps/common-app/src/new_api/index.tsx
Original file line number Diff line number Diff line change
@@ -1,4 +1,5 @@
import type { ExamplesSection } from '../common';
import panE2E from '../e2e_screens/gestures/pan';
import EmptyExample from '../empty';
import CameraExample from './complicated/camera';
import ChatHeadsExample from './complicated/chat_heads';
Expand Down Expand Up @@ -134,4 +135,8 @@ export const NEW_EXAMPLES: ExamplesSection[] = [
},
],
},
{
sectionTitle: 'E2E Tests',
data: [{ name: 'Pan Gesture', component: panE2E }],
},
];
Loading
Loading