Repository navigation
[Payment due @ZhenjaHorbach] [NoQA][Wise][Release 1] Business - UI - Entry Point Wallet - #104366
Conversation
Codecov Report✅ Changes either increased or maintained existing code coverage, great job!
|
grgia
left a comment
There was a problem hiding this comment.
Let's make #104334 (review)
8a5b304 to
aab19de
Compare
|
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 bun ./scripts/generateTranslations.ts --helpTypically, you'd want to translate only what you changed by running |
0a9e2fe to
f99679e
Compare
This comment has been minimized.
This comment has been minimized.
|
@MelvinBot Review this |
|
@codex review |
Codex Review SummaryThis comment shows the latest Codex review activity on this pull request.
ℹ️ About Codex in GitHubYour team has set up Codex to review pull requests in this repo. Reviews are triggered when you
Codex reacts with 👀 while any review is running, comments if it has suggestions, and reacts with 👍 once all reviews finish with no findings. |
ReviewThe logic looks correct, and I found no blocking bugs. When the beta is off, the behavior is unchanged. I have three non-blocking points:
Translation nits (optional)Some new
Matching the wording would keep the header and heading consistent. In |
|
Codex Review: Didn't find any major issues. Breezy! Reviewed commit: ℹ️ 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". |
🦜 Polyglot Parrot! 🦜Squawk! Looks like you added some shiny new English strings. Allow me to parrot them back to you in other tongues: View the translation diffdiff --git a/src/languages/de.ts b/src/languages/de.ts
index aff85e69..85ff4ca4 100644
--- a/src/languages/de.ts
+++ b/src/languages/de.ts
@@ -2834,7 +2834,13 @@ const translations: TranslationDeepObject<typeof en> = {
accountRequiresAttention: 'Dieses Konto erfordert Ihre Aufmerksamkeit',
unlock: 'Entsperren',
},
- wiseGlobalReimbursementsIntro: {title: 'Globale Rückerstattungen einrichten?', subtitle: 'Zahlen Sie Mitglieder weltweit in ihrer lokalen Währung.', getStarted: "Los geht's"},
+ wiseGlobalReimbursementsIntro: {
+ title: 'Globale Rückerstattungen einrichten?',
+ subtitle: 'Zahlen Sie Mitglieder weltweit in ihrer lokalen Währung.',
+ getStarted: "Los geht's",
+ headerTitle: 'Globale Erstattungen',
+ },
+ wiseGlobalReimbursementsBanner: {title: 'Weltweit bezahlen', subtitle: 'Aktivieren Sie globale Erstattungen auf Ihrem USD-Konto.'},
},
addCardToDigitalWallet: {
title: ({walletName}: {walletName: string}) => `Karte zu ${walletName} hinzufügen`,
diff --git a/src/languages/el.ts b/src/languages/el.ts
index cda27383..db192b15 100644
--- a/src/languages/el.ts
+++ b/src/languages/el.ts
@@ -2890,7 +2890,13 @@ const translations: TranslationDeepObject<typeof en> = {
accountRequiresAttention: 'Αυτός ο λογαριασμός χρειάζεται προσοχή',
unlock: 'Ξεκλείδωμα',
},
- wiseGlobalReimbursementsIntro: {title: 'Να ρυθμιστούν οι παγκόσμιες αποζημιώσεις;', subtitle: 'Πληρώστε μέλη παγκοσμίως στο τοπικό τους νόμισμα.', getStarted: 'Ξεκινήστε'},
+ wiseGlobalReimbursementsIntro: {
+ title: 'Να ρυθμιστούν οι παγκόσμιες αποζημιώσεις;',
+ subtitle: 'Πληρώστε μέλη παγκοσμίως στο τοπικό τους νόμισμα.',
+ getStarted: 'Ξεκινήστε',
+ headerTitle: 'Παγκόσμιες αποζημιώσεις',
+ },
+ wiseGlobalReimbursementsBanner: {title: 'Πληρώστε ανθρώπους παγκοσμίως', subtitle: 'Ενεργοποιήστε τις παγκόσμιες αποζημιώσεις στον λογαριασμό USD σας.'},
},
addCardToDigitalWallet: {
title: ({walletName}: {walletName: string}) => `Προσθήκη κάρτας στο ${walletName}`,
diff --git a/src/languages/es.ts b/src/languages/es.ts
index d7ad5a7a..b37b4662 100644
--- a/src/languages/es.ts
+++ b/src/languages/es.ts
@@ -2744,7 +2744,13 @@ const translations: TranslationDeepObject<typeof en> = {
accountRequiresAttention: 'Esta cuenta requiere atención',
unlock: 'Desbloquear',
},
- wiseGlobalReimbursementsIntro: {title: '¿Configurar reembolsos globales?', subtitle: 'Paga a miembros de todo el mundo en su moneda local.', getStarted: 'Empieza'},
+ wiseGlobalReimbursementsIntro: {
+ title: '¿Configurar reembolsos globales?',
+ subtitle: 'Paga a miembros de todo el mundo en su moneda local.',
+ getStarted: 'Empieza',
+ headerTitle: 'Reembolsos globales',
+ },
+ wiseGlobalReimbursementsBanner: {title: 'Paga a personas de todo el mundo', subtitle: 'Habilita los reembolsos globales en tu cuenta en USD.'},
},
addCardToDigitalWallet: {
title: ({walletName}: {walletName: string}) => `Añadir tarjeta a ${walletName}`,
diff --git a/src/languages/fr.ts b/src/languages/fr.ts
index a089625e..f42e28ea 100644
--- a/src/languages/fr.ts
+++ b/src/languages/fr.ts
@@ -2843,7 +2843,9 @@ const translations: TranslationDeepObject<typeof en> = {
title: 'Configurer les remboursements globaux ?',
subtitle: 'Payez des membres partout dans le monde dans leur devise locale.',
getStarted: 'Commencer',
+ headerTitle: 'Remboursements globaux',
},
+ wiseGlobalReimbursementsBanner: {title: 'Payer des personnes dans le monde entier', subtitle: 'Activez les remboursements globaux sur votre compte en USD.'},
},
addCardToDigitalWallet: {
title: ({walletName}: {walletName: string}) => `Ajouter la carte à ${walletName}`,
diff --git a/src/languages/it.ts b/src/languages/it.ts
index 6eb2a2e9..c98a6d03 100644
--- a/src/languages/it.ts
+++ b/src/languages/it.ts
@@ -2823,7 +2823,13 @@ const translations: TranslationDeepObject<typeof en> = {
accountRequiresAttention: 'Questo conto richiede attenzione',
unlock: 'Sblocca',
},
- wiseGlobalReimbursementsIntro: {title: 'Configurare i rimborsi globali?', subtitle: 'Paga i membri in tutto il mondo nella loro valuta locale.', getStarted: 'Inizia'},
+ wiseGlobalReimbursementsIntro: {
+ title: 'Configurare i rimborsi globali?',
+ subtitle: 'Paga i membri in tutto il mondo nella loro valuta locale.',
+ getStarted: 'Inizia',
+ headerTitle: 'Rimborsi globali',
+ },
+ wiseGlobalReimbursementsBanner: {title: 'Paga persone in tutto il mondo', subtitle: 'Abilita i rimborsi globali sul tuo conto in USD.'},
},
addCardToDigitalWallet: {
title: ({walletName}: {walletName: string}) => `Aggiungi carta a ${walletName}`,
diff --git a/src/languages/ja.ts b/src/languages/ja.ts
index 58a13bfc..c34939dc 100644
--- a/src/languages/ja.ts
+++ b/src/languages/ja.ts
@@ -2802,7 +2802,13 @@ const translations: TranslationDeepObject<typeof en> = {
accountRequiresAttention: 'このアカウントには対応が必要です',
unlock: 'ロック解除',
},
- wiseGlobalReimbursementsIntro: {title: 'グローバル払い戻しを設定しますか?', subtitle: '世界中のメンバーに現地通貨で支払えます。', getStarted: '使い始める'},
+ wiseGlobalReimbursementsIntro: {
+ title: 'グローバル払い戻しを設定しますか?',
+ subtitle: '世界中のメンバーに現地通貨で支払えます。',
+ getStarted: '使い始める',
+ headerTitle: 'グローバル払い戻し',
+ },
+ wiseGlobalReimbursementsBanner: {title: '世界中の人に支払いましょう', subtitle: 'USD アカウントでグローバル払い戻しを有効にします。'},
},
addCardToDigitalWallet: {
title: ({walletName}: {walletName: string}) => `${walletName} にカードを追加`,
diff --git a/src/languages/nl.ts b/src/languages/nl.ts
index 55d382cb..aeb3da54 100644
--- a/src/languages/nl.ts
+++ b/src/languages/nl.ts
@@ -2827,7 +2827,13 @@ const translations: TranslationDeepObject<typeof en> = {
accountRequiresAttention: 'Deze account vereist aandacht',
unlock: 'Ontgrendelen',
},
- wiseGlobalReimbursementsIntro: {title: 'Wereldwijde terugbetalingen instellen?', subtitle: 'Betaal leden wereldwijd in hun eigen lokale valuta.', getStarted: 'Aan de slag'},
+ wiseGlobalReimbursementsIntro: {
+ title: 'Wereldwijde terugbetalingen instellen?',
+ subtitle: 'Betaal leden wereldwijd in hun eigen lokale valuta.',
+ getStarted: 'Aan de slag',
+ headerTitle: 'Wereldwijde terugbetalingen',
+ },
+ wiseGlobalReimbursementsBanner: {title: 'Betaal mensen wereldwijd', subtitle: 'Schakel wereldwijde terugbetalingen in op je USD-rekening.'},
},
addCardToDigitalWallet: {
title: ({walletName}: {walletName: string}) => `Kaart toevoegen aan ${walletName}`,
diff --git a/src/languages/pl.ts b/src/languages/pl.ts
index 17a89282..166cf3df 100644
--- a/src/languages/pl.ts
+++ b/src/languages/pl.ts
@@ -2861,7 +2861,13 @@ const translations: TranslationDeepObject<typeof en> = {
accountRequiresAttention: 'To konto wymaga uwagi',
unlock: 'Odblokuj',
},
- wiseGlobalReimbursementsIntro: {title: 'Skonfigurować globalne zwroty kosztów?', subtitle: 'Płać członkom na całym świecie w ich lokalnej walucie.', getStarted: 'Zacznij'},
+ wiseGlobalReimbursementsIntro: {
+ title: 'Skonfigurować globalne zwroty kosztów?',
+ subtitle: 'Płać członkom na całym świecie w ich lokalnej walucie.',
+ getStarted: 'Zacznij',
+ headerTitle: 'Globalne zwroty kosztów',
+ },
+ wiseGlobalReimbursementsBanner: {title: 'Płać ludziom na całym świecie', subtitle: 'Włącz globalne zwroty wydatków na swoim koncie w USD.'},
},
addCardToDigitalWallet: {
title: ({walletName}: {walletName: string}) => `Dodaj kartę do ${walletName}`,
diff --git a/src/languages/pt-BR.ts b/src/languages/pt-BR.ts
index 274d6290..e597da95 100644
--- a/src/languages/pt-BR.ts
+++ b/src/languages/pt-BR.ts
@@ -2818,7 +2818,13 @@ const translations: TranslationDeepObject<typeof en> = {
accountRequiresAttention: 'Esta conta precisa de atenção',
unlock: 'Desbloquear',
},
- wiseGlobalReimbursementsIntro: {title: 'Configurar reembolsos globais?', subtitle: 'Pague membros no mundo todo na moeda local deles.', getStarted: 'Começar'},
+ wiseGlobalReimbursementsIntro: {
+ title: 'Configurar reembolsos globais?',
+ subtitle: 'Pague membros no mundo todo na moeda local deles.',
+ getStarted: 'Começar',
+ headerTitle: 'Reembolsos globais',
+ },
+ wiseGlobalReimbursementsBanner: {title: 'Pague pessoas no mundo todo', subtitle: 'Ative reembolsos globais na sua conta em USD.'},
},
addCardToDigitalWallet: {
title: ({walletName}: {walletName: string}) => `Adicionar cartão à ${walletName}`,
diff --git a/src/languages/zh-hans.ts b/src/languages/zh-hans.ts
index 79dafb43..dfaa3be7 100644
--- a/src/languages/zh-hans.ts
+++ b/src/languages/zh-hans.ts
@@ -2728,7 +2728,8 @@ const translations: TranslationDeepObject<typeof en> = {
accountRequiresAttention: '此账户需要处理',
unlock: '解锁',
},
- wiseGlobalReimbursementsIntro: {title: '设置全球报销?', subtitle: '按当地货币向全球成员付款。', getStarted: '开始使用'},
+ wiseGlobalReimbursementsIntro: {title: '设置全球报销?', subtitle: '按当地货币向全球成员付款。', getStarted: '开始使用', headerTitle: '全球报销'},
+ wiseGlobalReimbursementsBanner: {title: '向全球付款', subtitle: '在您的美元账户中启用全球报销。'},
},
addCardToDigitalWallet: {
title: ({walletName}: {walletName: string}) => `将卡添加到 ${walletName}`,
Note You can apply these changes to your branch by copying the patch to your clipboard, then running |
I couldn't reproduce that, @ZhenjaHorbach Could you verify if it appears for you? |
|
Maybe it's an adhoc build issue @WojtekBoman |
| /** | ||
| * When user dismisses the Wallet global reimbursements banner, or starts global reimbursements onboarding, we store the timestamp here. | ||
| */ | ||
| [CONST.WISE_GLOBAL_REIMBURSEMENTS_WALLET_BANNER]: DismissedProductTrainingElement; |
There was a problem hiding this comment.
I need to Open an Auth PR adding WISE_GLOBAL_REIMBURSEMENTS_WALLET_BANNER = "wiseGlobalReimbursementsWalletBanner" to ALLOWED_TRAINING_NAMES in auth/command/DismissProductTraining.h, and hold this PR on it.
Will we be using this pattern for any other banners or entry points that I should add in that PR?
There was a problem hiding this comment.
We dont need to HOLD on it TBH since it's under beta
No |
Reviewer Checklist
Screenshots/VideosAndroid: HybridAppScreen.Recording.2026-10-20.at.13.18.37.movAndroid: mWeb ChromeScreen.Recording.2026-10-20.at.13.18.37.moviOS: HybridAppScreen.Recording.2026-10-20.at.13.08.07.moviOS: mWeb SafariScreen.Recording.2026-10-20.at.13.14.05.movMacOS: Chrome / SafariScreen.Recording.2026-10-20.at.13.02.26.movScreen.Recording.2026-10-20.at.13.26.46.mov |
grgia
left a comment
There was a problem hiding this comment.
LGTM. I'm fine merging before https://github.com/Expensify/Auth/pull/25678/changes given the beta
|
Also LGTM |
|
🎯 @ZhenjaHorbach, 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. |
|
🚧 joekaufmanexpensify has triggered a test Expensify/App build. You can view the workflow run here. |
This comment has been minimized.
This comment has been minimized.
|
Let me know if you will address #104366 (comment) |
|
✋ This PR was not deployed to staging yet because QA is ongoing. It will be automatically deployed to staging after the next production release. |
|
Otherwise, working well! |
|
🚧 grgia 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/grgia in version: 9.5.15-1 🚀
|
|
No help site update is needed. Every user-facing change in this PR is behind the |
|
🚀 Deployed to production by https://github.com/grgia in version: 9.5.15-3 🚀
Bundle Size Analysis (Sentry): |


Explanation of Change
Behind the
wiseReimbursementsbeta, Wallet gets two entry points to the Wise intro page: the three-dot "Enable global reimbursements" item (replacing Corpay) and a new dismissible banner for the most recently added eligible account. Dismissing the banner, or pressing "Get started" on the intro page, hides it permanently viadismissProductTraining. Beta off: unchanged.Fixed Issues
$ https://github.com/Expensify/Expensify/issues/692498
PROPOSAL:
Tests
Test 1 - Banner
wiseReimbursementsbeta enabled and two verified (OPEN) USD business bank accountsTest 2 - Banner hides once onboarding starts
Test 3 - Three-dot menu and beta gating
wiseReimbursementsbeta and reload WalletOffline tests
QA Steps
Same as tests
PR Author Checklist
### Fixed Issuessection aboveTestssectionOffline stepssectionQA stepssectionAvatar, I verified the components usingAvatarare working as expected)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
iOS: mWeb Safari
MacOS: Chrome / Safari
Screen.Recording.2026-10-20.at.10.50.12.mov