Consolidate ConfirmModal instances into a global component v2#70111
Consolidate ConfirmModal instances into a global component v2#70111mollfpr merged 5 commits intoExpensify:mainfrom
Conversation
|
@alitoshmatov 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] |
|
@roryabraham @alitoshmatov deploy blockers reported here are now fixed Screen.Recording.2025-09-08.at.17.46.57.movScreen.Recording.2025-09-08.at.18.12.29.mov |
b4b5c3f to
55a7594
Compare
…t/promise-modal" This reverts commit 5953b32.
55a7594 to
1231148
Compare
|
Working on it |
|
@zirgulis When using tab to focus to "Cancel" button and pressing enter is still causing confirmation in modal. Screen.Recording.2025-09-10.at.5.45.19.PM.mov |
…to ft/single-ConfirmModal-instance
@alitoshmatov fixed, please check again |
|
@alitoshmatov code review please? |
Reviewer Checklist
Screenshots/VideosAndroid: HybridAppconfirm2-android.movAndroid: mWeb Chromeconfirm2-mweb.moviOS: HybridAppconfirm2-ios.mp4iOS: mWeb Safariconfirm2-safari.mp4MacOS: Chrome / Safariconfirm2-web.movMacOS: Desktopconfirm2-desktop.mov |
|
✋ This PR was not deployed to staging yet because QA is ongoing. It will be automatically deployed to staging after the next production release. |
|
🚀 Deployed to staging by https://github.com/mollfpr in version: 9.2.15-0 🚀
|
|
🚀 Deployed to production by https://github.com/Beamanator in version: 9.2.15-15 🚀
|
Explanation of Change
Currently the app suffers from component bloat in regards to
ConfirmModalinstances. Reduce the memory footprint and simplify working with modals by consolidatingConfirmModalinstances into a single component instance.Fixed Issues
$ #68799
$ #69730
$ #69711
Tests
a. Navigate to an expense report
b. Click "Export" → Select any export template
c. Verify: Export progress modal shows with "Export in progress" message
d. Verify: Modal cannot be cancelled (no cancel button)
e. Verify: Promise resolves correctly and clears selected transactions
A. Unapprove Report
a. Go to an approved, exported report
b. Click "More" → "Unapprove"
c. Verify: Warning modal appears about integration export
d. Click "Unapprove Report"
e. Verify: Report gets unapproved successfully
f. Test Cancel: Try again and click "Cancel" - verify nothing happens
B. Cancel Payment
a. Go to a report with pending payment
b. Click "More" → "Cancel Payment"
c. Verify: Confirmation modal appears
d. Click "Cancel Payment"
e. Verify: Payment is cancelled
f. Test Cancel: Try again and click "Dismiss" - verify nothing happens
C. Delete Report/Expenses
a. Go to report with single expense
b. Click "More" → "Delete"
c. Verify: Delete confirmation modal
d. Click "Delete" → Verify: Expense deleted and navigation works
a. Go to report with multiple expenses
b. Click "More" → "Delete"
c. Verify: Different modal text for multiple expenses
d. Click "Delete" → Verify: Entire report deleted
D. Reopen Exported Report
a. Go to closed, exported report
b. Click "More" → "Reopen Report"
c. Verify: Warning modal about reopening exported report
d. Click "Reopen Report"
e. Verify: Report reopens successfully
Selected Transactions Delete
a. Go to expense report
b. Select multiple transactions
c. Click bulk actions → "Delete"
d. Verify: Delete confirmation with count
e. Verify: After deletion, navigation handles correctly
Export Again Modal
a. Have a report that is exported to the accounting software (e.g. NetSuite)
b. Try to re-export an already exported report to the accounting software
c. Verify: "Export Again" modal appears
d. Click "Export Again"
e. Verify: Export proceeds
For each modal above, please test:
Offline tests
QA Steps
Same as in "Tests" section
PR Author Checklist
### Fixed Issuessection aboveTestssectionOffline stepssectionQA stepssectioncanBeMissingparam foruseOnyxtoggleReportand notonIconClick)src/languages/*files and using the translation methodSTYLE.md) were followedAvatar, I verified the components usingAvatarare working as expected)StyleUtils.getBackgroundAndBorderStyle(theme.componentBG))Avataris modified, I verified thatAvataris working as expected in all cases)Designlabel and/or tagged@Expensify/designso the design team can review the changes.ScrollViewcomponent to make it scrollable when more elements are added to the page.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.2025-08-26.at.17.12.31.mov
Android: mWeb Chrome
Screen.Recording.2025-08-26.at.17.29.02.mov
iOS: Native
Screen.Recording.2025-08-26.at.16.47.39.mov
iOS: mWeb Safari
Screen.Recording.2025-08-26.at.17.31.37.mov
MacOS: Chrome / Safari
Screen.Recording.2025-08-26.at.16.51.13.mov
MacOS: Desktop
Screen.Recording.2025-08-26.at.17.50.23.mov