Repository navigation
Allow required 2FA setup through the migrated-user welcome modal - #102629
luacmartins merged 3 commits into
Conversation
Enable was blocked because the welcome-modal guard drops every navigation except Back and Dismiss. Let the same required-2FA exception used by onboarding through, and keep every other navigation blocked.
|
@thelullabyy 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] |
|
This PR adds a new |
Codecov Report✅ Changes either increased or maintained existing code coverage, great job!
|
The new subscriptions run outside React render, so they need a connectWithoutView comment. The test type also used a forbidden import() annotation.
|
working on checklist and video recordings |
|
@neerajbachani Let me know when the PR is ready for review, thanks |
|
@neerajbachani How is it? |
…d-welcome-modal-2fa
|
This PR adds a new |
|
@thelullabyy PR is ready for review, thanks!! |
Reviewer Checklist
Screenshots/VideosAndroid: HybridAppAndroid: mWeb ChromeiOS: HybridAppiOS: mWeb SafariMacOS: Chrome / SafariScreen.Recording.2026-10-08.at.00.39.10.mov |
|
@MelvinBot Review this PR |
PR ReviewThe fix looks correct, and it is scoped to the bug. I'd request one change before merge: move the copied 2FA helpers into one shared place. Correctness: no issues found.
Requested change: duplicated code (CONSISTENCY-3)
To fix this, move these helpers and their two Onyx subscriptions into one shared module (for example, Nit: test mock The mock in PR body: the Verification notes
|
|
@neerajbachani Could you please update the PR description to use latest template? Thanks |
@thelullabyy Done |
|
✋ This PR was not deployed to staging yet because QA is ongoing. It will be automatically deployed to staging after the next production release. |
|
🚧 luacmartins 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/luacmartins in version: 9.5.6-0 🚀
|
|
No help site update needed. This bug fix makes Enable on the required 2FA screen open the setup flow, as users would expect. It doesn't make any sentence in Two-Factor Authentication or other articles wrong. |
|
🚀 Deployed to production by https://github.com/puneetlath in version: 9.5.6-6 🚀
Bundle Size Analysis (Sentry): |
Enable was blocked because the welcome-modal guard drops every navigation except Back and Dismiss. Let the same required-2FA exception used by onboarding through, and keep every other navigation blocked.
Explanation of Change
MigratedUserWelcomeModalGuardblocks every navigation except Back and Dismiss while the migrated-user welcome modal is the top route. Enable callsNavigation.navigateinto the 2FA setup screen, so the guard dropped that action and the URL flipped back to/migrated-user-welcome. Sign out was unaffected because it does not take that navigation path.This change allows that navigation only when required 2FA setup is active and the action targets a 2FA setup screen, using the same
shouldShowRequire2FAPage/isForced2FAOnboardingSetupexception already used byOnboardingGuard. The welcome modal stays on the stack. Tab switches and every other navigation stay blocked until the user dismisses the modal.Fixed Issues
$ #102577
PROPOSAL:
Tests
/migrated-user-welcome. Do not click Got it./migrated-user-welcome.Offline tests
QA Steps
Use an account migrated from Expensify Classic to New Expensify that has never dismissed Welcome to New Expensify. The Classic domain must require 2FA, and this user must not have finished 2FA setup. Sign in as that user directly, not through Copilot or Supportal. A user who already enabled 2FA in Classic will not see this screen.
/migrated-user-welcome. The welcome modal is underneath this screen, so Let's go! is not visible./migrated-user-welcomeURL./migrated-user-welcome.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
Screen.Recording.2026-10-04.at.9.38.05.PM.mov
Screen.Recording.2026-10-03.at.10.40.44.PM.mov
Android: mWeb Chrome
WhatsApp.Video.2026-10-04.at.21.48.14.mp4
WhatsApp.Video.2026-10-03.at.23.15.14.mp4
iOS: Native
Screen.Recording.2026-10-04.at.9.34.31.PM.online-video-cutter.com.mp4
Screen.Recording.2026-10-03.at.10.26.24.PM.mov
iOS: mWeb Safari
Screen.Recording.2026-10-04.at.9.35.22.PM.mov
Screen.Recording.2026-10-03.at.10.30.08.PM.mov
MacOS: Chrome / Safari
Screen.Recording.2026-10-04.at.9.18.44.PM.mov
Screen.Recording.2026-10-03.at.10.09.30.PM.mov