[Payment due @ahmedGaber93] Redirect to Expensify Classic directly from the exit survey reason page#91924
[Payment due @ahmedGaber93] Redirect to Expensify Classic directly from the exit survey reason page#91924allgandalf wants to merge 10 commits into
Conversation
|
Hey, I noticed you changed If you want to automatically generate translations for other locales, an Expensify employee will have to:
Alternatively, if you are an external contributor, you can run the translation script locally with your own OpenAI API key. To learn more, try running: npx ts-node ./scripts/generateTranslations.ts --helpTypically, you'd want to translate only what you changed by running |
|
@ahmedGaber93 this is a follow up to the PR, we don't want to show the thank you screen after entering the reason |
There was a problem hiding this comment.
💡 Codex Review
Here are some automated review suggestions for this pull request.
Reviewed commit: 8534386fb8
ℹ️ About Codex in GitHub
Codex has been enabled to automatically review pull requests in this repo. Reviews are triggered when you
- Open a pull request for review
- Mark a draft as ready
- Comment "@codex review".
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".
Codecov Report✅ Changes either increased or maintained existing code coverage, great job!
|
|
@codex review |
|
Codex Review: Didn't find any major issues. Can't wait for the next one! ℹ️ 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". |
trjExpensify
left a comment
There was a problem hiding this comment.
Thanks for the quick work! 👍
Reviewer Checklist
Screenshots/VideosAndroid: HybridAppScreen.Recording.2026-05-29.at.7.52.45.PM.movAndroid: mWeb ChromeScreen.Recording.2026-05-29.at.4.49.26.PM.moviOS: HybridAppFailed to install the iOS App, but it should function as expected since this new flow is exclusively web-based. iOS: mWeb SafariScreen.Recording.2026-05-29.at.4.26.32.PM.movScreen.Recording.2026-05-29.at.4.18.49.PM.movMacOS: Chrome / SafariScreen.Recording.2026-05-29.at.4.14.52.PM.mov |
| const {top: safeAreaInsetsTop} = useSafeAreaInsets(); | ||
|
|
||
| const submitForm = useCallback(() => { | ||
| saveResponse(draftResponse); |
There was a problem hiding this comment.
nit: saveResponse doesn’t look like it’s used anywhere else, so we can remove it.
ahmedGaber93
left a comment
There was a problem hiding this comment.
NAB: Small cleanup comment #91924 (comment)
@allgandalf
|
🎯 @ahmedGaber93, thanks for reviewing and testing this PR! 🎉 A payment issue will be created for your review once this PR is deployed to production. If payment is not needed (e.g., regression PR review fix etc), react with 👎 to this comment to prevent the payment issue from being created. |
Explanation of Change
Follow-up to #89163, based on trj's comment asking whether we still need the second page in the Switch to Expensify Classic flow.
After the picker shipped, a
dismissed: falseuser who clicks "Switch to Expensify Classic" on the reason page lands onDynamicExitSurveyConfirmPage(the "Thanks for the feedback" screen) and has to click "Switch to Expensify Classic" again before the redirect happens. That second click is redundant now that the reason page is the decision point.This PR makes the reason page redirect straight to OldDot. The redirect logic that used to live on the confirm page button (
switchToOldDot+dismissModal+openOldDotLink) now runs directly from the reason page's "Switch to Expensify Classic" button, so the survey path no longer routes through the confirm page.The confirm page is kept. It is still reached by the "Quick tip" path, which a
dismissed: trueuser hits when they come back to NewDot 30+ days after switching and click "Switch to Expensify Classic" again (hasBeenInNewDot30Daysonly hides the button fordismissed: falseusers, sodismissed: trueusers still see it and land on the quick-tip screen). That path does not involve a survey selection, so it is out of scope of trj's question and is left untouched.Fixed Issues
$ https://github.com/Expensify/Expensify/issues/626358
PROPOSAL: N/A (internal work, follow-up requested on the issue thread)
Tests
Setup snippet to run in the DevTools console to put the test account into
dismissed: false:Helper to read the NVP back:
expensify.com/inbox. There should be no "Thanks for the feedback" page in between.true.false(no NVP write).Quick-tip path is unchanged and should still work:
9. Run
Onyx.merge('nvp_tryNewDot', {nudgeMigration: {timestamp: '2026-01-01 12:00:00'}, classicRedirect: {dismissed: true, timestamp: '2026-01-01 12:00:00'}});to simulate a user who switched over a month ago.10. Open Settings and click "Switch to Expensify Classic". You should still see the "Quick tip" screen, then "Take me to Expensify Classic" takes you to OldDot.
Offline tests
On web with
dismissed: false, open the reason page and toggle DevTools Network to Offline. Both buttons should be disabled. Toggle back online and they re-enable.QA Steps
Same as the Tests section, using the
Onyx.mergesetup snippet on staging.PR Author Checklist
### Fixed Issuessection aboveTestssectionOffline stepssectionQA stepssectiontoggleReportand notonIconClick)src/languages/*files and using the translation methodSTYLE.md) were followedAvatar, 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.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.Screen.Recording.2026-05-28.at.12.11.53.PM.mov