Skip to content

Bump react-native-gesture-handler to 3.3.0 - #102678

Merged
mountiny merged 6 commits into
Expensify:mainfrom
software-mansion-labs:collectioneur/bump-gesture-handler
Oct 2, 2026
Merged

mountiny merged 6 commits into
Expensify:mainfrom
software-mansion-labs:collectioneur/bump-gesture-handler

Conversation

@collectioneur

@collectioneur collectioneur commented Sep 30, 2026 •

Copy link
Copy Markdown
Contributor

Explanation of Change

Bumps react-native-gesture-handler from 2.32.0 to 3.3.0. This is one of the library upgrades that has to land before the RN 0.88 / Expo SDK 58 bump (#101427). Gesture Handler declares react-native: *, so it lands on the RN 0.86 / Expo SDK 57 stack we run today.

The issue targets ~3.2.1, the version Expo SDK 58 bundles today. 3.3.0 is the latest 3.x release and has the same API as 3.2.x, so the RN 0.88 / Expo 58 PR can keep it or align it with whatever SDK 58 ships at release.

What changes in this PR:

  • package.json / package-lock.json: react-native-gesture-handler 2.32.0 → 3.3.0. Gesture Handler 3 no longer depends on @egjs/hammerjs and hoist-non-react-statics, so both (and @types/hammerjs) drop out of the lockfile.
  • Type renames in 5 files (MultiGestureCanvas/usePanGesture.ts, usePinchGesture.ts, useTapGestures.ts, AvatarCropModal/ImageCropView.tsx, AttachmentCarouselView/index.tsx): in 3.x the builder API types are exported as LegacyPanGesture, LegacyPinchGesture, LegacyTapGesture and LegacyComposedGesture, because the old names now belong to the new hook-based API. No runtime change, Gesture.Pan() & co. still return the same objects.
  • config/eslint/eslint.seatbelt.tsv: 3.x marks the whole builder API (Gesture.*, GestureType, Legacy* types, PanGestureChangeEventPayload) as @deprecated in favor of the hook-based API (usePanGesture, useTapGesture, ...). The 82 resulting @typescript-eslint/no-deprecated/<Symbol> violations in 24 files are grandfathered in the seatbelt baseline so this PR stays a version bump. Migrating those files to the hook API is a larger change to the gesture code (attachment carousel, MultiGestureCanvas, crop views, charts, modals) and will follow in a separate PR.
  • The RNGH ScrollView / FlatList / TextInput exports now resolve to the new 3.x components (the old wrappers moved to Legacy* and are deprecated). The 6 call sites (onboarding purpose and personal track goal pages, Travel terms step, autocomplete suggestions, DraggableList and TimePicker ref types) typecheck unchanged and are covered by the tests below.
  • ios/Podfile.lock (standalone NewDot) and the HybridApp Podfile.lock in the companion Mobile-Expensify PR: RNGestureHandler 3.3.0, its new RNWorklets (>= 0.8.0) dependency (the 3.x podspec builds against react-native-worklets when it is installed) and the spec checksum.

None of the APIs removed in 3.0 (gestureHandlerRootHOC, RNGestureHandlerEnabledRootView, the *GestureHandler components) are used in App, and there are no patches for the library.

Where we use the library: GestureHandlerRootView wraps the app (App.tsx) and the crop / feature training views. Gesture + GestureDetector drive the attachment carousel and MultiGestureCanvas (pinch, pan, double tap), the avatar and receipt crop views, the video player progress bar and volume slider, modal swipe-to-dismiss (ReanimatedModal), Growl fling-to-dismiss, the composer send button, camera tap-to-focus on the Scan step, the GPS trip edit slider, chart tap / hover, and horizontal HTML table scrolling in chat.

Jest mocks in jest/setup.ts

Two Gesture Handler 3 changes broke 83 tests in 11 Jest suites and the ReportActionCompose Reassure test, so jest/setup.ts gets two mocks:

  1. GestureHandlerRootViewContext always reports a root view. In 3.x GestureDetector throws in __DEV__ when there is no GestureHandlerRootView above it (2.x only logged a warning). Our tests render screens on their own, outside App.tsx, so every test that renders a gesture failed with GestureDetector must be used as a descendant of GestureHandlerRootView. The mock targets react-native-gesture-handler/lib/module/GestureHandlerRootViewContext because Jest resolves the package through main (lib/module); the src paths in the stack traces come from source maps.
  2. useComposedEventHandler, useHandler and isSharedValue are added to the Reanimated mock. The new RNGH ScrollView / FlatList wrappers (onboarding, Travel terms, distance waypoints) render a detector that calls these three functions, and react-native-reanimated/mock does not provide them. They are hand-written stand-ins: useComposedEventHandler returns a no-op like the mocked useEvent, useHandler returns the same {context, doDependenciesDiffer} shape as the real hook, and isSharedValue recognizes the shared values created by the mocked useSharedValue.

Fixed Issues

$ #101442
PROPOSAL: N/A

MOBILE-EXPENSIFY: https://github.com/Expensify/Mobile-Expensify/pull/14147

Tests

  1. All platforms: open a chat with several image attachments and open one. Pinch to zoom, pan the zoomed image, double tap to zoom in and out, then swipe left / right to the next and previous attachment. Single tap the image and verify the header and arrows toggle. Verify the gestures are smooth and the image does not jump.
  2. All platforms: open an expense with a receipt, open the receipt and use the crop option. Drag the crop handles and save. Verify the receipt is cropped to the selected area.
  3. All platforms: go to Account > Profile, tap the avatar and upload a new photo. Move the zoom slider and drag the image in the crop view, then save. Verify the saved avatar matches the crop.
  4. iOS: tap the Help (Concierge) icon next to search and swipe the side panel to the right.
  5. All platforms: type a message and send it by tapping the send button. Verify the message is sent once.
  6. All platforms: in the composer type @ and then :sm to open the mention and emoji suggestions. Scroll the suggestion list and pick an item. Verify the list scrolls and the selected item is inserted.
  7. All platforms: on the distance map tab, add three waypoints and drag one to reorder it.
  8. All platforms: in Spend open the Insights searches Top categories (bar), Top merchants (pie) and Spend over time (line) (or search type:expense group-by:category view:bar, type:expense group-by:merchant view:pie, type:expense group-by:month view:line). Tap a bar / slice / point and verify it opens Spend filtered by that category / merchant / month. Tap an empty area of the chart and verify nothing happens. Verify the page still scrolls vertically over the chart. On web, hover the bars / slices and verify the tooltip follows the cursor.

Offline tests

N/A — dependency version bump with no behavioral changes. Gesture handling does not depend on the network.

QA Steps

Same as tests

PR Author Checklist

  • I linked the correct issue in the ### Fixed Issues section above
  • I wrote clear testing steps that cover the changes made in this PR
    • I added steps for local testing in the Tests section
    • I added steps for the expected offline behavior in the Offline steps section
    • I added steps for Staging and/or Production testing in the QA steps section
    • I added steps to cover failure scenarios (i.e. verify an input displays the correct error message if the entered data is not correct)
    • I turned off my network connection and tested it while offline to ensure it matches the expected behavior (i.e. verify the default avatar icon is displayed if app is offline)
    • I tested this PR with a High Traffic account against the staging or production API to ensure there are no regressions (e.g. long loading states that impact usability).
  • I included screenshots or videos for tests on all platforms
  • I ran the tests on all platforms & verified they passed on:
    • Android: Native
    • Android: mWeb Chrome
    • iOS: Native
    • iOS: mWeb Safari
    • MacOS: Chrome / Safari
  • I verified there are no console errors (if there's a console error not related to the PR, report it or open an issue for it to be fixed)
  • I followed proper code patterns (see Reviewing the code)
    • I verified that comments were added to code that is not self explanatory
    • I verified that any new or modified comments were clear, correct English, and explained "why" the code was doing something instead of only explaining "what" the code was doing.
    • I verified any copy / text that was added to the app is grammatically correct in English. It adheres to proper capitalization guidelines (note: only the first word of header/labels should be capitalized), and is either coming verbatim from figma or has been approved by marketing (in order to get marketing approval, ask the Bug Zero team member to add the Waiting for copy label to the issue)
  • If a new code pattern is added I verified it was agreed to be used by multiple Expensify engineers
  • I followed the guidelines as stated in the Review Guidelines
  • I tested other components that can be impacted by my changes (i.e. if the PR modifies a shared library or component like Avatar, I verified the components using Avatar are working as expected)
  • If a new CSS style is added I verified that:
    • A similar style doesn't already exist
    • The style can't be created with an existing StyleUtils function (i.e. StyleUtils.getBackgroundAndBorderStyle(theme.componentBG))
  • If new assets were added or existing ones were modified, I verified that:
    • The assets are optimized and compressed (for SVG files, run npm run compress-svg)
    • The assets load correctly across all supported platforms.
  • If the PR modifies code that runs when editing or sending messages, I tested and verified there is no unexpected behavior for all supported markdown - URLs, single line code, code blocks, quotes, headings, bold, strikethrough, and italic.
  • If the PR modifies a generic component, I tested and verified that those changes do not break usages of that component in the rest of the App (i.e. if a shared library or component like Avatar is modified, I verified that Avatar is working as expected in all cases)
  • If the PR modifies a component related to any of the existing Storybook stories, I tested and verified all stories for that component are still working as expected.
  • If the PR modifies a component or page that can be accessed by a direct deeplink, I verified that the code functions as expected when the deeplink is used - from a logged in and logged out account.
  • If the PR modifies the UI (e.g. new buttons, new UI components, changing the padding/spacing/sizing, moving components, etc) or modifies the form input styles:
    • I verified that all the inputs inside a form are aligned with each other.
    • I added Design label and/or tagged @Expensify/design so the design team can review the changes.
  • If the PR adds or modifies the UI:
    • I asked an AI agent to review the changes for accessibility issues and addressed its findings.
    • I tested with a screen reader (VoiceOver on macOS) and verified all new/changed elements are reachable with a logical focus order.
    • I verified all new/changed elements have meaningful accessible names and roles.
    • I verified state changes are announced (e.g. checked/unchecked, expanded/collapsed, selected).
  • I added unit tests for any new feature or bug fix in this PR to help automatically prevent regressions in this user flow.
  • If the main branch was merged into this PR after a review, I tested again and verified the outcome was still expected according to the Test steps.

Screenshots/Videos

Android: Native
Screen.Recording.2026-10-01.at.13.31.16.compressed.mp4
Android: mWeb Chrome
iOS: Native
Screen.Recording.2026-10-01.at.12.59.41.compressed.mp4
iOS: mWeb Safari
MacOS: Chrome / Safari
Screen.Recording.2026-10-01.at.13.41.24.compressed.mp4

@github-actions

Copy link
Copy Markdown
Contributor

⚠️ This PR is possibly changing native code and/or updating libraries, it may cause problems with HybridApp. Please check if any patch updates are required in the HybridApp repo and run an AdHoc build to verify that HybridApp will not break. Ask Contributor Plus for help if you are not sure how to handle this. ⚠️

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Why do we want to use LegacyComposedGesture? Shouldn't we migrate to the new API?

Copy link
Copy Markdown
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

My initial thought is to split the bump and the migration into two PRs to prevent a lot of regressions at once. This PR just bumps the gesture handler, and the next one will migrate the old components to the new ones. WDYT?

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Cool, I'm fine with it 👍 We can unblock RN 0.88 and then focus on migration, nice

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Same but @MelvinBot can you create new issue for this migration to the new API please? Assign @collectioneur @QichenZhu and @mountiny

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I created the follow-up issue: [HOLD App#102678] Migrate react-native-gesture-handler builder API to the 3.x hook API

  • Assignees: collectioneur, QichenZhu, mountiny
  • Labels: Weekly, Task
  • Scope: the 24 files with grandfathered no-deprecated seatbelt entries from this PR, grouped by feature area. It's done when the Legacy* types and those seatbelt entries are gone.

The issue stays on hold until this PR merges.


view run

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Why do we need so many new entries here? 👀

Copy link
Copy Markdown
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

The entire builder API in RNGH 3 is marked as deprecated in favor of the new hook API, that’s why the linter is throwing errors. The 3.x builder API still works, but moving to hooks requires rewriting gesture logic, so I think it would be better to split this bump into two or more PRs

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

@collectioneur Should we do that in a follow up? Happy to create new issues for that

Copy link
Copy Markdown
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Yes, I think a new issue would be more suitable for that, thanks!

@collectioneur
collectioneur marked this pull request as ready for review October 1, 2026 14:44
@collectioneur
collectioneur requested review from a team as code owners October 1, 2026 14:44
@melvin-bot
melvin-bot Bot requested review from JmillsExpensify and QichenZhu and removed request for a team October 1, 2026 14:44
@melvin-bot

melvin-bot Bot commented Oct 1, 2026

Copy link
Copy Markdown

@QichenZhu Please copy/paste the Reviewer Checklist from here into a new comment on this PR and complete it. If you have the K2 extension, you can simply click: [this button]

@melvin-bot
melvin-bot Bot removed the request for review from a team October 1, 2026 14:44
@github-actions

github-actions Bot commented Oct 1, 2026

Copy link
Copy Markdown
Contributor

🚧 mountiny has triggered a test Expensify/App build. You can view the workflow run here.

@mountiny

mountiny commented Oct 1, 2026

Copy link
Copy Markdown
Contributor

@MelvinBot can you create payment issue for @QichenZhu for $175 for their work here?

@github-actions

This comment has been minimized.

@MelvinBot

Copy link
Copy Markdown
Contributor

I created the payment issue: Payment issue for E/App PR#102678 - $175 for @QichenZhu

  • Amount: $175 for QichenZhu (Contributor+ reviewer)
  • Assignees: QichenZhu and mountiny
  • Labels: Weekly, Task

This PR hasn't merged yet. After it deploys to production, add [Due for payment YYYY-MM-DD] to the title and switch the label to Daily.


view run

mountiny
mountiny previously approved these changes Oct 1, 2026

@mountiny mountiny left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Looks good, gonna create issues for the migration now

@JmillsExpensify JmillsExpensify left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

No product review needed on this one.

@QichenZhu QichenZhu left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Code looks good except for minor comments. Next I'll do more testing.

Comment thread jest/setup.ts Outdated
Comment thread jest/setup.ts
Comment on lines +159 to +161
useComposedEventHandler: jest.fn(() => () => {}),
useHandler: jest.fn(() => ({context: {}, doDependenciesDiffer: false})),
isSharedValue: jest.fn((value: unknown) => typeof value === 'object' && value !== null && 'value' in value && 'get' in value && typeof value.get === 'function'),

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

These will be unnecessary after #102266.

Copy link
Copy Markdown
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Hm, good catch. I guess let's leave my mock, then, if the PR with the gesture handler bump gets merged before the reanimated one, I'll remove these lines in the reanimated bump. If not, I'll remove them here

@QichenZhu

Copy link
Copy Markdown
Contributor

@MelvinBot please review the changes for accessibility issues.

@MelvinBot

Copy link
Copy Markdown
Contributor

I found no confirmed accessibility regressions. The App changes are type renames only, so the risk comes from runtime changes inside Gesture Handler 3.3.0. One area needs a screen-reader test before merge.

Please test: TalkBack and VoiceOver on the composer Send button. ComposerSendButton.tsx:45-69 is an accessible View with role="button". Its only handler is Gesture.Tap, so screen-reader activation depends on how Gesture Handler dispatches touches. Version 3.x rewrote Android touch intercept and cancel handling. Add a step to the Tests section: with TalkBack on (Android) and VoiceOver on (iOS), focus the Send button, double tap it, and verify the message is sent once.

Lower-risk changes and what I checked

Lower-risk changes worth a quick check

  • New wrapper around the RNGH ScrollView and FlatList. On web, 3.x adds a <div style="display: contents"> (HostGestureDetector.web.tsx:351-357). On native, it adds a detector view that has no accessibility props. Neither has a role, so focus order should not change. A quick screen-reader pass on the onboarding purpose page and the mention/emoji suggestion list would confirm this.
  • keyboardShouldPersistTaps="handled" works differently. Gesture Handler now handles keyboard dismissal itself and sets disableScrollViewPanResponder (GestureComponents.tsx:81-95). This affects BaseOnboardingPersonalTrackGoal.tsx:98 and BaseAutoCompleteSuggestions.tsx:114. Check that selecting a suggestion with a screen reader still inserts it without closing the keyboard.

Checked and found fine

  • Props: The new ScrollView and FlatList wrappers pass every non-gesture prop through to the React Native component. That includes role, aria-*, accessibilityLabel, nativeID and testID.
  • Refs: Refs still reach the underlying list, so scrollToIndex for keyboard-highlighted suggestions still works.
  • GestureDetector: Every App call site uses Gesture.* builders, so 3.x still renders them with the legacy detector. On web, that keeps the same display: contents wrapper as before.
  • Web keyboard and focus: Enter and Space still activate taps. Gesture Handler adds no tabIndex, aria-*, inert or focus handling. The user-select and touch-action defaults are unchanged.
  • Release notes: The accessibility fixes in 3.0–3.3 cover the RNGH Pressable and button components only. The App doesn't use either.

Not verified: I didn't run a screen reader on any platform. Video slider and Growl dismiss behavior with assistive tech is also untested.

@QichenZhu

Copy link
Copy Markdown
Contributor

I ran into a few weird issues, but I don't think they are blockers.

  1. After pinching to zoom an image to the minimum size, it can't be enlarged again until you release your fingers. Reproducible on all mobile platforms. Production has the same issue.

    nab-1.mov
  2. On iOS Safari in the Simulator, open an image, pan down quickly, then zoom in. After that, when you pan left and right, the image doesn't follow your fingers very well. Production has a similar issue, but it's harder to reproduce.

    nab-2.mov
  3. On Android, open an image, zoom in, then swipe down quickly. The image won't respond to pinch gestures afterward. Production has the same issue.

    nab-3.mp4

@QichenZhu

QichenZhu commented Oct 2, 2026 •

Copy link
Copy Markdown
Contributor

Reviewer Checklist

  • I have verified the author checklist is complete (all boxes are checked off).
  • I verified the correct issue is linked in the ### Fixed Issues section above
  • I verified testing steps are clear and they cover the changes made in this PR
    • I verified the steps for local testing are in the Tests section
    • I verified the steps for Staging and/or Production testing are in the QA steps section
    • I verified the steps cover any possible failure scenarios (i.e. verify an input displays the correct error message if the entered data is not correct)
    • I turned off my network connection and tested it while offline to ensure it matches the expected behavior (i.e. verify the default avatar icon is displayed if app is offline)
  • I checked that screenshots or videos are included for tests on all platforms
  • I included screenshots or videos for tests on all platforms
  • I verified that the composer does not automatically focus or open the keyboard on mobile unless explicitly intended. This includes checking that returning the app from the background does not unexpectedly open the keyboard.
  • I verified tests pass on all platforms & I tested again on:
    • Android: HybridApp
    • Android: mWeb Chrome
    • iOS: HybridApp
    • iOS: mWeb Safari
    • MacOS: Chrome / Safari
  • If there are any errors in the console that are unrelated to this PR, I either fixed them (preferred) or linked to where I reported them in Slack
    https://expensify.slack.com/archives/C049HHMV9SM/p1764642854883869
    https://expensify.slack.com/archives/C049HHMV9SM/p1790051358940179
  • I verified proper code patterns were followed (see Reviewing the code)
    • I verified that comments were added to code that is not self explanatory
    • I verified that any new or modified comments were clear, correct English, and explained "why" the code was doing something instead of only explaining "what" the code was doing.
    • I verified any copy / text that was added to the app is grammatically correct in English. It adheres to proper capitalization guidelines (note: only the first word of header/labels should be capitalized), and is either coming verbatim from figma or has been approved by marketing (in order to get marketing approval, ask the Bug Zero team member to add the Waiting for copy label to the issue)
  • If a new code pattern is added I verified it was agreed to be used by multiple Expensify engineers
  • I verified that this PR follows the guidelines as stated in the Review Guidelines
  • I verified other components that can be impacted by these changes have been tested, and I retested again (i.e. if the PR modifies a shared library or component like Avatar, I verified the components using Avatar have been tested & I retested again)
  • If a new component is created I verified that:
    • A similar component doesn't exist in the codebase
    • All props are defined accurately
    • The component has a clear name that is non-ambiguous and the purpose of the component can be inferred from the name alone
    • The only data being stored in the state is data necessary for rendering and nothing else
    • The component has the minimum amount of code necessary for its purpose, and it is broken down into smaller components in order to separate concerns and functions
  • If a new CSS style is added I verified that:
    • A similar style doesn't already exist
    • The style can't be created with an existing StyleUtils function (i.e. StyleUtils.getBackgroundAndBorderStyle(theme.componentBG)
  • If the PR modifies code that runs when editing or sending messages, I tested and verified there is no unexpected behavior for all supported markdown - URLs, single line code, code blocks, quotes, headings, bold, strikethrough, and italic.
  • If the PR modifies a generic component, I tested and verified that those changes do not break usages of that component in the rest of the App (i.e. if a shared library or component like Avatar is modified, I verified that Avatar is working as expected in all cases)
  • If the PR modifies a component related to any of the existing Storybook stories, I tested and verified all stories for that component are still working as expected.
  • If the PR modifies a component or page that can be accessed by a direct deeplink, I verified that the code functions as expected when the deeplink is used - from a logged in and logged out account.
  • If the PR modifies the UI (e.g. new buttons, new UI components, changing the padding/spacing/sizing, moving components, etc) or modifies the form input styles:
    • I verified that all the inputs inside a form are aligned with each other.
    • I added Design label and/or tagged @Expensify/design so the design team can review the changes.
  • If the PR adds or modifies the UI:
    • I asked an AI agent to review the changes for accessibility issues and addressed its findings.
    • I tested with a screen reader (VoiceOver on macOS) and verified all new/changed elements are reachable with a logical focus order.
    • I verified all new/changed elements have meaningful accessible names and roles.
    • I verified state changes are announced (e.g. checked/unchecked, expanded/collapsed, selected).
  • For any bug fix or new feature in this PR, I verified that sufficient unit tests are included to prevent regressions in this flow.
  • If the main branch was merged into this PR after a review, I tested again and verified the outcome was still expected according to the Test steps.
  • I have checked off every checkbox in the PR reviewer checklist, including those that don't apply to this PR.

Screenshots/Videos

Android: HybridApp
android-native-1.mp4
android-native-2.mp4
android-native-3.mp4
android-native-5.mp4
android-native-6.mp4
android-native-7.mp4
android-native-8.mp4
Android: mWeb Chrome
android-web-1.mp4
android-web-2.mp4
android-web-3.mp4
android-web-5.mp4
android-web-6.mp4
android-web-7.mp4
android-web-8.mp4
iOS: HybridApp
ios-native-1.mov
ios-native-2.mov
ios-native-3.mov
ios-native-4.mov
ios-native-5.mov
ios-native-6.mov
ios-native-7.mov
ios-native-8.mov
iOS: mWeb Safari
ios-web-1.mov
ios-web-2.mov
ios-web-3.mov
ios-web-5.mov
ios-web-6.mov
ios-web-7.mov
ios-web-8.mov
MacOS: Chrome / Safari
mac-web-1.mov
mac-web-2.mov
mac-web-3.mov
mac-web-5.mov
mac-web-6.mov
mac-web-7.mov
mac-web-8.mov

@collectioneur

Copy link
Copy Markdown
Contributor Author

Yeah, I also think they're just edge cases. And since they are the same in production, I don't think it was caused by the bump. Alternatively, we could create another issue to investigate these edge cases
cc: @mountiny

@QichenZhu

Copy link
Copy Markdown
Contributor

@collectioneur please resolve the conflicts, then I'll complete the checklist soon.

@QichenZhu

Copy link
Copy Markdown
Contributor

NAB:

  1. The handles doen't follow the finger well when cropping a receipt on Android. Production has the same issue.
nab-4.mp4

@mountiny mountiny left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Thanks!

@mountiny
mountiny merged commit 8426117 into Expensify:main Oct 2, 2026
45 of 47 checks passed
@github-actions

github-actions Bot commented Oct 2, 2026

Copy link
Copy Markdown
Contributor

🚧 mountiny has triggered a test Expensify/App build. You can view the workflow run here.

@OSBotify OSBotify mentioned this pull request Oct 4, 2026
59 tasks done
@OSBotify

OSBotify commented Oct 5, 2026

Copy link
Copy Markdown
Contributor

🚀 Deployed to staging by https://github.com/mountiny in version: 9.5.2-0 🚀

platform result
🕸 web 🕸 success ✅
🤖 android 🤖 success ✅
🍎 iOS 🍎 success ✅

@MelvinBot

Copy link
Copy Markdown
Contributor

No help site update is needed. This PR upgrades react-native-gesture-handler from 2.32.0 to 3.3.0 and renames types, with no change to features, labels, or workflows, so no help article sentence becomes incorrect.


view run

@OSBotify

OSBotify commented Oct 5, 2026

Copy link
Copy Markdown
Contributor

🚀 Deployed to production by https://github.com/Julesssss in version: 9.5.2-4 🚀

platform result
🕸 web 🕸 success ✅
🤖 android 🤖 success ✅
🍎 iOS 🍎 success ✅

Bundle Size Analysis (Sentry):

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

7 participants