Move MultiGestureIcon out of icon primitives#95278
Conversation
Codecov Report❌ Looks like you've decreased code coverage for some files. Please write tests to increase, or at least maintain, the existing level of code coverage. See our documentation here for how to interpret this table.
|
|
@codex review |
|
Codex Review: Didn't find any major issues. Bravo. Reviewed commit: ℹ️ About Codex in GitHubCodex has been enabled to automatically review pull requests in this repo. Reviews are triggered when you
If Codex has suggestions, it will comment; otherwise it will react with 👍. When you sign up for Codex through ChatGPT, Codex can also answer questions or update the PR, like "@codex address that feedback". |
|
@codex review |
|
Codex Review: Didn't find any major issues. Keep them coming! Reviewed commit: ℹ️ About Codex in GitHubCodex has been enabled to automatically review pull requests in this repo. Reviews are triggered when you
If Codex has suggestions, it will comment; otherwise it will react with 👍. When you sign up for Codex through ChatGPT, Codex can also answer questions or update the PR, like "@codex address that feedback". |
|
@aimane-chnaif 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] |
|
cc. @roryabraham this is the second PR for Icon decomp. |
Reviewer Checklist
Screenshots/VideosAndroid: HybridAppandroid.movAndroid: mWeb ChromeiOS: HybridAppios.moviOS: mWeb SafariMacOS: Chrome / Safariweb.mov |
| import {PixelRatio} from 'react-native'; | ||
|
|
||
| /** | ||
| * Discriminated on `isCanvasLoading` so that checking it narrows `canvasSize` |
|
awaiting C+ review from @aimane-chnaif |
|
@aimane-chnaif bump |
|
Please merge main |
ReviewClean, well-scoped refactor — I verified it's behaviorally identical to the old Verification of equivalence (the touch/avatar case in
Architecturally this is the right move — Minor / non-blocking observations
One process note (already raised by |
|
Codex Review: Didn't find any major issues. Breezy! Reviewed commit: ℹ️ About Codex in GitHubCodex has been enabled to automatically review pull requests in this repo. Reviews are triggered when you
If Codex has suggestions, it will comment; otherwise it will react with 👍. When you sign up for Codex through ChatGPT, Codex can also answer questions or update the PR, like "@codex address that feedback". |
Regression hunt: none found ✅I traced every behavioral difference in this diff (web + iOS + Android) and confirmed it's a behavior-preserving refactor. Each prop dropped from the old code path is provably a no-op or resolves to the identical value. What I checked (and why each is safe)1. Dropped 2. Dropped 3. Dropped 4. 5. 6. Wrapper 7. All CI is green (typecheck, ESLint, knip, unused-styles, tests). The only outstanding item is the pending |
|
✋ This PR was not deployed to staging yet because QA is ongoing. It will be automatically deployed to staging after the next production release. |
|
🚧 roryabraham has triggered a test Expensify/App build. You can view the workflow run here. |
|
🧪🧪 Use the links below to test this adhoc build on Android, iOS, and Web. Happy testing! 🧪🧪
|
|
🚀 Deployed to staging by https://github.com/roryabraham in version: 9.4.34-0 🚀
|
No help site changes requiredI reviewed the changes in this PR and no updates to Why: This is a purely internal code-organization refactor with no user-facing impact:
There are no new features, no UI/label/tab/button text changes, and no changes to product behavior that a user would need documented. The existing gesture behavior (pinch/pan/swipe on avatar/attachment previews on touch devices) is preserved — the change only reorganizes where that logic lives. The help site documents product features and workflows, not the internal component structure, so nothing there is affected.
@jmusial, since this is a code-only refactor with no user-facing changes, there's no help site PR to review. If you believe a docs update is warranted, let me know what behavior changed and I'll draft one. |
|
🚀 Deployed to production by https://github.com/roryabraham in version: 9.4.34-14 🚀
|
|
🚀 Deployed to production by https://github.com/roryabraham in version: 9.4.34-14 🚀
Bundle Size Analysis (Sentry): |

Explanation of Change
MultiGestureIconis now a standalone component undercomponents/Attachments/with its own props type, instead of anIconprimitive.Iconloses theenableMultiGestureCanvasprop andAttachmentViewdecides directly whether to render the gesture-enabled variant on touch devices.As part of the cleanup, the canvas-measurement logic was extracted into a shared
useCanvasSizehook, whichLightboxnow reuses instead of its own inline copy.Fixed Issues
$ #95158
PROPOSAL:
Tests
Account->Profileand press the avatar iconEdit->View photoOffline tests
Same as tests.
QA Steps
Same as tests.
PR Author Checklist
### Fixed Issuessection aboveTestssectionOffline stepssectionQA stepssectiontoggleReportand notonIconClick)Avatar, I verified the components usingAvatarare working as expected)StyleUtils.getBackgroundAndBorderStyle(theme.componentBG))npm run compress-svg)Avataris modified, I verified thatAvataris working as expected in all cases)Designlabel and/or tagged@Expensify/designso the design team can review the changes.mainbranch was merged into this PR after a review, I tested again and verified the outcome was still expected according to theTeststeps.Screenshots/Videos
Android: Native
Screen.Recording.2026-07-08.at.13.01.03.mov
Android: mWeb Chrome
Screen.Recording.2026-07-08.at.12.59.34.mov
iOS: Native
Screen.Recording.2026-07-08.at.12.51.34.mov
iOS: mWeb Safari
Screen.Recording.2026-07-08.at.12.53.14.mov
MacOS: Chrome / Safari
Screen.Recording.2026-07-08.at.12.45.56.mov