Skip to content

[Payment due @ZhenjaHorbach] [NoQA][Wise][Release 1] Business - UI - Entry Point Wallet - #104366

Merged
grgia merged 12 commits into
Expensify:mainfrom
software-mansion-labs:wise-global-reimbursements-wallet-entry-point
Oct 20, 2026
Merged

grgia merged 12 commits into
Expensify:mainfrom
software-mansion-labs:wise-global-reimbursements-wallet-entry-point

Conversation

@WojtekBoman

@WojtekBoman WojtekBoman commented Oct 19, 2026 •

Copy link
Copy Markdown
Contributor

Explanation of Change

Behind the wiseReimbursements beta, 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 via dismissProductTraining. Beta off: unchanged.

Fixed Issues

$ https://github.com/Expensify/Expensify/issues/692498
PROPOSAL:

Tests

Test 1 - Banner

  1. Sign in with an account that has the wiseReimbursements beta enabled and two verified (OPEN) USD business bank accounts
  2. Navigate to Account > Wallet
  3. Verify that the "Pay people worldwide" banner is shown above Bank accounts, with "Get started" and a close (X) button
  4. Click "Get started"
  5. Verify that the "Set up global reimbursements?" intro page opens for the most recently added account, with "Global reimbursements" in the header
  6. Go back, click the X on the banner and reload the page
  7. Verify that the banner stays hidden and the three-dot "Enable global reimbursements" item is still available on both accounts

Test 2 - Banner hides once onboarding starts

  1. With an account where the banner has not been dismissed, navigate to Account > Wallet
  2. Open the three-dot menu on an eligible account and click "Enable global reimbursements"
  3. Click "Get started" on the intro page, go back to Wallet and reload
  4. Verify that the banner is no longer shown

Test 3 - Three-dot menu and beta gating

  1. With the beta enabled, open the three-dot menu on a personal or non-USD bank account
  2. Verify that "Enable global reimbursements" is not shown
  3. Disable the wiseReimbursements beta and reload Wallet
  4. Verify that the banner is not shown and the three-dot "Enable global reimbursements" item on the USD business account opens the existing Corpay flow (registration number step)
  • Verify that no errors appear in the JS console

Offline tests

  1. With the beta enabled and the banner visible, go offline
  2. Click the X on the banner
  3. Verify that the banner disappears immediately
  4. Go online and reload Wallet
  5. Verify that the banner stays hidden

QA Steps

Same as tests

  • Verify that no errors appear in the JS console

PR Author Checklist

  • I linked the correct issue in the ### Fixed Issues section above
  • I wrote clear testing steps that cover the changes made in this PR
    • I added steps for local testing in the Tests section
    • I added steps for the expected offline behavior in the Offline steps section
    • I added steps for Staging and/or Production testing in the QA steps section
    • I added steps to cover failure scenarios (i.e. verify an input displays the correct error message if the entered data is not correct)
    • I turned off my network connection and tested it while offline to ensure it matches the expected behavior (i.e. verify the default avatar icon is displayed if app is offline)
    • I tested this PR with a High Traffic account against the staging or production API to ensure there are no regressions (e.g. long loading states that impact usability).
  • I included screenshots or videos for tests on all platforms
  • I ran the tests on all platforms & verified they passed on:
    • Android: Native
    • Android: mWeb Chrome
    • iOS: Native
    • iOS: mWeb Safari
    • MacOS: Chrome / Safari
  • I verified there are no console errors (if there's a console error not related to the PR, report it or open an issue for it to be fixed)
  • I verified any copy / text that was added to the app is either coming verbatim from figma or has been approved by marketing (in order to get marketing approval, ask the Bug Zero team member to add the Waiting for copy label to the issue)
  • If a new code pattern is added I verified it was agreed to be used by multiple Expensify engineers
  • I tested other components that can be impacted by my changes (i.e. if the PR modifies a shared library or component like Avatar, I verified the components using Avatar are working as expected)
  • If new assets were added or existing ones were modified, I verified that:
    • The assets are optimized and compressed (for SVG files, run npm run compress-svg)
    • The assets load correctly across all supported platforms.
  • If the PR modifies code that runs when editing or sending messages, I tested and verified there is no unexpected behavior for all supported markdown - URLs, single line code, code blocks, quotes, headings, bold, strikethrough, and italic.
  • If the PR modifies a generic component, I tested and verified that those changes do not break usages of that component in the rest of the App (i.e. if a shared library or component like Avatar is modified, I verified that Avatar is working as expected in all cases)
  • If the PR modifies a component related to any of the existing Storybook stories, I tested and verified all stories for that component are still working as expected.
  • If the PR modifies a component or page that can be accessed by a direct deeplink, I verified that the code functions as expected when the deeplink is used - from a logged in and logged out account.
  • If the PR modifies the UI (e.g. new buttons, new UI components, changing the padding/spacing/sizing, moving components, etc) or modifies the form input styles:
    • I verified that all the inputs inside a form are aligned with each other.
    • I added Design label and/or tagged @Expensify/design so the design team can review the changes.
  • If the PR adds or modifies the UI:
    • I asked an AI agent to review the changes for accessibility issues and addressed its findings.
    • I tested with a screen reader (VoiceOver on macOS) and verified all new/changed elements are reachable with a logical focus order.
    • I verified all new/changed elements have meaningful accessible names and roles.
    • I verified state changes are announced (e.g. checked/unchecked, expanded/collapsed, selected).
  • I added unit tests for any new feature or bug fix in this PR to help automatically prevent regressions in this user flow.
  • If the main branch was merged into this PR after a review, I tested again and verified the outcome was still expected according to the Test steps.

Screenshots/Videos

Android: Native
Android: mWeb Chrome
iOS: Native
iOS: mWeb Safari
MacOS: Chrome / Safari Screenshot 2026-10-20 at 10 44 24 Screenshot 2026-10-20 at 10 44 42
Screen.Recording.2026-10-20.at.10.50.12.mov

@WojtekBoman WojtekBoman changed the title feat: show Wise global reimbursements menu item on Wallet behind beta [NoQA][Wise][Release 1] Business - UI - Entry Point Wallet Oct 19, 2026
@codecov

codecov Bot commented Oct 19, 2026 •

Copy link
Copy Markdown

Codecov Report

✅ Changes either increased or maintained existing code coverage, great job!

Files with missing lines Coverage Δ
src/CONST/index.ts 95.90% <ø> (ø)
src/libs/BankAccountUtils.ts 95.16% <100.00%> (+0.61%) ⬆️
src/types/onyx/DismissedProductTraining.ts 0.00% <ø> (ø)
...tings/Wallet/WiseGlobalReimbursementsIntroPage.tsx 0.00% <0.00%> (ø)
src/pages/settings/Wallet/WalletPage/index.tsx 0.00% <0.00%> (ø)
...settings/Wallet/WiseGlobalReimbursementsBanner.tsx 0.00% <0.00%> (ø)
... and 56 files with indirect coverage changes

@grgia grgia left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Let's make #104334 (review)

@WojtekBoman
WojtekBoman force-pushed the wise-global-reimbursements-wallet-entry-point branch from 8a5b304 to aab19de Compare October 20, 2026 06:19
@melvin-bot

melvin-bot Bot commented Oct 20, 2026

Copy link
Copy Markdown

Hey, I noticed you changed src/languages/en.ts in a PR from a fork. For security reasons, translations are not generated automatically for PRs from forks.

If you want to automatically generate translations for other locales, an Expensify employee will have to:

  1. Look at the code and make sure there are no malicious changes.
  2. Run the Generate static translations GitHub workflow. If you have write access and the K2 extension, you can simply click: [this button]

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 --help

Typically, you'd want to translate only what you changed by running npx bun ./scripts/generateTranslations.ts --compare-ref main

@WojtekBoman
WojtekBoman force-pushed the wise-global-reimbursements-wallet-entry-point branch from 0a9e2fe to f99679e Compare October 20, 2026 07:44
@OSBotify

This comment has been minimized.

@WojtekBoman

Copy link
Copy Markdown
Contributor Author

@MelvinBot Review this

@WojtekBoman

Copy link
Copy Markdown
Contributor Author

@codex review

@chatgpt-codex-connector

chatgpt-codex-connector Bot commented Oct 20, 2026 •

Copy link
Copy Markdown

Codex Review Summary

This comment shows the latest Codex review activity on this pull request.

Review Status Commit Review trigger
📝 Code Review ✅ Completed 2026-10-20T10:04:12.717515Z 2f887c5 Draft marked ready
ℹ️ About Codex in GitHub

Your team has set up Codex to 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" or "@codex security review".

Codex reacts with 👀 while any review is running, comments if it has suggestions, and reacts with 👍 once all reviews finish with no findings.

@MelvinBot

Copy link
Copy Markdown
Contributor

Review

The logic looks correct, and I found no blocking bugs. When the beta is off, the behavior is unchanged. isEligibleForWiseGlobalReimbursements uses the same four checks as the inline condition it replaces: USD, business, no Corpay verification, and OPEN. See BankAccountUtils.ts:142-149.

I have three non-blocking points:

  1. When the beta is on, users can't reach Corpay from Wallet. The menu item now opens the intro page. The intro page's "Get started" button is still a no-op (onButtonPress={() => {}}, WiseGlobalReimbursementsIntroPage.tsx:83). This is fine if beta users are only internal testers. Please confirm that's the plan.
  2. The beta checks differ. Wallet uses isBetaEnabled (WalletPage/index.tsx:116). The intro page uses isBetaEnabledOrUnknown. While betas are still loading, Wallet sends users to Corpay. This is the safe direction, so I'm noting it only as information.
  3. Another entry point still opens Corpay when the beta is on. The pay-time prompt in EnableGlobalReimbursementsPayModal.tsx:47-58 always goes to Corpay. If that's planned for a follow-up, you can ignore this.
Translation nits (optional)

Some new headerTitle strings use a different word than the existing title on the same page:

  • de: Globale Erstattungen vs Globale Rückerstattungen einrichten?
  • ja: グローバル精算 vs グローバル払い戻しを設定しますか?
  • pl: Globalne zwroty vs globalne zwroty kosztów

Matching the wording would keep the header and heading consistent. In en.ts, headerTitle comes first in the object, but the other locales add it last. This is cosmetic only.

@chatgpt-codex-connector

Copy link
Copy Markdown

Codex Review: Didn't find any major issues. Breezy!

Reviewed commit: 14cddb7b3d

ℹ️ 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".

@OSBotify

Copy link
Copy Markdown
Contributor

🦜 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 diff
diff --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 pbpaste | git apply 😉

View workflow run

@WojtekBoman
WojtekBoman marked this pull request as ready for review October 20, 2026 09:47
@WojtekBoman
WojtekBoman requested review from a team as code owners October 20, 2026 09:47
@WojtekBoman

Copy link
Copy Markdown
Contributor Author
image seeing loads of this error on the wallet page

I couldn't reproduce that, @ZhenjaHorbach Could you verify if it appears for you?

@grgia

grgia commented Oct 20, 2026

Copy link
Copy Markdown
Contributor

Maybe it's an adhoc build issue @WojtekBoman

Comment thread src/libs/BankAccountUtils.ts Outdated
/**
* 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;

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

@WojtekBoman

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?

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

We dont need to HOLD on it TBH since it's under beta

@ZhenjaHorbach

Copy link
Copy Markdown
Contributor
image seeing loads of this error on the wallet page

I couldn't reproduce that, @ZhenjaHorbach Could you verify if it appears for you?

No
Everything is good for me

@ZhenjaHorbach

ZhenjaHorbach commented Oct 20, 2026 •

Copy link
Copy Markdown
Contributor

Reviewer Checklist

  • I have verified the author checklist is complete (all boxes are checked off).
  • I verified the correct issue is linked in the ### Fixed Issues section above
  • I verified testing steps are clear and they cover the changes made in this PR
    • I verified the steps for local testing are in the Tests section
    • I verified the steps for Staging and/or Production testing are in the QA steps section
    • I verified the steps cover any possible failure scenarios (i.e. verify an input displays the correct error message if the entered data is not correct)
    • I turned off my network connection and tested it while offline to ensure it matches the expected behavior (i.e. verify the default avatar icon is displayed if app is offline)
  • I checked that screenshots or videos are included for tests on all platforms
  • I included screenshots or videos for tests on all platforms
  • I verified that the composer does not automatically focus or open the keyboard on mobile unless explicitly intended. This includes checking that returning the app from the background does not unexpectedly open the keyboard.
  • I verified tests pass on all platforms & I tested again on:
    • Android: HybridApp
    • Android: mWeb Chrome
    • iOS: HybridApp
    • iOS: mWeb Safari
    • MacOS: Chrome / Safari
  • If there are any errors in the console that are unrelated to this PR, I either fixed them (preferred) or linked to where I reported them in Slack
  • I verified any copy / text that was added to the app is either coming verbatim from figma or has been approved by marketing (in order to get marketing approval, ask the Bug Zero team member to add the Waiting for copy label to the issue)
  • If a new code pattern is added I verified it was agreed to be used by multiple Expensify engineers
  • I verified other components that can be impacted by these changes have been tested, and I retested again (i.e. if the PR modifies a shared library or component like Avatar, I verified the components using Avatar have been tested & I retested again)
  • If a new component is created I verified that:
    • A similar component doesn't exist in the codebase
    • All props are defined accurately
    • The component has a clear name that is non-ambiguous and the purpose of the component can be inferred from the name alone
    • The only data being stored in the state is data necessary for rendering and nothing else
    • The component has the minimum amount of code necessary for its purpose, and it is broken down into smaller components in order to separate concerns and functions
  • If the PR modifies code that runs when editing or sending messages, I tested and verified there is no unexpected behavior for all supported markdown - URLs, single line code, code blocks, quotes, headings, bold, strikethrough, and italic.
  • If the PR modifies a generic component, I tested and verified that those changes do not break usages of that component in the rest of the App (i.e. if a shared library or component like Avatar is modified, I verified that Avatar is working as expected in all cases)
  • If the PR modifies a component related to any of the existing Storybook stories, I tested and verified all stories for that component are still working as expected.
  • If the PR modifies a component or page that can be accessed by a direct deeplink, I verified that the code functions as expected when the deeplink is used - from a logged in and logged out account.
  • If the PR modifies the UI (e.g. new buttons, new UI components, changing the padding/spacing/sizing, moving components, etc) or modifies the form input styles:
    • I verified that all the inputs inside a form are aligned with each other.
    • I added Design label and/or tagged @Expensify/design so the design team can review the changes.
  • If the PR adds or modifies the UI:
    • I asked an AI agent to review the changes for accessibility issues and addressed its findings.
    • I tested with a screen reader (VoiceOver on macOS) and verified all new/changed elements are reachable with a logical focus order.
    • I verified all new/changed elements have meaningful accessible names and roles.
    • I verified state changes are announced (e.g. checked/unchecked, expanded/collapsed, selected).
  • For any bug fix or new feature in this PR, I verified that sufficient unit tests are included to prevent regressions in this flow.
  • If the main branch was merged into this PR after a review, I tested again and verified the outcome was still expected according to the Test steps.
  • I have checked off every checkbox in the PR reviewer checklist, including those that don't apply to this PR.

Screenshots/Videos

Android: HybridApp
Screen.Recording.2026-10-20.at.13.18.37.mov
Android: mWeb Chrome
Screen.Recording.2026-10-20.at.13.18.37.mov
iOS: HybridApp
Screen.Recording.2026-10-20.at.13.08.07.mov
iOS: mWeb Safari
Screen.Recording.2026-10-20.at.13.14.05.mov
MacOS: Chrome / Safari
Screen.Recording.2026-10-20.at.13.02.26.mov
Screen.Recording.2026-10-20.at.13.26.46.mov

grgia
grgia previously approved these changes Oct 20, 2026

@grgia grgia left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

LGTM. I'm fine merging before https://github.com/Expensify/Auth/pull/25678/changes given the beta

@ZhenjaHorbach

Copy link
Copy Markdown
Contributor

Also LGTM
One minor comment
But we can merge !

@melvin-bot
melvin-bot Bot requested a review from grgia October 20, 2026 12:10
@melvin-bot melvin-bot Bot changed the title [NoQA][Wise][Release 1] Business - UI - Entry Point Wallet [Payment due @ZhenjaHorbach] [NoQA][Wise][Release 1] Business - UI - Entry Point Wallet Oct 20, 2026
@melvin-bot

melvin-bot Bot commented Oct 20, 2026

Copy link
Copy Markdown

🎯 @ZhenjaHorbach, thanks for reviewing and testing this PR! 🎉

A payment issue will be created for your review once this PR is deployed to production.
E/E issue linked to the PR - https://www.github.com/Expensify/Expensify/issues/692498.

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.

@github-actions

Copy link
Copy Markdown
Contributor

🚧 joekaufmanexpensify has triggered a test Expensify/App build. You can view the workflow run here.

@github-actions

This comment has been minimized.

@grgia

grgia commented Oct 20, 2026

Copy link
Copy Markdown
Contributor

Let me know if you will address #104366 (comment)

@grgia
grgia merged commit 85f5f6c into Expensify:main Oct 20, 2026
37 of 38 checks passed
@OSBotify

Copy link
Copy Markdown
Contributor

✋ This PR was not deployed to staging yet because QA is ongoing. It will be automatically deployed to staging after the next production release.

@joekaufmanexpensify

Copy link
Copy Markdown
Contributor

IMO, putting the "Enable Global Reimbursements" button below the delete option is a bit odd. Can we make it the second option in the menu in a cleanup PR?

image

@joekaufmanexpensify

Copy link
Copy Markdown
Contributor

Otherwise, working well!

@github-actions

Copy link
Copy Markdown
Contributor

🚧 grgia has triggered a test Expensify/App build. You can view the workflow run here.

@OSBotify

Copy link
Copy Markdown
Contributor

🚀 Deployed to staging by https://github.com/grgia in version: 9.5.15-1 🚀

platform result
🕸 web 🕸 success ✅
🤖 android 🤖 success ✅
🍎 iOS 🍎 success ✅

@MelvinBot

Copy link
Copy Markdown
Contributor

No help site update is needed. Every user-facing change in this PR is behind the wiseReimbursements beta: the new Wallet banner, the new intro page header and the menu item opening the Wise intro page. With the beta off, users see no change.

@OSBotify

Copy link
Copy Markdown
Contributor

🚀 Deployed to production by https://github.com/grgia in version: 9.5.15-3 🚀

platform result
🕸 web 🕸 success ✅
🤖 android 🤖 success ✅
🍎 iOS 🍎 success ✅

Bundle Size Analysis (Sentry):

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

7 participants