fix: Frozen card cannot be replaced, but confirmation page show success description #88831
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 |
There was a problem hiding this comment.
Pull request overview
Updates the “Report virtual card fraud” confirmation screen copy so that users with a frozen virtual Expensify Card aren’t incorrectly told a replacement card will be issued.
Changes:
- Selects an alternate confirmation description when the affected card is in a suspended/frozen state.
- Adds a new
reportFraudConfirmationPage.descriptionCardNotReplacedtranslation string across supported languages.
Reviewed changes
Copilot reviewed 11 out of 11 changed files in this pull request and generated 3 comments.
Show a summary per file
| File | Description |
|---|---|
| src/pages/settings/Wallet/ReportVirtualCardFraudConfirmationPage.tsx | Chooses between the standard vs. “card not replaced” confirmation description based on card status. |
| src/languages/en.ts | Adds new localized string for the “card not replaced while frozen” scenario. |
| src/languages/de.ts | Adds new localized string for the “card not replaced while frozen” scenario. |
| src/languages/es.ts | Adds new localized string for the “card not replaced while frozen” scenario. |
| src/languages/fr.ts | Adds new localized string for the “card not replaced while frozen” scenario. |
| src/languages/it.ts | Adds new localized string for the “card not replaced while frozen” scenario. |
| src/languages/ja.ts | Adds new localized string for the “card not replaced while frozen” scenario. |
| src/languages/nl.ts | Adds new localized string for the “card not replaced while frozen” scenario. |
| src/languages/pl.ts | Adds new localized string for the “card not replaced while frozen” scenario. |
| src/languages/pt-BR.ts | Adds new localized string for the “card not replaced while frozen” scenario. |
| src/languages/zh-hans.ts | Adds new localized string for the “card not replaced while frozen” scenario. |
💡 Add Copilot custom instructions for smarter, more guided reviews. Learn how to get started.
Codecov Report✅ Changes either increased or maintained existing code coverage, great job!
|
There was a problem hiding this comment.
💡 Codex Review
Here are some automated review suggestions for this pull request.
Reviewed commit: 3d01e5df1d
ℹ️ 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".
|
I am not sure about the solution we decided on here. Let's discuss. |
…and update optimistic/failure data in reportVirtualExpensifyCardFraud function
…age in cardTerminatedWithoutReplacement case
|
Updated the PR to meet the latest requirements. |
|
@eh2077 could you please review this PR? Thanks! |
Reviewer Checklist
Screenshots/VideosAndroid: HybridAppScreen.Recording.2026-05-22.at.12.26.41.AM.movScreen.Recording.2026-05-22.at.12.27.03.AM.mov
Android: mWeb ChromeScreen.Recording.2026-05-22.at.12.19.08.AM.moviOS: HybridAppScreen.Recording.2026-05-22.at.12.21.57.AM.moviOS: mWeb SafariScreen.Recording.2026-05-22.at.12.17.40.AM.movMacOS: Chrome / SafariScreen.Recording.2026-05-22.at.12.09.57.AM.mov |
|
I can hardly test the issue as the magic code command ResendValidateCode is strictly rate limited. It seems limit access by account, so switch IP with VPN doesn't work. @samranahm @MariaHCD do you have any ideas to mitigate this?
|
|
@eh2077 Yes this happens a lot with me too during testing but I retry after 5-7 minutes and get the code successfully. |
|
@MariaHCD @dominictb Can you help regarding this? |
@eh2077 Please try this. Create the new workspace and connect bank account on |
|
@dominictb tried with a new workspace but got error Screen.Recording.2026-05-21.at.11.04.45.PM.mov |
|
@samranahm Mind assigning virtual cards to my tests accounts from your workspace, so I can continue test? |
|
Hmm, okay, strange - I have a test card workspace. @eh2077 I will assign two cards to ericwdev001+d3@gmail.com
|
|
@eh2077 I've issued these two cards to ericwdev001+d3@gmail.com
|
eh2077
left a comment
There was a problem hiding this comment.
@MariaHCD Thanks for the help!
looks good and works well, checklist here #88831 (comment)
Sorry @eh2077 for the late response, I was traveling. Happy to see @MariaHCD already assigned the cards and all tests passed! |
There was a problem hiding this comment.
Looks good overall!
@samranahm I noticed that your screen recordings might not be up-to-date. Could you double check, please? We want to make sure the recordings reflect the actual changes in the PR.
|
Ahh, these're outdated copies and I forgot to update the videos. I'll upload the new recordings shortly. |
|
@MariaHCD I've updated the videos please take a look. |
|
@samranahm looks like there's a merge conflict, could you merge main? 👀 |
|
@MariaHCD conflict clear and PR ready, please take a look |
|
🚧 @MariaHCD 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! 🧪🧪
|
|
✋ 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/MariaHCD in version: 9.3.81-0 🚀
|
|
Yes, help site changes are needed. PR #88831 introduces a new scenario where reporting fraud on an admin-frozen card deactivates it without automatic replacement — the user must contact their admin for a new card. The article Draft PR created: #91595 Changes:
|
|
@samranahm @joekaufmanexpensify @MariaHCD @eh2077 Could you please confirm what is the expected result for step 6 test 2? We get that system message in workspace chat, but not in Admin room. Is this WAD or we should create an issue? bandicam.2026-05-25.16-34-04-389.mp4 |
|
@jponikarchuk the system message should be in the cardholder's workspace chat not in the admins room! So it is working as designed - just that there was a typo in the test instructions. |
|
My bad, that was just muscle memory from the system messages in the admins room. Thanks @MariaHCD for correcting it 🙌. |
|
🚀 Deployed to production by https://github.com/luacmartins in version: 9.3.81-2 🚀
|





Explanation of Change
Fixed Issues
$ #84776
PROPOSAL: #84776 (comment)
Tests
Precondition:
Test - 01
Test - 02
Offline tests
QA Steps
Same as test
// TODO: These must be filled out, or the issue title must include "[No QA]."
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.Screenshots/Videos
Android: Native
Android.Native.mp4
Android: mWeb Chrome
Android.mWeb.Chrome.mp4
iOS: Native
IOS.Native.mp4
iOS: mWeb Safari
IOS.mWeb.Safari.mp4
MacOS: Chrome / Safari
macOS.Chrome.Admin.frozen.card.mov