From 3d6b170867f56001add1782c47a50ede9afc5889 Mon Sep 17 00:00:00 2001 From: "Chuck Dries (via MelvinBot)" Date: Wed, 12 Aug 2026 22:39:18 +0000 Subject: [PATCH 01/10] Allow linking an existing card feed to a non-USD workspace Co-authored-by: Chuck Dries --- .../expensifyCard/WorkspaceExpensifyCardPageEmptyState.tsx | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/src/pages/workspace/expensifyCard/WorkspaceExpensifyCardPageEmptyState.tsx b/src/pages/workspace/expensifyCard/WorkspaceExpensifyCardPageEmptyState.tsx index 9580bb5c2385..aab73017b5f0 100644 --- a/src/pages/workspace/expensifyCard/WorkspaceExpensifyCardPageEmptyState.tsx +++ b/src/pages/workspace/expensifyCard/WorkspaceExpensifyCardPageEmptyState.tsx @@ -176,7 +176,9 @@ function WorkspaceExpensifyCardPageEmptyState({route, policy}: WorkspaceExpensif showLockedAccountModal(); return; } - if (!(policy?.outputCurrency === CONST.CURRENCY.USD || isUkEuCurrencySupported)) { + // The USD requirement only applies to enrolling a brand-new card program (which needs a USD bank account). + // Linking an existing feed doesn't require it, so skip the currency prompt when the workspace has accessible feeds. + if (!hasAccessibleFeeds && !(policy?.outputCurrency === CONST.CURRENCY.USD || isUkEuCurrencySupported)) { promptCurrencyChangeAndStartFlow(); return; } From f12901d5c71c852685699d9d4dde524ddf7b032e Mon Sep 17 00:00:00 2001 From: "Chuck Dries (via MelvinBot)" Date: Thu, 13 Aug 2026 03:09:56 +0000 Subject: [PATCH 02/10] Suppress new-program setup branch on unsupported currencies in feed selector Co-authored-by: Chuck Dries --- ...WorkspaceExpensifyCardFeedSelectorPage.tsx | 20 +++++++++++++------ 1 file changed, 14 insertions(+), 6 deletions(-) diff --git a/src/pages/workspace/expensifyCard/WorkspaceExpensifyCardFeedSelectorPage.tsx b/src/pages/workspace/expensifyCard/WorkspaceExpensifyCardFeedSelectorPage.tsx index 184d969d17e3..56d16158e310 100644 --- a/src/pages/workspace/expensifyCard/WorkspaceExpensifyCardFeedSelectorPage.tsx +++ b/src/pages/workspace/expensifyCard/WorkspaceExpensifyCardFeedSelectorPage.tsx @@ -13,6 +13,7 @@ import Text from '@components/Text'; import useCurrentUserPersonalDetails from '@hooks/useCurrentUserPersonalDetails'; import useDefaultFundID from '@hooks/useDefaultFundID'; import useExpensifyCardFeedsForFeedSelector from '@hooks/useExpensifyCardFeedsForFeedSelector'; +import useExpensifyCardUkEuSupported from '@hooks/useExpensifyCardUkEuSupported'; import {useMemoizedLazyExpensifyIcons, useMemoizedLazyIllustrations} from '@hooks/useLazyAsset'; import useLocalize from '@hooks/useLocalize'; import useNetwork from '@hooks/useNetwork'; @@ -83,6 +84,7 @@ function WorkspaceExpensifyCardFeedSelectorPage({route}: WorkspaceExpensifyCardF const [cardList] = useOnyx(ONYXKEYS.CARD_LIST); const policy = usePolicy(policyID); const canWriteExpensifyCard = canMemberWrite(policy, currentUserLogin, CONST.POLICY.POLICY_FEATURE.EXPENSIFY_CARD); + const isUkEuCurrencySupported = useExpensifyCardUkEuSupported(policyID); const getIssueCardFundID = () => { if (primaryFeeds.length === 0) { @@ -200,14 +202,20 @@ function WorkspaceExpensifyCardFeedSelectorPage({route}: WorkspaceExpensifyCardF const primaryListData = primaryFeeds.map((entry) => toListItem(entry, false)); + // Suppress the new-program (bank-account setup) branch on unsupported currencies: setting up a brand-new card program requires a USD/UK/EU workspace. + // Issuing a card on an existing feed (issueCardFundID !== undefined) is safe on any currency, so keep the button in that case. + const shouldShowIssueCardButton = issueCardFundID !== undefined || policy?.outputCurrency === CONST.CURRENCY.USD || isUkEuCurrencySupported; + const issueNewCardAndOtherFeedsFooter = canWriteExpensifyCard ? ( - + {shouldShowIssueCardButton && ( + + )} {otherFeeds.length > 0 && ( <> {translate('workspace.companyCards.fromOtherWorkspaces')} From 4f8f9c3aa682da5277d2ca20cfb58985c9c54600 Mon Sep 17 00:00:00 2001 From: Chuck Dries Date: Thu, 13 Aug 2026 08:48:35 -0700 Subject: [PATCH 03/10] update comments --- .../expensifyCard/WorkspaceExpensifyCardFeedSelectorPage.tsx | 4 ++-- .../expensifyCard/WorkspaceExpensifyCardPageEmptyState.tsx | 4 ++-- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/src/pages/workspace/expensifyCard/WorkspaceExpensifyCardFeedSelectorPage.tsx b/src/pages/workspace/expensifyCard/WorkspaceExpensifyCardFeedSelectorPage.tsx index 56d16158e310..19cd39793572 100644 --- a/src/pages/workspace/expensifyCard/WorkspaceExpensifyCardFeedSelectorPage.tsx +++ b/src/pages/workspace/expensifyCard/WorkspaceExpensifyCardFeedSelectorPage.tsx @@ -202,8 +202,8 @@ function WorkspaceExpensifyCardFeedSelectorPage({route}: WorkspaceExpensifyCardF const primaryListData = primaryFeeds.map((entry) => toListItem(entry, false)); - // Suppress the new-program (bank-account setup) branch on unsupported currencies: setting up a brand-new card program requires a USD/UK/EU workspace. - // Issuing a card on an existing feed (issueCardFundID !== undefined) is safe on any currency, so keep the button in that case. + // Suppress the new-program branch on workspaces with unsupported currencies + // These workspaces may only issue cards on existing feeds const shouldShowIssueCardButton = issueCardFundID !== undefined || policy?.outputCurrency === CONST.CURRENCY.USD || isUkEuCurrencySupported; const issueNewCardAndOtherFeedsFooter = canWriteExpensifyCard ? ( diff --git a/src/pages/workspace/expensifyCard/WorkspaceExpensifyCardPageEmptyState.tsx b/src/pages/workspace/expensifyCard/WorkspaceExpensifyCardPageEmptyState.tsx index aab73017b5f0..90019cedab10 100644 --- a/src/pages/workspace/expensifyCard/WorkspaceExpensifyCardPageEmptyState.tsx +++ b/src/pages/workspace/expensifyCard/WorkspaceExpensifyCardPageEmptyState.tsx @@ -176,8 +176,8 @@ function WorkspaceExpensifyCardPageEmptyState({route, policy}: WorkspaceExpensif showLockedAccountModal(); return; } - // The USD requirement only applies to enrolling a brand-new card program (which needs a USD bank account). - // Linking an existing feed doesn't require it, so skip the currency prompt when the workspace has accessible feeds. + // The supported currency restriction only applies to enrolling a brand-new card program. + // If hasAccessibleFeeds is true, allow the flow to start in order to link an existing feed if (!hasAccessibleFeeds && !(policy?.outputCurrency === CONST.CURRENCY.USD || isUkEuCurrencySupported)) { promptCurrencyChangeAndStartFlow(); return; From f592ea04c81bd6b597bebb00c7a6d8d87b0ed27e Mon Sep 17 00:00:00 2001 From: Chuck Dries Date: Fri, 14 Aug 2026 08:58:11 -0700 Subject: [PATCH 04/10] Update copy in E-card enrollment block modal --- src/languages/en.ts | 2 ++ .../expensifyCard/WorkspaceExpensifyCardPageEmptyState.tsx | 4 ++-- 2 files changed, 4 insertions(+), 2 deletions(-) diff --git a/src/languages/en.ts b/src/languages/en.ts index f083414ef702..985b99234dff 100644 --- a/src/languages/en.ts +++ b/src/languages/en.ts @@ -7406,6 +7406,8 @@ const translations = { areYouSure: 'Are you sure?', workspaceCurrency: 'Workspace currency', updateCurrencyPrompt: 'It looks like your workspace is currently set to a different currency than USD. Please click the button below to update your currency to USD now.', + updateCurrencyForExpensifyCard: + 'Expensify Card works with USD, GBP, and EUR bank accounts. Update this workspace to a supported currency, or use a different workspace to enroll.', updateToUSD: 'Update to USD', updateWorkspaceCurrency: 'Update workspace currency', workspaceCurrencyNotSupported: 'Workspace currency not supported', diff --git a/src/pages/workspace/expensifyCard/WorkspaceExpensifyCardPageEmptyState.tsx b/src/pages/workspace/expensifyCard/WorkspaceExpensifyCardPageEmptyState.tsx index 65a2aae0b9f0..6437d2f1d15a 100644 --- a/src/pages/workspace/expensifyCard/WorkspaceExpensifyCardPageEmptyState.tsx +++ b/src/pages/workspace/expensifyCard/WorkspaceExpensifyCardPageEmptyState.tsx @@ -128,8 +128,8 @@ function WorkspaceExpensifyCardPageEmptyState({route, policy}: WorkspaceExpensif isCurrencyModalOpen.current = true; const result = await showConfirmModal({ title: translate('workspace.common.expensifyCard'), - prompt: translate('workspace.bankAccount.updateCurrencyPrompt'), - confirmText: translate('workspace.bankAccount.updateToUSD'), + prompt: translate('workspace.bankAccount.updateCurrencyForExpensifyCard'), + confirmText: translate('workspace.bankAccount.updateWorkspaceCurrency'), cancelText: translate('common.cancel'), danger: true, }); From f5bac1a793caef5166b3da4f2ad5bad619354e67 Mon Sep 17 00:00:00 2001 From: Chuck Dries Date: Fri, 14 Aug 2026 09:01:40 -0700 Subject: [PATCH 05/10] Show currency picker instead of auto-switching to USD --- .../expensifyCard/WorkspaceExpensifyCardPageEmptyState.tsx | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/src/pages/workspace/expensifyCard/WorkspaceExpensifyCardPageEmptyState.tsx b/src/pages/workspace/expensifyCard/WorkspaceExpensifyCardPageEmptyState.tsx index 6437d2f1d15a..75a16c5e3c6b 100644 --- a/src/pages/workspace/expensifyCard/WorkspaceExpensifyCardPageEmptyState.tsx +++ b/src/pages/workspace/expensifyCard/WorkspaceExpensifyCardPageEmptyState.tsx @@ -137,8 +137,7 @@ function WorkspaceExpensifyCardPageEmptyState({route, policy}: WorkspaceExpensif if (result.action !== ModalActions.CONFIRM || !policy) { return; } - updatePolicyGeneralSettings(policy, policy.name, CONST.CURRENCY.USD); - startFlow(); + Navigation.navigate(ROUTES.WORKSPACE_OVERVIEW_CURRENCY.getRoute(policy.id, true)); }; return ( From 69f29a20f47e04ff04b96770df68c0c21e5d1318 Mon Sep 17 00:00:00 2001 From: Chuck Dries Date: Fri, 14 Aug 2026 09:02:51 -0700 Subject: [PATCH 06/10] polyglot parrot --- src/languages/de.ts | 2 ++ src/languages/el.ts | 2 ++ src/languages/es.ts | 2 ++ src/languages/fr.ts | 2 ++ src/languages/it.ts | 2 ++ src/languages/ja.ts | 2 ++ src/languages/nl.ts | 2 ++ src/languages/pl.ts | 2 ++ src/languages/pt-BR.ts | 2 ++ src/languages/zh-hans.ts | 1 + 10 files changed, 19 insertions(+) diff --git a/src/languages/de.ts b/src/languages/de.ts index 671463f45aff..f3f2c1d7378b 100644 --- a/src/languages/de.ts +++ b/src/languages/de.ts @@ -7216,6 +7216,8 @@ Der Control-Tarif beginnt bei 9 $ pro aktivem Mitglied und Monat.`, yourWorkspace: `Dein Arbeitsbereich ist auf eine nicht unterstützte Währung eingestellt. Sieh dir die Liste der unterstützten Währungen an.`, chooseAnExisting: 'Wähle ein bestehendes Bankkonto zum Bezahlen von Ausgaben oder füge ein neues hinzu.', changeBankAccount: 'Bankkonto ändern', + updateCurrencyForExpensifyCard: + 'Die Expensify Karte funktioniert mit Bankkonten in USD, GBP und EUR. Aktualisieren Sie diesen Workspace auf eine unterstützte Währung oder verwenden Sie einen anderen Workspace für die Registrierung.', }, changeOwner: { changeOwnerPageTitle: 'Besitz übertragen', diff --git a/src/languages/el.ts b/src/languages/el.ts index b6dcc8eddc55..1efe39c21c29 100644 --- a/src/languages/el.ts +++ b/src/languages/el.ts @@ -7477,6 +7477,8 @@ _Για πιο αναλυτικές οδηγίες, [επισκεφθείτε τ notAllowedToAddBankAccount: 'Ο χώρος εργασίας σας είναι ρυθμισμένος σε μη υποστηριζόμενο νόμισμα. Επικοινωνήστε με έναν διαχειριστή χώρου εργασίας που έχει δικαίωμα να το αλλάξει.', changeBankAccount: 'Αλλαγή τραπεζικού λογαριασμού', + updateCurrencyForExpensifyCard: + 'Η κάρτα Expensify λειτουργεί με τραπεζικούς λογαριασμούς σε USD, GBP και EUR. Ενημερώστε αυτόν τον χώρο εργασίας σε υποστηριζόμενο νόμισμα ή χρησιμοποιήστε έναν διαφορετικό χώρο εργασίας για να εγγραφείτε.', }, changeOwner: { changeOwnerPageTitle: 'Μεταφορά ιδιοκτήτη', diff --git a/src/languages/es.ts b/src/languages/es.ts index 2edd8cb93b03..e8007afd1ca8 100644 --- a/src/languages/es.ts +++ b/src/languages/es.ts @@ -7181,6 +7181,8 @@ El plan Controlar empieza en 9 $ por miembro activo al mes.`, yourWorkspace: `Tu espacio de trabajo está configurado en una moneda no soportada. Consulta la lista de monedas soportadas.`, chooseAnExisting: 'Elige una cuenta bancaria existente para pagar gastos o añade una nueva.', changeBankAccount: 'Cambiar cuenta bancaria', + updateCurrencyForExpensifyCard: + 'La Tarjeta Expensify funciona con cuentas bancarias en USD, GBP y EUR. Actualiza este espacio de trabajo a una divisa compatible o usa otro espacio de trabajo para inscribirte.', }, changeOwner: { changeOwnerPageTitle: 'Transferir la propiedad', diff --git a/src/languages/fr.ts b/src/languages/fr.ts index 7468a28abfb3..81572f308448 100644 --- a/src/languages/fr.ts +++ b/src/languages/fr.ts @@ -7242,6 +7242,8 @@ Le forfait Control commence à 9 $ par Membre actif et par mois.`, yourWorkspace: `Votre espace de travail est défini sur une devise non prise en charge. Consultez la liste des devises prises en charge.`, chooseAnExisting: 'Choisissez un compte bancaire existant pour payer les dépenses ou ajoutez-en un nouveau.', changeBankAccount: 'Changer de compte bancaire', + updateCurrencyForExpensifyCard: + 'La Carte Expensify fonctionne avec des comptes bancaires en USD, GBP et EUR. Mettez à jour cet espace de travail vers une devise prise en charge ou utilisez un autre espace de travail pour vous inscrire.', }, changeOwner: { changeOwnerPageTitle: 'Transférer le responsable', diff --git a/src/languages/it.ts b/src/languages/it.ts index a7b8b777aaff..75f6108cbadc 100644 --- a/src/languages/it.ts +++ b/src/languages/it.ts @@ -7184,6 +7184,8 @@ Il piano Control parte da 9 $ al mese per ogni membro attivo.`, yourWorkspace: `La tua area di lavoro è impostata su una valuta non supportata. Visualizza l’elenco delle valute supportate.`, chooseAnExisting: 'Scegli un conto bancario esistente per pagare le spese oppure aggiungine uno nuovo.', changeBankAccount: 'Cambia conto bancario', + updateCurrencyForExpensifyCard: + 'La Carta Expensify funziona con conti bancari in USD, GBP ed EUR. Aggiorna questo spazio di lavoro a una valuta supportata oppure usa un altro spazio di lavoro per iscriverti.', }, changeOwner: { changeOwnerPageTitle: 'Trasferisci proprietario', diff --git a/src/languages/ja.ts b/src/languages/ja.ts index b8cb7a550c87..63390d30d820 100644 --- a/src/languages/ja.ts +++ b/src/languages/ja.ts @@ -7101,6 +7101,8 @@ Control プランは、アクティブメンバー1人あたり月額 $9 から yourWorkspace: `ご利用のワークスペースはサポートされていない通貨に設定されています。サポートされている通貨の一覧を表示します。`, chooseAnExisting: '既存の銀行口座を選択して経費を支払うか、新しい口座を追加してください。', changeBankAccount: '銀行口座を変更', + updateCurrencyForExpensifyCard: + 'Expensify カードは、USD・GBP・EUR の銀行口座でご利用いただけます。このワークスペースを対応通貨に更新するか、別のワークスペースで登録してください。', }, changeOwner: { changeOwnerPageTitle: '所有者を変更', diff --git a/src/languages/nl.ts b/src/languages/nl.ts index 8fd574249a88..6dcc6d870630 100644 --- a/src/languages/nl.ts +++ b/src/languages/nl.ts @@ -7171,6 +7171,8 @@ Het Control-abonnement begint bij $9 per actieve deelnemer per maand.`, yourWorkspace: `Je werkruimte is ingesteld op een niet-ondersteunde valuta. Bekijk de lijst met ondersteunde valuta's.`, chooseAnExisting: 'Kies een bestaande bankrekening om onkosten te betalen of voeg een nieuwe toe.', changeBankAccount: 'Bankrekening wijzigen', + updateCurrencyForExpensifyCard: + 'Expensify Kaart werkt met bankrekeningen in USD, GBP en EUR. Werk deze workspace bij naar een ondersteunde valuta, of gebruik een andere workspace om je aan te melden.', }, changeOwner: { changeOwnerPageTitle: 'Eigenaar overdragen', diff --git a/src/languages/pl.ts b/src/languages/pl.ts index 0c428e2f01bd..bf1b3baaedab 100644 --- a/src/languages/pl.ts +++ b/src/languages/pl.ts @@ -7149,6 +7149,8 @@ Plan Control zaczyna się od 9 USD za aktywnego członka miesięcznie.`, yourWorkspace: `Twoje miejsce pracy jest ustawione na nieobsługiwaną walutę. Zobacz listę obsługiwanych walut.`, chooseAnExisting: 'Wybierz istniejące konto bankowe do opłacania wydatków lub dodaj nowe.', changeBankAccount: 'Zmień konto bankowe', + updateCurrencyForExpensifyCard: + 'Karta Expensify działa z kontami bankowymi w USD, GBP i EUR. Zmień walutę tego workspace’a na obsługiwaną albo użyj innego workspace’a, żeby się zarejestrować.', }, changeOwner: { changeOwnerPageTitle: 'Przenieś właściciela', diff --git a/src/languages/pt-BR.ts b/src/languages/pt-BR.ts index 500f04df05c6..653edc9faeb0 100644 --- a/src/languages/pt-BR.ts +++ b/src/languages/pt-BR.ts @@ -7170,6 +7170,8 @@ O plano Control começa em US$ 9 por membro ativo por mês.`, yourWorkspace: `Seu workspace está configurado para uma moeda não compatível. Veja a lista de moedas compatíveis.`, chooseAnExisting: 'Escolha uma conta bancária existente para pagar despesas ou adicione uma nova.', changeBankAccount: 'Alterar conta bancária', + updateCurrencyForExpensifyCard: + 'O Cartão Expensify funciona com contas bancárias em USD, GBP e EUR. Atualize este workspace para uma moeda compatível ou use outro workspace para se inscrever.', }, changeOwner: { changeOwnerPageTitle: 'Transferir proprietário', diff --git a/src/languages/zh-hans.ts b/src/languages/zh-hans.ts index f98945ab108d..d4d145d2d9cd 100644 --- a/src/languages/zh-hans.ts +++ b/src/languages/zh-hans.ts @@ -6932,6 +6932,7 @@ _如需更详细的说明,请[访问我们的帮助网站](${CONST.NETSUITE_IM yourWorkspace: `您的工作区当前使用不受支持的货币。请查看支持的货币列表。`, chooseAnExisting: '选择现有银行账户来支付报销,或添加新账户。', changeBankAccount: '更改银行账户', + updateCurrencyForExpensifyCard: 'Expensify 卡支持美元、英镑和欧元银行账户。请将此工作区更新为支持的货币,或使用其他工作区进行注册。', }, changeOwner: { changeOwnerPageTitle: '转移所有者', From 1e0aae975bec8e26f93b5d9b0001d439a85be7b1 Mon Sep 17 00:00:00 2001 From: Chuck Dries Date: Fri, 14 Aug 2026 09:12:11 -0700 Subject: [PATCH 07/10] Add useCanEnrollNewExpensifyCardProgram --- src/hooks/useCanEnrollNewExpensifyCardProgram.ts | 15 +++++++++++++++ .../WorkspaceExpensifyCardFeedSelectorPage.tsx | 6 +++--- .../WorkspaceExpensifyCardPageEmptyState.tsx | 6 +++--- 3 files changed, 21 insertions(+), 6 deletions(-) create mode 100644 src/hooks/useCanEnrollNewExpensifyCardProgram.ts diff --git a/src/hooks/useCanEnrollNewExpensifyCardProgram.ts b/src/hooks/useCanEnrollNewExpensifyCardProgram.ts new file mode 100644 index 000000000000..049fdd703e15 --- /dev/null +++ b/src/hooks/useCanEnrollNewExpensifyCardProgram.ts @@ -0,0 +1,15 @@ +import CONST from '@src/CONST'; + +import useExpensifyCardUkEuSupported from './useExpensifyCardUkEuSupported'; +import usePolicy from './usePolicy'; + +/** + * Whether the workspace currency allows enrollment in a new Expensify Card program. + * Linking an existing card feed is not restricted by currency. + */ +export default function useCanEnrollNewExpensifyCardProgram(policyID?: string) { + const policy = usePolicy(policyID); + const isUkEuCurrencySupported = useExpensifyCardUkEuSupported(policyID); + + return policy?.outputCurrency === CONST.CURRENCY.USD || isUkEuCurrencySupported; +} diff --git a/src/pages/workspace/expensifyCard/WorkspaceExpensifyCardFeedSelectorPage.tsx b/src/pages/workspace/expensifyCard/WorkspaceExpensifyCardFeedSelectorPage.tsx index 700be0cf9df6..38f97baefa86 100644 --- a/src/pages/workspace/expensifyCard/WorkspaceExpensifyCardFeedSelectorPage.tsx +++ b/src/pages/workspace/expensifyCard/WorkspaceExpensifyCardFeedSelectorPage.tsx @@ -10,10 +10,10 @@ import SingleSelectListItem from '@components/SelectionList/ListItem/SingleSelec import type {ListItem} from '@components/SelectionList/types'; import Text from '@components/Text'; +import useCanEnrollNewExpensifyCardProgram from '@hooks/useCanEnrollNewExpensifyCardProgram'; import useCurrentUserPersonalDetails from '@hooks/useCurrentUserPersonalDetails'; import useDefaultFundID from '@hooks/useDefaultFundID'; import useExpensifyCardFeedsForFeedSelector from '@hooks/useExpensifyCardFeedsForFeedSelector'; -import useExpensifyCardUkEuSupported from '@hooks/useExpensifyCardUkEuSupported'; import {useMemoizedLazyExpensifyIcons, useMemoizedLazyIllustrations} from '@hooks/useLazyAsset'; import useLocalize from '@hooks/useLocalize'; import useNetwork from '@hooks/useNetwork'; @@ -84,7 +84,7 @@ function WorkspaceExpensifyCardFeedSelectorPage({route}: WorkspaceExpensifyCardF const [cardList] = useOnyx(ONYXKEYS.CARD_LIST); const policy = usePolicy(policyID); const canWriteExpensifyCard = canMemberWrite(policy, currentUserLogin, CONST.POLICY.POLICY_FEATURE.EXPENSIFY_CARD); - const isUkEuCurrencySupported = useExpensifyCardUkEuSupported(policyID); + const canEnrollNewCardProgram = useCanEnrollNewExpensifyCardProgram(policyID); const getIssueCardFundID = () => { if (primaryFeeds.length === 0) { @@ -204,7 +204,7 @@ function WorkspaceExpensifyCardFeedSelectorPage({route}: WorkspaceExpensifyCardF // Suppress the new-program branch on workspaces with unsupported currencies // These workspaces may only issue cards on existing feeds - const shouldShowIssueCardButton = issueCardFundID !== undefined || policy?.outputCurrency === CONST.CURRENCY.USD || isUkEuCurrencySupported; + const shouldShowIssueCardButton = issueCardFundID !== undefined || canEnrollNewCardProgram; const issueNewCardAndOtherFeedsFooter = canWriteExpensifyCard ? ( diff --git a/src/pages/workspace/expensifyCard/WorkspaceExpensifyCardPageEmptyState.tsx b/src/pages/workspace/expensifyCard/WorkspaceExpensifyCardPageEmptyState.tsx index 75a16c5e3c6b..1c130c505b75 100644 --- a/src/pages/workspace/expensifyCard/WorkspaceExpensifyCardPageEmptyState.tsx +++ b/src/pages/workspace/expensifyCard/WorkspaceExpensifyCardPageEmptyState.tsx @@ -5,6 +5,7 @@ import {useLockedAccountActions, useLockedAccountState} from '@components/Locked import {ModalActions} from '@components/Modal/Global/ModalContext'; import Text from '@components/Text'; +import useCanEnrollNewExpensifyCardProgram from '@hooks/useCanEnrollNewExpensifyCardProgram'; import useConfirmModal from '@hooks/useConfirmModal'; import useCurrentUserPersonalDetails from '@hooks/useCurrentUserPersonalDetails'; import useExpensifyCardFeedsForFeedSelector from '@hooks/useExpensifyCardFeedsForFeedSelector'; @@ -34,8 +35,6 @@ import WorkspacePageWithSections from '@pages/workspace/WorkspacePageWithSection import variables from '@styles/variables'; -import {updateGeneralSettings as updatePolicyGeneralSettings} from '@userActions/Policy/Policy'; - import CONST from '@src/CONST'; import ONYXKEYS from '@src/ONYXKEYS'; import ROUTES, {DYNAMIC_ROUTES} from '@src/ROUTES'; @@ -78,6 +77,7 @@ function WorkspaceExpensifyCardPageEmptyState({route, policy}: WorkspaceExpensif const isSetupUnfinished = hasInProgressUSDVBBA(reimbursementAccount?.achData); const isUkEuCurrencySupported = useExpensifyCardUkEuSupported(policy?.id); + const canEnrollNewCardProgram = useCanEnrollNewExpensifyCardProgram(policy?.id); const {allFeeds} = useExpensifyCardFeedsForFeedSelector(policy?.id); const hasAccessibleFeeds = allFeeds.length > 0; @@ -176,7 +176,7 @@ function WorkspaceExpensifyCardPageEmptyState({route, policy}: WorkspaceExpensif } // The supported currency restriction only applies to enrolling a brand-new card program. // If hasAccessibleFeeds is true, allow the flow to start in order to link an existing feed - if (!hasAccessibleFeeds && !(policy?.outputCurrency === CONST.CURRENCY.USD || isUkEuCurrencySupported)) { + if (!hasAccessibleFeeds && !canEnrollNewCardProgram) { promptCurrencyChangeAndStartFlow(); return; } From 25c695ab58aef686bd7c215b6f1b8f8a8d9c215e Mon Sep 17 00:00:00 2001 From: Chuck Dries Date: Mon, 17 Aug 2026 10:15:05 -0700 Subject: [PATCH 08/10] Update copy in E-card enrollment block modal --- src/languages/en.ts | 3 ++- .../expensifyCard/WorkspaceExpensifyCardPageEmptyState.tsx | 2 +- 2 files changed, 3 insertions(+), 2 deletions(-) diff --git a/src/languages/en.ts b/src/languages/en.ts index 985b99234dff..b5c0caa1c091 100644 --- a/src/languages/en.ts +++ b/src/languages/en.ts @@ -7407,7 +7407,8 @@ const translations = { workspaceCurrency: 'Workspace currency', updateCurrencyPrompt: 'It looks like your workspace is currently set to a different currency than USD. Please click the button below to update your currency to USD now.', updateCurrencyForExpensifyCard: - 'Expensify Card works with USD, GBP, and EUR bank accounts. Update this workspace to a supported currency, or use a different workspace to enroll.', + 'The Expensify Card is available to issue in USD, GBP, and EUR. Please update this workspace to a supported currency or use a different workspace', + updateCurrencyForExpensifyCardTitle: 'Get the Expensify Card', updateToUSD: 'Update to USD', updateWorkspaceCurrency: 'Update workspace currency', workspaceCurrencyNotSupported: 'Workspace currency not supported', diff --git a/src/pages/workspace/expensifyCard/WorkspaceExpensifyCardPageEmptyState.tsx b/src/pages/workspace/expensifyCard/WorkspaceExpensifyCardPageEmptyState.tsx index 1c130c505b75..1a8ca8b3d678 100644 --- a/src/pages/workspace/expensifyCard/WorkspaceExpensifyCardPageEmptyState.tsx +++ b/src/pages/workspace/expensifyCard/WorkspaceExpensifyCardPageEmptyState.tsx @@ -127,7 +127,7 @@ function WorkspaceExpensifyCardPageEmptyState({route, policy}: WorkspaceExpensif const promptCurrencyChangeAndStartFlow = async () => { isCurrencyModalOpen.current = true; const result = await showConfirmModal({ - title: translate('workspace.common.expensifyCard'), + title: translate('workspace.bankAccount.updateCurrencyForExpensifyCardTitle'), prompt: translate('workspace.bankAccount.updateCurrencyForExpensifyCard'), confirmText: translate('workspace.bankAccount.updateWorkspaceCurrency'), cancelText: translate('common.cancel'), From fe2c572ecadc58ab756ce3a3a56ec9228278b3dd Mon Sep 17 00:00:00 2001 From: Chuck Dries Date: Mon, 17 Aug 2026 10:27:50 -0700 Subject: [PATCH 09/10] add period at end of second sentence --- src/languages/en.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/languages/en.ts b/src/languages/en.ts index b5c0caa1c091..93c3b2591252 100644 --- a/src/languages/en.ts +++ b/src/languages/en.ts @@ -7407,7 +7407,7 @@ const translations = { workspaceCurrency: 'Workspace currency', updateCurrencyPrompt: 'It looks like your workspace is currently set to a different currency than USD. Please click the button below to update your currency to USD now.', updateCurrencyForExpensifyCard: - 'The Expensify Card is available to issue in USD, GBP, and EUR. Please update this workspace to a supported currency or use a different workspace', + 'The Expensify Card is available to issue in USD, GBP, and EUR. Please update this workspace to a supported currency or use a different workspace.', updateCurrencyForExpensifyCardTitle: 'Get the Expensify Card', updateToUSD: 'Update to USD', updateWorkspaceCurrency: 'Update workspace currency', From 96ed238ddb23e84b2a8d4f92fdc4ca2b5ddf0ccc Mon Sep 17 00:00:00 2001 From: "Chuck Dries (via MelvinBot)" Date: Mon, 17 Aug 2026 17:43:03 +0000 Subject: [PATCH 10/10] Add missing updateCurrencyForExpensifyCardTitle translation key to all locales Co-authored-by: Chuck Dries --- src/languages/de.ts | 1 + src/languages/el.ts | 1 + src/languages/es.ts | 1 + src/languages/fr.ts | 1 + src/languages/it.ts | 1 + src/languages/ja.ts | 1 + src/languages/nl.ts | 1 + src/languages/pl.ts | 1 + src/languages/pt-BR.ts | 1 + src/languages/zh-hans.ts | 1 + 10 files changed, 10 insertions(+) diff --git a/src/languages/de.ts b/src/languages/de.ts index f3f2c1d7378b..821bc5c7aa32 100644 --- a/src/languages/de.ts +++ b/src/languages/de.ts @@ -7218,6 +7218,7 @@ Der Control-Tarif beginnt bei 9 $ pro aktivem Mitglied und Monat.`, changeBankAccount: 'Bankkonto ändern', updateCurrencyForExpensifyCard: 'Die Expensify Karte funktioniert mit Bankkonten in USD, GBP und EUR. Aktualisieren Sie diesen Workspace auf eine unterstützte Währung oder verwenden Sie einen anderen Workspace für die Registrierung.', + updateCurrencyForExpensifyCardTitle: 'Holen Sie sich die Expensify Karte', }, changeOwner: { changeOwnerPageTitle: 'Besitz übertragen', diff --git a/src/languages/el.ts b/src/languages/el.ts index 1efe39c21c29..04152757805d 100644 --- a/src/languages/el.ts +++ b/src/languages/el.ts @@ -7479,6 +7479,7 @@ _Για πιο αναλυτικές οδηγίες, [επισκεφθείτε τ changeBankAccount: 'Αλλαγή τραπεζικού λογαριασμού', updateCurrencyForExpensifyCard: 'Η κάρτα Expensify λειτουργεί με τραπεζικούς λογαριασμούς σε USD, GBP και EUR. Ενημερώστε αυτόν τον χώρο εργασίας σε υποστηριζόμενο νόμισμα ή χρησιμοποιήστε έναν διαφορετικό χώρο εργασίας για να εγγραφείτε.', + updateCurrencyForExpensifyCardTitle: 'Αποκτήστε την κάρτα Expensify', }, changeOwner: { changeOwnerPageTitle: 'Μεταφορά ιδιοκτήτη', diff --git a/src/languages/es.ts b/src/languages/es.ts index e8007afd1ca8..20404ffefde2 100644 --- a/src/languages/es.ts +++ b/src/languages/es.ts @@ -7183,6 +7183,7 @@ El plan Controlar empieza en 9 $ por miembro activo al mes.`, changeBankAccount: 'Cambiar cuenta bancaria', updateCurrencyForExpensifyCard: 'La Tarjeta Expensify funciona con cuentas bancarias en USD, GBP y EUR. Actualiza este espacio de trabajo a una divisa compatible o usa otro espacio de trabajo para inscribirte.', + updateCurrencyForExpensifyCardTitle: 'Consigue la Tarjeta Expensify', }, changeOwner: { changeOwnerPageTitle: 'Transferir la propiedad', diff --git a/src/languages/fr.ts b/src/languages/fr.ts index 81572f308448..43393c002dfa 100644 --- a/src/languages/fr.ts +++ b/src/languages/fr.ts @@ -7244,6 +7244,7 @@ Le forfait Control commence à 9 $ par Membre actif et par mois.`, changeBankAccount: 'Changer de compte bancaire', updateCurrencyForExpensifyCard: 'La Carte Expensify fonctionne avec des comptes bancaires en USD, GBP et EUR. Mettez à jour cet espace de travail vers une devise prise en charge ou utilisez un autre espace de travail pour vous inscrire.', + updateCurrencyForExpensifyCardTitle: 'Obtenez la Carte Expensify', }, changeOwner: { changeOwnerPageTitle: 'Transférer le responsable', diff --git a/src/languages/it.ts b/src/languages/it.ts index 75f6108cbadc..a537ce163eb5 100644 --- a/src/languages/it.ts +++ b/src/languages/it.ts @@ -7186,6 +7186,7 @@ Il piano Control parte da 9 $ al mese per ogni membro attivo.`, changeBankAccount: 'Cambia conto bancario', updateCurrencyForExpensifyCard: 'La Carta Expensify funziona con conti bancari in USD, GBP ed EUR. Aggiorna questo spazio di lavoro a una valuta supportata oppure usa un altro spazio di lavoro per iscriverti.', + updateCurrencyForExpensifyCardTitle: 'Ottieni la Carta Expensify', }, changeOwner: { changeOwnerPageTitle: 'Trasferisci proprietario', diff --git a/src/languages/ja.ts b/src/languages/ja.ts index 63390d30d820..d9cb025123b4 100644 --- a/src/languages/ja.ts +++ b/src/languages/ja.ts @@ -7103,6 +7103,7 @@ Control プランは、アクティブメンバー1人あたり月額 $9 から changeBankAccount: '銀行口座を変更', updateCurrencyForExpensifyCard: 'Expensify カードは、USD・GBP・EUR の銀行口座でご利用いただけます。このワークスペースを対応通貨に更新するか、別のワークスペースで登録してください。', + updateCurrencyForExpensifyCardTitle: 'Expensify カードを取得する', }, changeOwner: { changeOwnerPageTitle: '所有者を変更', diff --git a/src/languages/nl.ts b/src/languages/nl.ts index 6dcc6d870630..a2685b194b45 100644 --- a/src/languages/nl.ts +++ b/src/languages/nl.ts @@ -7173,6 +7173,7 @@ Het Control-abonnement begint bij $9 per actieve deelnemer per maand.`, changeBankAccount: 'Bankrekening wijzigen', updateCurrencyForExpensifyCard: 'Expensify Kaart werkt met bankrekeningen in USD, GBP en EUR. Werk deze workspace bij naar een ondersteunde valuta, of gebruik een andere workspace om je aan te melden.', + updateCurrencyForExpensifyCardTitle: 'Ontvang de Expensify Kaart', }, changeOwner: { changeOwnerPageTitle: 'Eigenaar overdragen', diff --git a/src/languages/pl.ts b/src/languages/pl.ts index bf1b3baaedab..37e1686093e4 100644 --- a/src/languages/pl.ts +++ b/src/languages/pl.ts @@ -7151,6 +7151,7 @@ Plan Control zaczyna się od 9 USD za aktywnego członka miesięcznie.`, changeBankAccount: 'Zmień konto bankowe', updateCurrencyForExpensifyCard: 'Karta Expensify działa z kontami bankowymi w USD, GBP i EUR. Zmień walutę tego workspace’a na obsługiwaną albo użyj innego workspace’a, żeby się zarejestrować.', + updateCurrencyForExpensifyCardTitle: 'Zdobądź Kartę Expensify', }, changeOwner: { changeOwnerPageTitle: 'Przenieś właściciela', diff --git a/src/languages/pt-BR.ts b/src/languages/pt-BR.ts index 653edc9faeb0..85464624fa36 100644 --- a/src/languages/pt-BR.ts +++ b/src/languages/pt-BR.ts @@ -7172,6 +7172,7 @@ O plano Control começa em US$ 9 por membro ativo por mês.`, changeBankAccount: 'Alterar conta bancária', updateCurrencyForExpensifyCard: 'O Cartão Expensify funciona com contas bancárias em USD, GBP e EUR. Atualize este workspace para uma moeda compatível ou use outro workspace para se inscrever.', + updateCurrencyForExpensifyCardTitle: 'Obtenha o Cartão Expensify', }, changeOwner: { changeOwnerPageTitle: 'Transferir proprietário', diff --git a/src/languages/zh-hans.ts b/src/languages/zh-hans.ts index d4d145d2d9cd..882f93cfd23d 100644 --- a/src/languages/zh-hans.ts +++ b/src/languages/zh-hans.ts @@ -6933,6 +6933,7 @@ _如需更详细的说明,请[访问我们的帮助网站](${CONST.NETSUITE_IM chooseAnExisting: '选择现有银行账户来支付报销,或添加新账户。', changeBankAccount: '更改银行账户', updateCurrencyForExpensifyCard: 'Expensify 卡支持美元、英镑和欧元银行账户。请将此工作区更新为支持的货币,或使用其他工作区进行注册。', + updateCurrencyForExpensifyCardTitle: '获取 Expensify 卡', }, changeOwner: { changeOwnerPageTitle: '转移所有者',