diff --git a/src/libs/CardUtils.ts b/src/libs/CardUtils.ts index 6c50439cbd39a..c56156d926fbd 100644 --- a/src/libs/CardUtils.ts +++ b/src/libs/CardUtils.ts @@ -1405,6 +1405,10 @@ function getBrokenConnectionUrlToFixPersonalCard(cards: Record, en return `${environmentURL}/${ROUTES.SETTINGS_WALLET}`; } +function isTravelCard(card: Card | undefined): boolean { + return card?.nameValuePairs?.feedCountry === CONST.TRAVEL.PROGRAM_TRAVEL_US; +} + /** * Gets displayable Expensify cards, filtering out inactive cards and grouping combo cards * (physical + virtual pairs) so only the physical card is shown per domain. @@ -1425,8 +1429,7 @@ function getDisplayableExpensifyCards(cardList: CardList | undefined): Card[] { return sortedCards.filter((card) => { const isAdminIssuedVirtualCard = !!card.nameValuePairs?.issuedBy && !!card.nameValuePairs?.isVirtual; - const isTravelCard = !!card.nameValuePairs?.isVirtual && !!card.nameValuePairs?.isTravelCard; - const isComboCard = !!card.domainName && !isAdminIssuedVirtualCard && !isTravelCard; + const isComboCard = !!card.domainName && !isAdminIssuedVirtualCard && !isTravelCard(card); // Always show non-combo cards (admin-issued virtual, travel cards, or cards without domain) if (!isComboCard) { @@ -1516,6 +1519,7 @@ export { getCardFeedIcon, getBankName, isSelectedFeedExpired, + isTravelCard, getCompanyFeeds, isPersonalCardBrokenConnection, isCustomFeed, diff --git a/src/pages/settings/Wallet/ExpensifyCardPage/index.tsx b/src/pages/settings/Wallet/ExpensifyCardPage/index.tsx index f89ca8aa6357c..65e1724a282d4 100644 --- a/src/pages/settings/Wallet/ExpensifyCardPage/index.tsx +++ b/src/pages/settings/Wallet/ExpensifyCardPage/index.tsx @@ -37,6 +37,7 @@ import { getDomainCards, getTranslationKeyForLimitType, isCardFrozen, + isTravelCard, maskCard, maskPin, supportsPINManagementFeatures, @@ -91,10 +92,9 @@ function ExpensifyCardPage({route}: ExpensifyCardPageProps) { const {isOffline} = useNetwork(); const {translate} = useLocalize(); const {executeScenario} = useMultifactorAuthentication(); - const isTravelCard = cardList?.[cardID]?.nameValuePairs?.isTravelCard; - const shouldDisplayCardDomain = !isTravelCard && (!cardList?.[cardID]?.nameValuePairs?.issuedBy || !cardList?.[cardID]?.nameValuePairs?.isVirtual); + const shouldDisplayCardDomain = !isTravelCard(cardList?.[cardID]) && (!cardList?.[cardID]?.nameValuePairs?.issuedBy || !cardList?.[cardID]?.nameValuePairs?.isVirtual); const domain = cardList?.[cardID]?.domainName ?? ''; - const expensifyCardTitle = isTravelCard ? translate('cardPage.expensifyTravelCard') : translate('cardPage.expensifyCard'); + const expensifyCardTitle = isTravelCard(cardList?.[cardID]) ? translate('cardPage.expensifyTravelCard') : translate('cardPage.expensifyCard'); const pageTitle = shouldDisplayCardDomain ? expensifyCardTitle : (cardList?.[cardID]?.nameValuePairs?.cardTitle ?? expensifyCardTitle); const {displayName} = useCurrentUserPersonalDetails(); const personalDetails = usePersonalDetails(); @@ -108,8 +108,8 @@ function ExpensifyCardPage({route}: ExpensifyCardPageProps) { }, [shouldDisplayCardDomain, cardList, cardID, domain]); const currentCard = useMemo(() => cardsToShow?.find((card) => String(card?.cardID) === cardID) ?? cardsToShow?.at(0), [cardsToShow, cardID]); - const virtualCards = useMemo(() => cardsToShow?.filter((card) => card?.nameValuePairs?.isVirtual && !card?.nameValuePairs?.isTravelCard), [cardsToShow]); - const travelCards = useMemo(() => cardsToShow?.filter((card) => card?.nameValuePairs?.isVirtual && card?.nameValuePairs?.isTravelCard), [cardsToShow]); + const virtualCards = useMemo(() => cardsToShow?.filter((card) => card?.nameValuePairs?.isVirtual && !isTravelCard(card)), [cardsToShow]); + const travelCards = useMemo(() => cardsToShow?.filter((card) => card?.nameValuePairs?.isVirtual && isTravelCard(card)), [cardsToShow]); const physicalCards = useMemo(() => cardsToShow?.filter((card) => !card?.nameValuePairs?.isVirtual), [cardsToShow]); const cardToAdd = useMemo(() => { return virtualCards?.at(0); @@ -363,7 +363,7 @@ function ExpensifyCardPage({route}: ExpensifyCardPageProps) { )} ))} - {isTravelCard && + {isTravelCard(cardList?.[cardID]) && travelCards.map((card) => ( {!!cardsDetails[card.cardID] && cardsDetails[card.cardID]?.cvv ? ( diff --git a/src/pages/settings/Wallet/PaymentMethodList.tsx b/src/pages/settings/Wallet/PaymentMethodList.tsx index 28a0b680ac304..88290d8929945 100644 --- a/src/pages/settings/Wallet/PaymentMethodList.tsx +++ b/src/pages/settings/Wallet/PaymentMethodList.tsx @@ -32,6 +32,7 @@ import { isExpensifyCardPendingAction, isExpiredCard, isPersonalCard, + isTravelCard, lastFourNumbersFromCardName, maskCardNumber, } from '@libs/CardUtils'; @@ -313,10 +314,9 @@ function PaymentMethodList({ } const isAdminIssuedVirtualCard = !!card?.nameValuePairs?.issuedBy && !!card?.nameValuePairs?.isVirtual; - const isTravelCard = card?.nameValuePairs?.feedCountry === CONST.TRAVEL.PROGRAM_TRAVEL_US; // Travel cards are handled by the dedicated travelCardGrouped section below - if (isTravelCard) { + if (isTravelCard(card)) { continue; } diff --git a/tests/unit/CardUtilsTest.ts b/tests/unit/CardUtilsTest.ts index 61428e2f62a30..ba18d85de300c 100644 --- a/tests/unit/CardUtilsTest.ts +++ b/tests/unit/CardUtilsTest.ts @@ -2487,7 +2487,7 @@ describe('CardUtils', () => { state: CONST.EXPENSIFY_CARD.STATE.OPEN, nameValuePairs: { isVirtual: true, - isTravelCard: true, + feedCountry: CONST.TRAVEL.PROGRAM_TRAVEL_US, }, }, } as unknown as CardList;