Repository navigation
Extract Report Details menu rows into self-subscribing components - #102988
Conversation
Codecov Report✅ Changes either increased or maintained existing code coverage, great job!
|
|
@MelvinBot review |
Review: no blocking issues ✅I compared every extracted row with the Non-blocking notes
What I checked
|
|
@nkdengineer 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] |
|
About Melvin's review: nothing blocking so I will not change anything. 1 and 2 will be handled in PR 8 once the track rows are extracted and the draft subscription moves with them. |
Reviewer Checklist
Screenshots/VideosAndroid: HybridAppScreen.Recording.2026-10-07.at.00.09.40.movAndroid: mWeb ChromeScreen.Recording.2026-10-07.at.00.00.37.moviOS: HybridAppScreen.Recording.2026-10-07.at.00.09.19.moviOS: mWeb SafariScreen.Recording.2026-10-07.at.00.01.04.movMacOS: Chrome / SafariScreen.Recording.2026-10-06.at.23.52.33.movScreen.Recording.2026-10-06.at.23.53.18.movScreen.Recording.2026-10-06.at.23.53.44.movScreen.Recording.2026-10-06.at.23.54.25.movScreen.Recording.2026-10-06.at.23.55.13.movScreen.Recording.2026-10-06.at.23.56.11.mov |
|
PR doesn’t need product input as a performance refactor PR. Unassigning and unsubscribing myself. |
|
🚧 mjasikowski has triggered a test Expensify/App build. You can view the workflow run here. |
|
✋ This PR was not deployed to staging yet because QA is ongoing. It will be automatically deployed to staging after the next production release. |
|
🧪🧪 Use the links below to test this adhoc build on Android, iOS, and Web. Happy testing! 🧪🧪
|
|
🚀 Deployed to staging by https://github.com/mjasikowski in version: 9.5.5-0 🚀
|
|
No help site update needed. This PR refactors the Report details menu into separate components without changing any row labels, order, visibility rules, or behavior, so no help article sentence becomes incorrect. |
|
🚀 Deployed to production by https://github.com/puneetlath in version: 9.5.5-2 🚀
Bundle Size Analysis (Sentry): |
Explanation of Change
This moves the menu rows of the Report Details page out of the page into a new
ReportDetailsMenuItemscomponent and eight row components: GoToRoom, MembersOrInvite, Settings, PrivateNotes, MarkAsIncomplete, GoToWorkspace, Leave and Debug. A smalluseIsRoomCurrentlyOpenhook goes with them. Each row takes onlyreportID, opens its own Onyx subscriptions, decides on its own whether it is visible and rendersMenuItemdirectly. There is no items array and no shared row wrapper, so a row only re-renders when the data it reads changes.ReportDetailsMenuItemskeeps the self DM and archived room checks that empty the menu. It still renders the four track expense rows inline, with their own subscriptions, until the last PR in the stack extracts them.ReportDetailsActionsandReportDetailsRequestActionsnow renderReportDetailsMenuItemsdirectly, so therenderMenurender prop added in the previous PR is gone. The page itself drops from 19 to 2useOnyxcalls.The row order does not change. I compared it against
mainfor a self DM, an archived room, a group chat, an invite only room, a room that is open behind the page, a completed task and a track expense. A new unit test checks the order for each of these cases and checks that a chat opens no transaction subscription.Deviations from the plan:
DynamicReportDetailsPageMenuItemtype is removed because nothing uses it anymore.ReportDetailsActionsTestis updated for the removedrenderMenuprop.Stack note: this is PR 6 of 8 in the
DynamicReportDetailsPagedecomposition (parent issue #102173).Performance:

Fixed Issues
$ #102181
PROPOSAL:
Tests
main, and each row navigates or acts as beforemain, and Members, Settings, Private notes, Leave and Go to workspace behave as beforemain, and each row navigates or acts as beforemainand each one opens the same flow as beforemainOffline tests
N/A
QA Steps
Same as tests
PR Author Checklist
### Fixed Issuessection aboveTestssectionOffline stepssectionQA stepssectionAvatar, 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
Android: mWeb Chrome
iOS: Native
Nagranie.z.ekranu.2026-10-6.o.14.52.19.mov
iOS: mWeb Safari
MacOS: Chrome / Safari
Nagranie.z.ekranu.2026-10-6.o.14.17.48.mov