Skip to content

Commit a7ed0bc

Browse files
authored
Merge pull request Expensify#67553 from shubham1206agra/refactor-onyx-25
Removed Onyx.connect in CardUtils lib file (part 2)
2 parents 99ad845 + ba9c73f commit a7ed0bc

8 files changed

Lines changed: 131 additions & 39 deletions

File tree

package.json

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -46,7 +46,7 @@
4646
"test:debug": "TZ=utc NODE_OPTIONS='--inspect-brk --experimental-vm-modules' jest --runInBand",
4747
"perf-test": "NODE_OPTIONS=--experimental-vm-modules npx reassure",
4848
"typecheck": "NODE_OPTIONS=--max_old_space_size=8192 tsc",
49-
"lint": "NODE_OPTIONS=--max_old_space_size=8192 eslint . --max-warnings=292 --cache --cache-location=node_modules/.cache/eslint",
49+
"lint": "NODE_OPTIONS=--max_old_space_size=8192 eslint . --max-warnings=291 --cache --cache-location=node_modules/.cache/eslint",
5050
"lint-changed": "NODE_OPTIONS=--max_old_space_size=8192 ./scripts/lintChanged.sh",
5151
"lint-watch": "npx eslint-watch --watch --changed",
5252
"shellcheck": "./scripts/shellCheck.sh",

src/components/EReceipt.tsx

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -54,7 +54,7 @@ function EReceipt({transactionID, transactionItem, isThumbnail = false}: EReceip
5454
const formattedAmount = convertToDisplayString(transactionAmount, transactionCurrency);
5555
const currency = getCurrencySymbol(transactionCurrency ?? '');
5656
const amount = currency ? formattedAmount.replace(currency, '') : formattedAmount;
57-
const cardDescription = getCompanyCardDescription(transactionCardName, transactionCardID, cardList) ?? (transactionCardID ? getCardDescription(transactionCardID) : '');
57+
const cardDescription = getCompanyCardDescription(transactionCardName, transactionCardID, cardList) ?? (transactionCardID ? getCardDescription(cardList?.[transactionCardID]) : '');
5858

5959
const secondaryBgcolorStyle = secondaryColor ? StyleUtils.getBackgroundColorStyle(secondaryColor) : undefined;
6060
const primaryTextColorStyle = primaryColor ? StyleUtils.getColorStyle(primaryColor) : undefined;

src/components/Search/SearchAutocompleteList.tsx

Lines changed: 2 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -392,14 +392,14 @@ function SearchAutocompleteList(
392392
.filter(
393393
(card) =>
394394
(card.bank.toLowerCase().includes(autocompleteValue.toLowerCase()) || card.lastFourPAN?.includes(autocompleteValue)) &&
395-
!alreadyAutocompletedKeys.includes(getCardDescription(card.cardID).toLowerCase()),
395+
!alreadyAutocompletedKeys.includes(getCardDescription(card).toLowerCase()),
396396
)
397397
.sort()
398398
.slice(0, 10);
399399

400400
return filteredCards.map((card) => ({
401401
filterKey: CONST.SEARCH.SEARCH_USER_FRIENDLY_KEYS.CARD_ID,
402-
text: getCardDescription(card.cardID, allCards),
402+
text: getCardDescription(card),
403403
autocompleteID: card.cardID.toString(),
404404
mapKey: CONST.SEARCH.SYNTAX_FILTER_KEYS.CARD_ID,
405405
}));
@@ -462,7 +462,6 @@ function SearchAutocompleteList(
462462
expenseTypes,
463463
feedAutoCompleteList,
464464
cardAutocompleteList,
465-
allCards,
466465
booleanTypes,
467466
workspaceList,
468467
]);

src/libs/CardUtils.ts

Lines changed: 7 additions & 28 deletions
Original file line numberDiff line numberDiff line change
@@ -9,7 +9,6 @@ import type IllustrationsType from '@styles/theme/illustrations/types';
99
import * as Illustrations from '@src/components/Icon/Illustrations';
1010
import CONST from '@src/CONST';
1111
import type {TranslationPaths} from '@src/languages/types';
12-
import type {OnyxValues} from '@src/ONYXKEYS';
1312
import ONYXKEYS from '@src/ONYXKEYS';
1413
import type {BankAccountList, Card, CardFeeds, CardList, CompanyCardFeed, CurrencyList, ExpensifyCardSettings, PersonalDetailsList, Policy, WorkspaceCardsList} from '@src/types/onyx';
1514
import type {FilteredCardList} from '@src/types/onyx/Card';
@@ -21,18 +20,6 @@ import {filterObject} from './ObjectUtils';
2120
import {getDisplayNameOrDefault} from './PersonalDetailsUtils';
2221
import StringUtils from './StringUtils';
2322

24-
let allCards: OnyxValues[typeof ONYXKEYS.CARD_LIST] = {};
25-
Onyx.connect({
26-
key: ONYXKEYS.CARD_LIST,
27-
callback: (val) => {
28-
if (!val || Object.keys(val).length === 0) {
29-
return;
30-
}
31-
32-
allCards = val;
33-
},
34-
});
35-
3623
let allWorkspaceCards: OnyxCollection<WorkspaceCardsList> = {};
3724
Onyx.connect({
3825
key: ONYXKEYS.COLLECTION.WORKSPACE_CARDS_LIST,
@@ -50,29 +37,21 @@ function getMonthFromExpirationDateString(expirationDateString: string) {
5037
}
5138

5239
/**
53-
* @param cardID
40+
* @param card
5441
* @returns boolean
5542
*/
56-
function isExpensifyCard(cardID?: number) {
57-
if (!cardID) {
58-
return false;
59-
}
60-
const card = allCards[cardID];
43+
function isExpensifyCard(card?: Card) {
6144
if (!card) {
6245
return false;
6346
}
6447
return card.bank === CONST.EXPENSIFY_CARD.BANK;
6548
}
6649

6750
/**
68-
* @param cardID
51+
* @param card
6952
* @returns string in format %<bank> - <lastFourPAN || Not Activated>%.
7053
*/
71-
function getCardDescription(cardID?: number, cards: CardList = allCards) {
72-
if (!cardID) {
73-
return '';
74-
}
75-
const card = cards[cardID];
54+
function getCardDescription(card?: Card) {
7655
if (!card) {
7756
return '';
7857
}
@@ -90,7 +69,7 @@ function getCardDescription(cardID?: number, cards: CardList = allCards) {
9069
* @returns company card name
9170
*/
9271
function getCompanyCardDescription(transactionCardName?: string, cardID?: number, cards?: CardList) {
93-
if (!cardID || isExpensifyCard(cardID) || !cards?.[cardID]) {
72+
if (!cardID || !cards?.[cardID] || isExpensifyCard(cards[cardID])) {
9473
return transactionCardName;
9574
}
9675
const card = cards[cardID];
@@ -110,9 +89,9 @@ function isCardClosed(card: Card) {
11089
return card?.state === CONST.EXPENSIFY_CARD.STATE.CLOSED;
11190
}
11291

113-
function mergeCardListWithWorkspaceFeeds(workspaceFeeds: Record<string, WorkspaceCardsList | undefined>, cardList = allCards, shouldExcludeCardHiddenFromSearch = false) {
92+
function mergeCardListWithWorkspaceFeeds(workspaceFeeds: Record<string, WorkspaceCardsList | undefined>, cardList: CardList | undefined, shouldExcludeCardHiddenFromSearch = false) {
11493
const feedCards: CardList = {};
115-
Object.values(cardList).forEach((card) => {
94+
Object.values(cardList ?? {}).forEach((card) => {
11695
if (!isCard(card) || (shouldExcludeCardHiddenFromSearch && isCardHiddenFromSearch(card))) {
11796
return;
11897
}

src/libs/SearchQueryUtils.ts

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -722,7 +722,7 @@ function getFilterDisplayValue(
722722
if (Number.isNaN(cardID)) {
723723
return filterValue;
724724
}
725-
return getCardDescription(cardID, cardList) || filterValue;
725+
return getCardDescription(cardList?.[cardID]) || filterValue;
726726
}
727727
if (filterName === CONST.SEARCH.SYNTAX_FILTER_KEYS.IN) {
728728
return getReportName(reports?.[`${ONYXKEYS.COLLECTION.REPORT}${filterValue}`]) || filterValue;
@@ -822,7 +822,7 @@ function buildUserReadableQueryString(
822822
if (Number.isNaN(cardID)) {
823823
acc.push({operator: filter.operator, value: cardID});
824824
} else {
825-
acc.push({operator: filter.operator, value: getCardDescription(cardID, cardList) || cardID});
825+
acc.push({operator: filter.operator, value: getCardDescription(cardList?.[cardID]) || cardID});
826826
}
827827
}
828828
return acc;

src/pages/Search/AdvancedSearchFilters.tsx

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -358,7 +358,7 @@ function getFilterCardDisplayTitle(filters: Partial<SearchAdvancedFiltersForm>,
358358

359359
const cardNames = Object.values(cards)
360360
.filter((card) => cardIdsFilter.includes(card.cardID.toString()) && !feedFilter.includes(createCardFeedKey(card.fundID, card.bank)))
361-
.map((card) => getCardDescription(card.cardID, cards));
361+
.map((card) => getCardDescription(card));
362362

363363
const feedNames = Object.keys(cardFeedNamesWithType)
364364
.filter((workspaceCardFeedKey) => {

src/pages/settings/Wallet/PaymentMethodList.tsx

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -219,14 +219,14 @@ function PaymentMethodList({
219219
const assignedCards = Object.values(isLoadingCardList ? {} : (cardList ?? {}))
220220
// Filter by active cards associated with a domain
221221
.filter((card) => !!card.domainName && CONST.EXPENSIFY_CARD.ACTIVE_STATES.includes(card.state ?? 0));
222-
const assignedCardsSorted = lodashSortBy(assignedCards, (card) => !isExpensifyCard(card.cardID));
222+
const assignedCardsSorted = lodashSortBy(assignedCards, (card) => !isExpensifyCard(card));
223223

224224
const assignedCardsGrouped: PaymentMethodItem[] = [];
225225
assignedCardsSorted.forEach((card) => {
226226
const isDisabled = card.pendingAction === CONST.RED_BRICK_ROAD_PENDING_ACTION.DELETE || !!card.errors;
227227
const icon = getCardFeedIcon(card.bank as CompanyCardFeed, illustrations);
228228

229-
if (!isExpensifyCard(card.cardID)) {
229+
if (!isExpensifyCard(card)) {
230230
const pressHandler = onPress as CardPressHandler;
231231
const lastFourPAN = lastFourNumbersFromCardName(card.cardName);
232232
const plaidUrl = getPlaidInstitutionIconUrl(card.bank);

tests/unit/CardUtilsTest.ts

Lines changed: 115 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -10,8 +10,10 @@ import {
1010
formatCardExpiration,
1111
getBankCardDetailsImage,
1212
getBankName,
13+
getCardDescription,
1314
getCardFeedIcon,
1415
getCardsByCardholderName,
16+
getCompanyCardDescription,
1517
getCompanyFeeds,
1618
getCustomOrFormattedFeedName,
1719
getFeedType,
@@ -21,12 +23,13 @@ import {
2123
getYearFromExpirationDateString,
2224
hasIssuedExpensifyCard,
2325
isCustomFeed as isCustomFeedCardUtils,
26+
isExpensifyCard,
2427
isExpensifyCardFullySetUp,
2528
lastFourNumbersFromCardName,
2629
maskCardNumber,
2730
sortCardsByCardholderName,
2831
} from '@src/libs/CardUtils';
29-
import type {CardFeeds, CardList, CompanyCardFeed, ExpensifyCardSettings, PersonalDetailsList, Policy, WorkspaceCardsList} from '@src/types/onyx';
32+
import type {Card, CardFeeds, CardList, CompanyCardFeed, ExpensifyCardSettings, PersonalDetailsList, Policy, WorkspaceCardsList} from '@src/types/onyx';
3033
import type {CompanyCardFeedWithNumber} from '@src/types/onyx/CardFeeds';
3134
import {localeCompare} from '../utils/TestHelper';
3235
import waitForBatchedUpdates from '../utils/waitForBatchedUpdates';
@@ -1024,4 +1027,115 @@ describe('CardUtils', () => {
10241027
expect(sortedCards.at(0)?.cardID).toBe(1);
10251028
});
10261029
});
1030+
1031+
describe('getCardDescription', () => {
1032+
it('should return the correct card description for company card', () => {
1033+
const card: Card = {
1034+
accountID: 18439984,
1035+
bank: CONST.COMPANY_CARD.FEED_BANK_NAME.VISA,
1036+
cardID: 21310091,
1037+
cardName: '480801XXXXXX2554',
1038+
domainName: 'expensify-policy41314f4dc5ce25af.exfy',
1039+
fraud: 'none',
1040+
lastFourPAN: '2554',
1041+
lastUpdated: '',
1042+
lastScrape: '2024-11-27 11:00:53',
1043+
scrapeMinDate: '2024-10-17',
1044+
state: 3,
1045+
};
1046+
const description = getCardDescription(card);
1047+
expect(description).toBe('Visa - 2554');
1048+
});
1049+
1050+
it('should return the correct card description for Expensify card', () => {
1051+
const card: Card = {
1052+
accountID: 18439984,
1053+
bank: CONST.EXPENSIFY_CARD.BANK,
1054+
cardID: 21570657,
1055+
cardName: 'CREDIT CARD...5644',
1056+
domainName: 'expensify-policy17f617b9fe23d2f1.exfy',
1057+
fraud: 'none',
1058+
lastFourPAN: '',
1059+
lastScrape: '',
1060+
lastUpdated: '',
1061+
state: 2,
1062+
};
1063+
const description = getCardDescription(card);
1064+
expect(description).toBe('Expensify Card');
1065+
});
1066+
});
1067+
1068+
describe('isExpensifyCard', () => {
1069+
it('should return true for Expensify Card', () => {
1070+
const card: Card = {
1071+
accountID: 18439984,
1072+
bank: CONST.EXPENSIFY_CARD.BANK,
1073+
cardID: 21570657,
1074+
cardName: 'CREDIT CARD...5644',
1075+
domainName: 'expensify-policy17f617b9fe23d2f1.exfy',
1076+
fraud: 'none',
1077+
lastFourPAN: '',
1078+
lastScrape: '',
1079+
lastUpdated: '',
1080+
state: 2,
1081+
};
1082+
expect(isExpensifyCard(card)).toBe(true);
1083+
});
1084+
1085+
it('should return false for non-Expensify Card', () => {
1086+
const card: Card = {
1087+
accountID: 18439984,
1088+
bank: CONST.COMPANY_CARD.FEED_BANK_NAME.VISA,
1089+
cardID: 21310091,
1090+
cardName: '480801XXXXXX2554',
1091+
domainName: 'expensify-policy41314f4dc5ce25af.exfy',
1092+
fraud: 'none',
1093+
lastFourPAN: '2554',
1094+
lastUpdated: '',
1095+
lastScrape: '2024-11-27 11:00:53',
1096+
scrapeMinDate: '2024-10-17',
1097+
state: 3,
1098+
};
1099+
expect(isExpensifyCard(card)).toBe(false);
1100+
});
1101+
});
1102+
1103+
describe('getCompanyCardDescription', () => {
1104+
const cardList: CardList = {
1105+
'21310091': {
1106+
accountID: 18439984,
1107+
bank: CONST.COMPANY_CARD.FEED_BANK_NAME.VISA,
1108+
cardID: 21310091,
1109+
cardName: '480801XXXXXX2554',
1110+
domainName: 'expensify-policy41314f4dc5ce25af.exfy',
1111+
fraud: 'none',
1112+
lastFourPAN: '2554',
1113+
lastUpdated: '',
1114+
lastScrape: '2024-11-27 11:00:53',
1115+
scrapeMinDate: '2024-10-17',
1116+
state: 3,
1117+
},
1118+
'21570657': {
1119+
accountID: 18439984,
1120+
bank: CONST.EXPENSIFY_CARD.BANK,
1121+
cardID: 21570657,
1122+
cardName: 'CREDIT CARD...5644',
1123+
domainName: 'expensify-policy17f617b9fe23d2f1.exfy',
1124+
fraud: 'none',
1125+
lastFourPAN: '',
1126+
lastScrape: '',
1127+
lastUpdated: '',
1128+
state: 2,
1129+
},
1130+
};
1131+
it('should return the correct description for a company card', () => {
1132+
const description = getCompanyCardDescription('Test', 21310091, cardList);
1133+
expect(description).toBe('480801XXXXXX2554');
1134+
});
1135+
1136+
it('should return the correct description for an Expensify card', () => {
1137+
const description = getCompanyCardDescription('Test', 21570657, cardList);
1138+
expect(description).toBe('Test');
1139+
});
1140+
});
10271141
});

0 commit comments

Comments
 (0)