1- import type { OnyxCollection } from 'react-native-onyx/dist/types ' ;
1+ import type { OnyxCollection } from 'react-native-onyx' ;
22import type { LocaleContextProps } from '@components/LocaleContextProvider' ;
33import type { AdditionalCardProps } from '@components/SelectionList/Search/CardListItem' ;
44import type IllustrationsType from '@styles/theme/illustrations/types' ;
55import CONST from '@src/CONST' ;
66import ONYXKEYS from '@src/ONYXKEYS' ;
77import type { Card , CardFeeds , CardList , CompanyCardFeed , PersonalDetailsList , WorkspaceCardsList } from '@src/types/onyx' ;
88import { isEmptyObject } from '@src/types/utils/EmptyObject' ;
9- import { getBankName , getCardFeedIcon , getCompanyFeeds , getCustomOrFormattedFeedName , isCard , isCardClosed , isCardHiddenFromSearch } from './CardUtils' ;
9+ import {
10+ getBankName ,
11+ getCardFeedIcon ,
12+ getCompanyFeeds ,
13+ getCustomOrFormattedFeedName ,
14+ getPlaidInstitutionIconUrl ,
15+ getPlaidInstitutionId ,
16+ isCard ,
17+ isCardClosed ,
18+ isCardHiddenFromSearch ,
19+ } from './CardUtils' ;
1020import { getDescriptionForPolicyDomainCard , getPolicy } from './PolicyUtils' ;
1121import type { OptionData } from './ReportUtils' ;
1222
13- type CardFilterItem = Partial < OptionData > & AdditionalCardProps & { isCardFeed ?: boolean ; correspondingCards ?: string [ ] ; cardFeedKey : string } ;
23+ type CardFilterItem = Partial < OptionData > & AdditionalCardProps & { isCardFeed ?: boolean ; correspondingCards ?: string [ ] ; cardFeedKey : string ; plaidUrl ?: string } ;
1424type DomainFeedData = { bank : string ; domainName : string ; correspondingCardIDs : string [ ] ; fundID ?: string } ;
1525type ItemsGroupedBySelection = { selected : CardFilterItem [ ] ; unselected : CardFilterItem [ ] } ;
1626type CardFeedNamesWithType = Record < string , { name : string ; type : 'domain' | 'workspace' } > ;
@@ -74,6 +84,7 @@ function createCardFilterItem(card: Card, personalDetailsList: PersonalDetailsLi
7484 const icon = getCardFeedIcon ( card ?. bank as CompanyCardFeed , illustrations ) ;
7585 const cardName = card ?. nameValuePairs ?. cardTitle ;
7686 const text = personalDetails ?. displayName ?? cardName ;
87+ const plaidUrl = getPlaidInstitutionIconUrl ( card ?. bank ) ;
7788
7889 return {
7990 lastFourPAN : card . lastFourPAN ,
@@ -82,6 +93,7 @@ function createCardFilterItem(card: Card, personalDetailsList: PersonalDetailsLi
8293 cardName,
8394 cardOwnerPersonalDetails : personalDetails ?? undefined ,
8495 text,
96+ plaidUrl,
8597 keyForList : card . cardID . toString ( ) ,
8698 isSelected,
8799 bankIcon : {
@@ -101,7 +113,7 @@ function buildCardsData(
101113 isClosedCards = false ,
102114) : ItemsGroupedBySelection {
103115 // Filter condition to build different cards data for closed cards and individual cards based on the isClosedCards flag, we don't want to show closed cards in the individual cards section
104- const filterCondition = ( card : Card ) => ( isClosedCards ? isCardClosed ( card ) : ! isCardHiddenFromSearch ( card ) && ! isCardClosed ( card ) ) ;
116+ const filterCondition = ( card : Card ) => ( isClosedCards ? isCardClosed ( card ) : ! isCardHiddenFromSearch ( card ) && ! isCardClosed ( card ) && isCard ( card ) ) ;
105117 const userAssignedCards : CardFilterItem [ ] = Object . values ( userCardList ?? { } )
106118 . filter ( ( card ) => filterCondition ( card ) )
107119 . map ( ( card ) => createCardFilterItem ( card , personalDetailsList , selectedCards , illustrations ) ) ;
@@ -170,21 +182,24 @@ function getWorkspaceCardFeedData(cardFeed: WorkspaceCardsList | undefined, repe
170182 if ( ! representativeCard || ! cardFeedArray . some ( ( cardFeedItem ) => isCard ( cardFeedItem ) && ! isCardHiddenFromSearch ( cardFeedItem ) ) ) {
171183 return ;
172184 }
173- const { domainName, bank} = representativeCard ;
185+ const { domainName, bank, cardName } = representativeCard ;
174186 const isBankRepeating = repeatingBanks . includes ( bank ) ;
175187 const policyID = domainName . match ( CONST . REGEX . EXPENSIFY_POLICY_DOMAIN_NAME ) ?. [ 1 ] ?? '' ;
176188 // This will be fixed as part of https://github.com/Expensify/Expensify/issues/507850
177189 // eslint-disable-next-line deprecation/deprecation
178190 const correspondingPolicy = getPolicy ( policyID ?. toUpperCase ( ) ) ;
179191 const cardFeedLabel = isBankRepeating ? correspondingPolicy ?. name : undefined ;
180- const cardFeedBankName = bank === CONST . EXPENSIFY_CARD . BANK ? translate ( 'search.filters.card.expensify' ) : getBankName ( bank as CompanyCardFeed ) ;
181- const cardName =
192+ const isPlaid = ! ! getPlaidInstitutionId ( bank ) ;
193+ const companyCardBank = isPlaid && cardName ? cardName : getBankName ( bank as CompanyCardFeed ) ;
194+
195+ const cardFeedBankName = bank === CONST . EXPENSIFY_CARD . BANK ? translate ( 'search.filters.card.expensify' ) : companyCardBank ;
196+ const fullCardName =
182197 cardFeedBankName === CONST . COMPANY_CARDS . CARD_TYPE . CSV
183198 ? translate ( 'search.filters.card.cardFeedNameCSV' , { cardFeedLabel} )
184199 : translate ( 'search.filters.card.cardFeedName' , { cardFeedBankName, cardFeedLabel} ) ;
185200
186201 return {
187- cardName,
202+ cardName : fullCardName ,
188203 bank,
189204 label : cardFeedLabel ,
190205 type : 'workspace' ,
@@ -276,6 +291,7 @@ function createCardFeedItem({
276291 illustrations : IllustrationsType ;
277292} ) : CardFilterItem {
278293 const isSelected = correspondingCardIDs . every ( ( card ) => selectedCards . includes ( card ) ) ;
294+ const plaidUrl = getPlaidInstitutionIconUrl ( bank ) ;
279295
280296 const icon = getCardFeedIcon ( bank as CompanyCardFeed , illustrations ) ;
281297 return {
@@ -286,6 +302,7 @@ function createCardFeedItem({
286302 bankIcon : {
287303 icon,
288304 } ,
305+ plaidUrl,
289306 cardFeedKey,
290307 isCardFeed : true ,
291308 correspondingCards : correspondingCardIDs ,
0 commit comments