diff --git a/Mobile-Expensify b/Mobile-Expensify
index 469e94ca2505..1ddab27f66cb 160000
--- a/Mobile-Expensify
+++ b/Mobile-Expensify
@@ -1 +1 @@
-Subproject commit 469e94ca25059ffbe06547089a5976c8880e7609
+Subproject commit 1ddab27f66cb2778f4a29d75707ce794fe3ab65e
diff --git a/android/app/build.gradle b/android/app/build.gradle
index 186dc8642803..d1c3a126035d 100644
--- a/android/app/build.gradle
+++ b/android/app/build.gradle
@@ -114,8 +114,8 @@ android {
minSdkVersion rootProject.ext.minSdkVersion
targetSdkVersion rootProject.ext.targetSdkVersion
multiDexEnabled rootProject.ext.multiDexEnabled
- versionCode 1009025904
- versionName "9.2.59-4"
+ versionCode 1009025905
+ versionName "9.2.59-5"
// Supported language variants must be declared here to avoid from being removed during the compilation.
// This also helps us to not include unnecessary language variants in the APK.
resConfigs "en", "es"
diff --git a/ios/NewExpensify/Info.plist b/ios/NewExpensify/Info.plist
index bc83c7154e51..843bce0ec8a2 100644
--- a/ios/NewExpensify/Info.plist
+++ b/ios/NewExpensify/Info.plist
@@ -44,7 +44,7 @@
CFBundleVersion
- 9.2.59.4
+ 9.2.59.5
FullStory
OrgId
diff --git a/ios/NotificationServiceExtension/Info.plist b/ios/NotificationServiceExtension/Info.plist
index 38c7d1995c04..e7f8d1e4692b 100644
--- a/ios/NotificationServiceExtension/Info.plist
+++ b/ios/NotificationServiceExtension/Info.plist
@@ -13,7 +13,7 @@
CFBundleShortVersionString
9.2.59
CFBundleVersion
- 9.2.59.4
+ 9.2.59.5
NSExtension
NSExtensionPointIdentifier
diff --git a/ios/ShareViewController/Info.plist b/ios/ShareViewController/Info.plist
index e46151733deb..50ac8e1d3cab 100644
--- a/ios/ShareViewController/Info.plist
+++ b/ios/ShareViewController/Info.plist
@@ -13,7 +13,7 @@
CFBundleShortVersionString
9.2.59
CFBundleVersion
- 9.2.59.4
+ 9.2.59.5
NSExtension
NSExtensionAttributes
diff --git a/package-lock.json b/package-lock.json
index 345d68716e86..3af8cb69ccc8 100644
--- a/package-lock.json
+++ b/package-lock.json
@@ -1,12 +1,12 @@
{
"name": "new.expensify",
- "version": "9.2.59-4",
+ "version": "9.2.59-5",
"lockfileVersion": 3,
"requires": true,
"packages": {
"": {
"name": "new.expensify",
- "version": "9.2.59-4",
+ "version": "9.2.59-5",
"hasInstallScript": true,
"license": "MIT",
"dependencies": {
diff --git a/package.json b/package.json
index 60b0d8f3fa21..7855ad71b272 100644
--- a/package.json
+++ b/package.json
@@ -1,6 +1,6 @@
{
"name": "new.expensify",
- "version": "9.2.59-4",
+ "version": "9.2.59-5",
"author": "Expensify, Inc.",
"homepage": "https://new.expensify.com",
"description": "New Expensify is the next generation of Expensify: a reimagination of payments based atop a foundation of chat.",
diff --git a/src/CONST/index.ts b/src/CONST/index.ts
index f95edd054da7..31db9ce7a341 100755
--- a/src/CONST/index.ts
+++ b/src/CONST/index.ts
@@ -3349,7 +3349,6 @@ const CONST = {
AMEX_FILE_DOWNLOAD: 'americanexpressfd.us',
CSV: 'ccupload',
},
- FEED_KEY_SEPARATOR: '#',
STEP_NAMES: ['1', '2', '3', '4'],
STEP: {
BANK_CONNECTION: 'BankConnection',
diff --git a/src/ONYXKEYS.ts b/src/ONYXKEYS.ts
index 22af17fee262..fb7c1526f162 100755
--- a/src/ONYXKEYS.ts
+++ b/src/ONYXKEYS.ts
@@ -1090,7 +1090,7 @@ type OnyxCollectionValuesMapping = {
[ONYXKEYS.COLLECTION.WORKSPACE_CARDS_LIST]: OnyxTypes.WorkspaceCardsList;
[ONYXKEYS.COLLECTION.EXPENSIFY_CARD_CONTINUOUS_RECONCILIATION_CONNECTION]: OnyxTypes.PolicyConnectionName;
[ONYXKEYS.COLLECTION.EXPENSIFY_CARD_USE_CONTINUOUS_RECONCILIATION]: boolean;
- [ONYXKEYS.COLLECTION.LAST_SELECTED_FEED]: OnyxTypes.CompanyCardFeedWithDomainID;
+ [ONYXKEYS.COLLECTION.LAST_SELECTED_FEED]: OnyxTypes.CompanyCardFeed;
[ONYXKEYS.COLLECTION.LAST_SELECTED_EXPENSIFY_CARD_FEED]: OnyxTypes.FundID;
[ONYXKEYS.COLLECTION.NVP_EXPENSIFY_ON_CARD_WAITLIST]: OnyxTypes.CardOnWaitlist;
[ONYXKEYS.COLLECTION.ISSUE_NEW_EXPENSIFY_CARD]: OnyxTypes.IssueNewCard;
diff --git a/src/hooks/useCardFeeds.tsx b/src/hooks/useCardFeeds.tsx
index 46282e29dae8..a926c0a9db18 100644
--- a/src/hooks/useCardFeeds.tsx
+++ b/src/hooks/useCardFeeds.tsx
@@ -1,29 +1,17 @@
import {useMemo} from 'react';
import type {OnyxCollection, ResultMetadata} from 'react-native-onyx';
-import {getCompanyCardFeedWithDomainID} from '@libs/CardUtils';
import ONYXKEYS from '@src/ONYXKEYS';
-import type {CardFeeds, CompanyCardFeed, CompanyCardFeedWithDomainID} from '@src/types/onyx';
-import type {CustomCardFeedData, DirectCardFeedData} from '@src/types/onyx/CardFeeds';
+import type {CardFeeds, CompanyCardFeed} from '@src/types/onyx';
import useOnyx from './useOnyx';
import useWorkspaceAccountID from './useWorkspaceAccountID';
-type CombinedCardFeed = CustomCardFeedData &
- Partial & {
- /** Custom feed name, originally coming from settings.companyCardNicknames */
- customFeedName?: string;
-
- /** Feed name */
- feed: CompanyCardFeed;
- };
-
-type CombinedCardFeeds = Record;
-
/**
* This is a custom hook that combines workspace and domain card feeds for a given policy.
*
* This hook:
* - Gets all available feeds (ONYXKEYS.COLLECTION.SHARED_NVP_PRIVATE_DOMAIN_MEMBER) from Onyx.
* - Extracts and compiles card feeds data including only feeds where the `preferredPolicy` matches the `policyID`.
+ * - Merges a workspace feed with relevant domain feeds.
*
* @param policyID - The workspace policyID to filter and construct card feeds for.
* @returns -
@@ -32,7 +20,7 @@ type CombinedCardFeeds = Record;
* 2. The result metadata from the Onyx collection fetch.
* 3. Card feeds specific to the given policyID (or `undefined` if unavailable).
*/
-const useCardFeeds = (policyID: string | undefined): [CombinedCardFeeds | undefined, ResultMetadata>, CardFeeds | undefined] => {
+const useCardFeeds = (policyID: string | undefined): [CardFeeds | undefined, ResultMetadata>, CardFeeds | undefined] => {
const workspaceAccountID = useWorkspaceAccountID(policyID);
const [allFeeds, allFeedsResult] = useOnyx(ONYXKEYS.COLLECTION.SHARED_NVP_PRIVATE_DOMAIN_MEMBER, {canBeMissing: true});
const defaultFeed = allFeeds?.[`${ONYXKEYS.COLLECTION.SHARED_NVP_PRIVATE_DOMAIN_MEMBER}${workspaceAccountID}`];
@@ -42,9 +30,18 @@ const useCardFeeds = (policyID: string | undefined): [CombinedCardFeeds | undefi
return undefined;
}
- const result: CombinedCardFeeds = {};
+ const {companyCards = {}, companyCardNicknames = {}, oAuthAccountDetails = {}} = defaultFeed?.settings ?? {};
- return Object.entries(allFeeds).reduce((acc, [onyxKey, feed]) => {
+ const result: CardFeeds & {settings: Required} = {
+ settings: {
+ companyCards: {...companyCards},
+ companyCardNicknames: {...companyCardNicknames},
+ oAuthAccountDetails: {...oAuthAccountDetails},
+ },
+ isLoading: defaultFeed?.isLoading,
+ };
+
+ return Object.entries(allFeeds).reduce}>((acc, [onyxKey, feed]) => {
if (!feed?.settings?.companyCards) {
return acc;
}
@@ -52,30 +49,29 @@ const useCardFeeds = (policyID: string | undefined): [CombinedCardFeeds | undefi
Object.entries(feed.settings.companyCards).forEach(([key, feedSettings]) => {
const feedName = key as CompanyCardFeed;
const feedOAuthAccountDetails = feed.settings.oAuthAccountDetails?.[feedName];
- const feedCompanyCardNickname = feed.settings.companyCardNicknames?.[feedName];
- const domainID = onyxKey.split('_').at(-1);
+ const feedCompanyCardNicknames = feed.settings.companyCardNicknames?.[feedName];
- if (feedSettings.preferredPolicy !== policyID || !domainID) {
+ if (feedSettings.preferredPolicy !== policyID || acc.settings.companyCards[feedName]) {
return;
}
- const combinedFeedKey = getCompanyCardFeedWithDomainID(feedName, domainID);
+ const domainID = onyxKey.split('_').at(-1);
+
+ acc.settings.companyCards[feedName] = {...feedSettings, domainID: domainID ? Number(domainID) : undefined};
- acc[combinedFeedKey] = {
- ...feedSettings,
- ...feedOAuthAccountDetails,
- customFeedName: feedCompanyCardNickname,
- domainID: Number(domainID),
- feed: feedName,
- };
+ if (feedOAuthAccountDetails) {
+ acc.settings.oAuthAccountDetails[feedName] = feedOAuthAccountDetails;
+ }
+ if (feedCompanyCardNicknames) {
+ acc.settings.companyCardNicknames[feedName] = feedCompanyCardNicknames;
+ }
});
return acc;
}, result);
- }, [allFeeds, policyID]);
+ }, [allFeeds, defaultFeed?.isLoading, defaultFeed?.settings, policyID]);
return [workspaceFeeds, allFeedsResult, defaultFeed];
};
export default useCardFeeds;
-export type {CombinedCardFeeds, CompanyCardFeedWithDomainID, CombinedCardFeed};
diff --git a/src/hooks/useCardsList.tsx b/src/hooks/useCardsList.tsx
index 934d1cb63b6d..769144a1a02b 100644
--- a/src/hooks/useCardsList.tsx
+++ b/src/hooks/useCardsList.tsx
@@ -1,14 +1,18 @@
import type {ResultMetadata} from 'react-native-onyx';
-import {filterInactiveCards} from '@libs/CardUtils';
-import CONST from '@src/CONST';
+import {filterInactiveCards, getCompanyFeeds, getDomainOrWorkspaceAccountID} from '@libs/CardUtils';
import ONYXKEYS from '@src/ONYXKEYS';
-import type {CardList, CompanyCardFeedWithDomainID} from '@src/types/onyx';
+import type {CardList, CompanyCardFeed} from '@src/types/onyx';
+import useCardFeeds from './useCardFeeds';
import useOnyx from './useOnyx';
+import useWorkspaceAccountID from './useWorkspaceAccountID';
-/* Custom hook that retrieves a list of company cards for the given selected feed. */
-const useCardsList = (selectedFeed: CompanyCardFeedWithDomainID | undefined): [CardList | undefined, ResultMetadata] => {
- const [feed, domainOrWorkspaceAccountID] = selectedFeed?.split(CONST.COMPANY_CARD.FEED_KEY_SEPARATOR) ?? [];
- const [cardsList, cardsListMetadata] = useOnyx(`${ONYXKEYS.COLLECTION.WORKSPACE_CARDS_LIST}${domainOrWorkspaceAccountID}_${feed}`, {
+/* Custom hook that retrieves a list of company cards for the given policy and selected feed. */
+const useCardsList = (policyID: string | undefined, selectedFeed: CompanyCardFeed | undefined): [CardList | undefined, ResultMetadata] => {
+ const workspaceAccountID = useWorkspaceAccountID(policyID);
+ const [cardFeeds] = useCardFeeds(policyID);
+ const companyCards = getCompanyFeeds(cardFeeds);
+ const domainOrWorkspaceAccountID = getDomainOrWorkspaceAccountID(workspaceAccountID, selectedFeed ? companyCards[selectedFeed] : undefined);
+ const [cardsList, cardsListMetadata] = useOnyx(`${ONYXKEYS.COLLECTION.WORKSPACE_CARDS_LIST}${domainOrWorkspaceAccountID}_${selectedFeed}`, {
selector: filterInactiveCards,
canBeMissing: true,
});
diff --git a/src/hooks/useIsAllowedToIssueCompanyCard.ts b/src/hooks/useIsAllowedToIssueCompanyCard.ts
index 050506c12151..148dc0433065 100644
--- a/src/hooks/useIsAllowedToIssueCompanyCard.ts
+++ b/src/hooks/useIsAllowedToIssueCompanyCard.ts
@@ -17,11 +17,7 @@ function useIsAllowedToIssueCompanyCard({policyID}: {policyID?: string}) {
const selectedFeedData = selectedFeed && companyCards[selectedFeed];
const [adminAccess] = useOnyx(`${ONYXKEYS.COLLECTION.SHARED_NVP_PRIVATE_ADMIN_ACCESS}${selectedFeedData?.domainID}`, {canBeMissing: true});
- if (selectedFeedData?.domainID === policy?.workspaceAccountID) {
- return isPolicyAdmin;
- }
-
- return !!adminAccess;
+ return selectedFeedData?.domainID ? !!adminAccess : isPolicyAdmin;
}
export default useIsAllowedToIssueCompanyCard;
diff --git a/src/hooks/useUpdateFeedBrokenConnection.ts b/src/hooks/useUpdateFeedBrokenConnection.ts
index 77fdc8ffe815..1c4daab40368 100644
--- a/src/hooks/useUpdateFeedBrokenConnection.ts
+++ b/src/hooks/useUpdateFeedBrokenConnection.ts
@@ -1,14 +1,14 @@
import {useCallback} from 'react';
-import {checkIfFeedConnectionIsBroken, getCompanyCardFeed, getCompanyFeeds, getDomainOrWorkspaceAccountID, getFeedConnectionBrokenCard} from '@libs/CardUtils';
+import {checkIfFeedConnectionIsBroken, getCompanyFeeds, getDomainOrWorkspaceAccountID, getFeedConnectionBrokenCard} from '@libs/CardUtils';
import {updateWorkspaceCompanyCard} from '@userActions/CompanyCards';
import CONST from '@src/CONST';
-import type {CompanyCardFeedWithDomainID} from '@src/types/onyx';
+import type {CompanyCardFeed} from '@src/types/onyx';
import useCardFeeds from './useCardFeeds';
import useCardsList from './useCardsList';
import usePolicy from './usePolicy';
-export default function useUpdateFeedBrokenConnection({policyID, feed}: {policyID?: string; feed?: CompanyCardFeedWithDomainID}) {
- const [cardsList] = useCardsList(feed);
+export default function useUpdateFeedBrokenConnection({policyID, feed}: {policyID?: string; feed?: CompanyCardFeed}) {
+ const [cardsList] = useCardsList(policyID, feed);
const policy = usePolicy(policyID);
const [cardFeeds] = useCardFeeds(policyID);
const companyFeeds = getCompanyFeeds(cardFeeds);
@@ -23,7 +23,7 @@ export default function useUpdateFeedBrokenConnection({policyID, feed}: {policyI
if (!brokenCardId || !feed) {
return;
}
- updateWorkspaceCompanyCard(domainOrWorkspaceAccountID, brokenCardId, getCompanyCardFeed(feed), brokenCard?.lastScrapeResult);
+ updateWorkspaceCompanyCard(domainOrWorkspaceAccountID, brokenCardId, feed, brokenCard?.lastScrapeResult);
}, [brokenCard?.lastScrapeResult, brokenCardId, domainOrWorkspaceAccountID, feed]);
return {updateBrokenConnection, isFeedConnectionBroken};
diff --git a/src/libs/CardFeedUtils.ts b/src/libs/CardFeedUtils.ts
index 913395fd3af8..a36199da7444 100644
--- a/src/libs/CardFeedUtils.ts
+++ b/src/libs/CardFeedUtils.ts
@@ -9,8 +9,8 @@ import {isEmptyObject} from '@src/types/utils/EmptyObject';
import {
getBankName,
getCardFeedIcon,
+ getCompanyFeeds,
getCustomOrFormattedFeedName,
- getOriginalCompanyFeeds,
getPlaidInstitutionIconUrl,
getPlaidInstitutionId,
isCard,
@@ -424,7 +424,7 @@ function getCardFeedsForDisplay(allCardFeeds: OnyxCollection, allCard
return;
}
- Object.keys(getOriginalCompanyFeeds(cardFeeds)).forEach((key) => {
+ Object.keys(getCompanyFeeds(cardFeeds, true, true)).forEach((key) => {
const feed = key as CompanyCardFeed;
const id = `${fundID}_${feed}`;
@@ -436,7 +436,7 @@ function getCardFeedsForDisplay(allCardFeeds: OnyxCollection, allCard
id,
feed,
fundID,
- name: getCustomOrFormattedFeedName(feed, cardFeeds?.settings?.companyCardNicknames?.[feed], false) ?? feed,
+ name: getCustomOrFormattedFeedName(feed, cardFeeds?.settings?.companyCardNicknames, false) ?? feed,
};
});
});
@@ -478,7 +478,7 @@ function getCardFeedsForDisplayPerPolicy(allCardFeeds: OnyxCollection
return;
}
- Object.entries(getOriginalCompanyFeeds(cardFeeds)).forEach(([key, feedData]) => {
+ Object.entries(getCompanyFeeds(cardFeeds, true, true)).forEach(([key, feedData]) => {
const preferredPolicy = 'preferredPolicy' in feedData ? (feedData.preferredPolicy ?? '') : '';
const feed = key as CompanyCardFeed;
const id = `${fundID}_${feed}`;
@@ -487,7 +487,7 @@ function getCardFeedsForDisplayPerPolicy(allCardFeeds: OnyxCollection
id,
feed,
fundID,
- name: getCustomOrFormattedFeedName(feed, cardFeeds?.settings?.companyCardNicknames?.[feed], false) ?? feed,
+ name: getCustomOrFormattedFeedName(feed, cardFeeds?.settings?.companyCardNicknames, false) ?? feed,
});
});
});
diff --git a/src/libs/CardUtils.ts b/src/libs/CardUtils.ts
index 9a5ea851e745..f70e3308e321 100644
--- a/src/libs/CardUtils.ts
+++ b/src/libs/CardUtils.ts
@@ -4,7 +4,6 @@ import type {OnyxCollection, OnyxEntry} from 'react-native-onyx';
import type {ValueOf} from 'type-fest';
import ExpensifyCardImage from '@assets/images/expensify-card.svg';
import type {LocaleContextProps} from '@components/LocaleContextProvider';
-import type {CombinedCardFeed, CombinedCardFeeds} from '@hooks/useCardFeeds';
import type IllustrationsType from '@styles/theme/illustrations/types';
import * as Illustrations from '@src/components/Icon/Illustrations';
import CONST from '@src/CONST';
@@ -12,7 +11,7 @@ import type {TranslationPaths} from '@src/languages/types';
import ONYXKEYS from '@src/ONYXKEYS';
import type {BankAccountList, Card, CardFeeds, CardList, CompanyCardFeed, CurrencyList, ExpensifyCardSettings, PersonalDetailsList, Policy, WorkspaceCardsList} from '@src/types/onyx';
import type {FilteredCardList} from '@src/types/onyx/Card';
-import type {CardFeedData, CompanyCardFeedWithDomainID, CompanyCardFeedWithNumber, CompanyFeeds} from '@src/types/onyx/CardFeeds';
+import type {CardFeedData, CompanyCardFeedWithNumber, CompanyCardNicknames, CompanyFeeds, DirectCardFeedData} from '@src/types/onyx/CardFeeds';
import {isEmptyObject} from '@src/types/utils/EmptyObject';
import type IconAsset from '@src/types/utils/IconAsset';
// eslint-disable-next-line @typescript-eslint/no-deprecated
@@ -345,27 +344,16 @@ function isCustomFeed(feed: CompanyCardFeedWithNumber): boolean {
return [CONST.COMPANY_CARD.FEED_BANK_NAME.MASTER_CARD, CONST.COMPANY_CARD.FEED_BANK_NAME.VISA, CONST.COMPANY_CARD.FEED_BANK_NAME.AMEX].some((value) => feed.startsWith(value));
}
-function getOriginalCompanyFeeds(cardFeeds: OnyxEntry): CompanyFeeds {
+function getCompanyFeeds(cardFeeds: OnyxEntry, shouldFilterOutRemovedFeeds = false, shouldFilterOutPendingFeeds = false): CompanyFeeds {
return Object.fromEntries(
Object.entries(cardFeeds?.settings?.companyCards ?? {}).filter(([key, value]) => {
- if (value.pendingAction === CONST.RED_BRICK_ROAD_PENDING_ACTION.DELETE || value.pending) {
- return false;
- }
- return key !== CONST.EXPENSIFY_CARD.BANK;
- }),
- );
-}
-
-function getCompanyFeeds(cardFeeds: OnyxEntry, shouldFilterOutRemovedFeeds = false, shouldFilterOutPendingFeeds = false): CombinedCardFeeds {
- return Object.fromEntries(
- Object.entries(cardFeeds ?? {}).filter(([, value]) => {
if (shouldFilterOutRemovedFeeds && value.pendingAction === CONST.RED_BRICK_ROAD_PENDING_ACTION.DELETE) {
return false;
}
if (shouldFilterOutPendingFeeds && value.pending) {
return false;
}
- return !value.feed.includes(CONST.EXPENSIFY_CARD.BANK);
+ return key !== CONST.EXPENSIFY_CARD.BANK;
}),
);
}
@@ -418,11 +406,13 @@ const getBankCardDetailsImage = (bank: ValueOf
return iconMap[bank];
};
-function getCustomOrFormattedFeedName(feed?: CompanyCardFeed, customFeedName?: string, shouldAddCardsSuffix = true): string | undefined {
+function getCustomOrFormattedFeedName(feed?: CompanyCardFeed, companyCardNicknames?: CompanyCardNicknames, shouldAddCardsSuffix = true): string | undefined {
if (!feed) {
return;
}
+ const customFeedName = companyCardNicknames?.[feed];
+
if (customFeedName && typeof customFeedName !== 'string') {
return '';
}
@@ -524,24 +514,21 @@ function getCorrectStepForPlaidSelectedBank(selectedBank: ValueOf, cardFeeds: OnyxEntry): CompanyCardFeedWithDomainID | undefined {
- const defaultFeed = Object.keys(getCompanyFeeds(cardFeeds, true)).at(0) as CompanyCardFeedWithDomainID | undefined;
- if (!lastSelectedFeed?.includes(CONST.COMPANY_CARD.FEED_KEY_SEPARATOR)) {
- return defaultFeed;
- }
- return lastSelectedFeed;
+function getSelectedFeed(lastSelectedFeed: OnyxEntry, cardFeeds: OnyxEntry): CompanyCardFeed | undefined {
+ const defaultFeed = Object.keys(getCompanyFeeds(cardFeeds, true)).at(0) as CompanyCardFeed | undefined;
+ return lastSelectedFeed ?? defaultFeed;
}
-function getCompanyCardFeedWithDomainID(feedName: CompanyCardFeed, domainID: number | string): CompanyCardFeedWithDomainID {
- return `${feedName}${CONST.COMPANY_CARD.FEED_KEY_SEPARATOR}${domainID}`;
-}
+function isSelectedFeedExpired(directFeed: DirectCardFeedData | undefined): boolean {
+ if (!directFeed || !directFeed.expiration) {
+ return false;
+ }
-function isSelectedFeedExpired(cardFeed: CombinedCardFeed | undefined): boolean {
- return cardFeed?.expiration ? isBefore(fromUnixTime(cardFeed.expiration), new Date()) : false;
+ return isBefore(fromUnixTime(directFeed.expiration), new Date());
}
/** Returns list of cards which can be assigned */
-function getFilteredCardList(list: WorkspaceCardsList | undefined, accountList: string[] | undefined, workspaceCardFeeds: OnyxCollection) {
+function getFilteredCardList(list: WorkspaceCardsList | undefined, directFeed: DirectCardFeedData | undefined, workspaceCardFeeds: OnyxCollection) {
const {cardList: customFeedCardsToAssign, ...cards} = list ?? {};
const assignedCards = new Set(Object.values(cards).map((card) => card.cardName));
@@ -560,8 +547,8 @@ function getFilteredCardList(list: WorkspaceCardsList | undefined, accountList:
});
});
- if (accountList) {
- const unassignedDirectFeedCards = accountList.filter((cardNumber) => !assignedCards.has(cardNumber) && !allWorkspaceAssignedCards.has(cardNumber));
+ if (directFeed) {
+ const unassignedDirectFeedCards = directFeed.accountList.filter((cardNumber) => !assignedCards.has(cardNumber) && !allWorkspaceAssignedCards.has(cardNumber));
return Object.fromEntries(unassignedDirectFeedCards.map((cardNumber) => [cardNumber, cardNumber]));
}
@@ -585,7 +572,7 @@ function checkIfNewFeedConnected(prevFeedsData: CompanyFeeds, currentFeedsData:
return {
isNewFeedConnected: currentFeeds.length > prevFeeds.length || (plaidBank && currentFeeds.includes(`${CONST.BANK_ACCOUNT.SETUP_TYPE.PLAID}.${plaidBank}`)),
- newFeed: currentFeeds.find((feed) => !prevFeeds.includes(feed)) as CompanyCardFeedWithDomainID | undefined,
+ newFeed: currentFeeds.find((feed) => !prevFeeds.includes(feed)) as CompanyCardFeed | undefined,
};
}
@@ -597,11 +584,11 @@ function filterInactiveCards(cards: CardList | undefined): CardList {
function getAllCardsForWorkspace(
workspaceAccountID: number,
allCardList: OnyxCollection,
- cardFeeds?: CombinedCardFeeds,
+ cardFeeds?: CardFeeds,
expensifyCardSettings?: OnyxCollection,
): CardList {
const cards = {};
- const companyCardsDomainFeeds = Object.entries(cardFeeds ?? {}).map(([feedName, feedData]) => ({domainID: feedData.domainID, feedName}));
+ const companyCardsDomainFeeds = Object.entries(cardFeeds?.settings?.companyCards ?? {}).map(([feedName, feedData]) => ({domainID: feedData.domainID, feedName}));
const expensifyCardsDomainIDs = Object.keys(expensifyCardSettings ?? {})
.map((key) => key.split('_').at(-1))
.filter((id): id is string => !!id);
@@ -624,11 +611,9 @@ function isSmartLimitEnabled(cards: CardList) {
const CUSTOM_FEEDS = [CONST.COMPANY_CARD.FEED_BANK_NAME.MASTER_CARD, CONST.COMPANY_CARD.FEED_BANK_NAME.VISA, CONST.COMPANY_CARD.FEED_BANK_NAME.AMEX];
-function getFeedType(feedKey: CompanyCardFeed, cardFeeds: OnyxEntry): CompanyCardFeedWithNumber {
+function getFeedType(feedKey: CompanyCardFeed, cardFeeds: OnyxEntry): CompanyCardFeedWithNumber {
if (CUSTOM_FEEDS.some((feed) => feed === feedKey)) {
- const filteredFeeds = Object.keys(cardFeeds ?? {})
- .filter((str) => str.includes(feedKey))
- .map((str) => getCompanyCardFeed(str as CompanyCardFeedWithDomainID));
+ const filteredFeeds = Object.keys(cardFeeds?.settings?.companyCards ?? {}).filter((str) => str.includes(feedKey));
const feedNumbers = filteredFeeds.map((str) => parseInt(str.replace(feedKey, ''), 10)).filter(Boolean);
feedNumbers.sort((a, b) => a - b);
@@ -735,12 +720,6 @@ function getFeedConnectionBrokenCard(feedCards: Record | undefined
return Object.values(feedCards).find((card) => !isEmptyObject(card) && card.bank !== feedToExclude && card.lastScrapeResult !== 200);
}
-/** Extract feed from feed with domainID */
-function getCompanyCardFeed(feedWithDomainID: CompanyCardFeedWithDomainID): CompanyCardFeed {
- const [feed] = feedWithDomainID.split(CONST.COMPANY_CARD.FEED_KEY_SEPARATOR);
- return feed as CompanyCardFeed;
-}
-
export {
getAssignedCardSortKey,
isExpensifyCard,
@@ -794,8 +773,5 @@ export {
getPlaidInstitutionId,
getFeedConnectionBrokenCard,
getCorrectStepForPlaidSelectedBank,
- getOriginalCompanyFeeds,
- getCompanyCardFeed,
- getCompanyCardFeedWithDomainID,
getEligibleBankAccountsForUkEuCard,
};
diff --git a/src/libs/actions/Card.ts b/src/libs/actions/Card.ts
index bde8d1f86abc..51d1b1d33441 100644
--- a/src/libs/actions/Card.ts
+++ b/src/libs/actions/Card.ts
@@ -22,7 +22,7 @@ import * as NetworkStore from '@libs/Network/NetworkStore';
import * as PolicyUtils from '@libs/PolicyUtils';
import CONST from '@src/CONST';
import ONYXKEYS from '@src/ONYXKEYS';
-import type {Card, CompanyCardFeedWithDomainID} from '@src/types/onyx';
+import type {Card, CompanyCardFeed} from '@src/types/onyx';
import type {CardLimitType, ExpensifyCardDetails, IssueNewCardData, IssueNewCardStep} from '@src/types/onyx/Card';
import type {ConnectionName} from '@src/types/onyx/Policy';
@@ -945,7 +945,7 @@ function toggleContinuousReconciliation(workspaceAccountID: number, shouldUseCon
});
}
-function updateSelectedFeed(feed: CompanyCardFeedWithDomainID, policyID: string | undefined) {
+function updateSelectedFeed(feed: CompanyCardFeed, policyID: string | undefined) {
if (!policyID) {
return;
}
diff --git a/src/libs/actions/CompanyCards.ts b/src/libs/actions/CompanyCards.ts
index 3d5c9d1c2c25..1e671f59571e 100644
--- a/src/libs/actions/CompanyCards.ts
+++ b/src/libs/actions/CompanyCards.ts
@@ -1,6 +1,5 @@
import type {NullishDeep, OnyxEntry, OnyxUpdate} from 'react-native-onyx';
import Onyx from 'react-native-onyx';
-import type {CombinedCardFeeds} from '@hooks/useCardFeeds';
import * as API from '@libs/API';
import type {
AssignCompanyCardParams,
@@ -21,18 +20,9 @@ import * as PolicyUtils from '@libs/PolicyUtils';
import * as ReportUtils from '@libs/ReportUtils';
import CONST from '@src/CONST';
import ONYXKEYS from '@src/ONYXKEYS';
-import type {Card} from '@src/types/onyx';
+import type {Card, CardFeeds} from '@src/types/onyx';
import type {AssignCard, AssignCardData} from '@src/types/onyx/AssignCard';
-import type {
- AddNewCardFeedData,
- AddNewCardFeedStep,
- CardFeedData,
- CardFeedDetails,
- CompanyCardFeed,
- CompanyCardFeedWithDomainID,
- StatementPeriodEnd,
- StatementPeriodEndDay,
-} from '@src/types/onyx/CardFeeds';
+import type {AddNewCardFeedData, AddNewCardFeedStep, CardFeedData, CardFeedDetails, CompanyCardFeed, StatementPeriodEnd, StatementPeriodEndDay} from '@src/types/onyx/CardFeeds';
import type {OnyxData} from '@src/types/onyx/Request';
type AddNewCompanyCardFlowData = {
@@ -73,10 +63,10 @@ function addNewCompanyCardsFeed(
policyID: string | undefined,
cardFeed: CompanyCardFeed,
feedDetails: CardFeedDetails,
- cardFeeds: OnyxEntry,
+ cardFeeds: OnyxEntry,
statementPeriodEnd: StatementPeriodEnd | undefined,
statementPeriodEndDay: StatementPeriodEndDay | undefined,
- lastSelectedFeed?: CompanyCardFeedWithDomainID,
+ lastSelectedFeed?: CompanyCardFeed,
) {
const authToken = NetworkStore.getAuthToken();
const workspaceAccountID = PolicyUtils.getWorkspaceAccountID(policyID);
@@ -163,7 +153,7 @@ function addNewCompanyCardsFeed(
API.write(WRITE_COMMANDS.REQUEST_FEED_SETUP, parameters, {optimisticData, failureData, successData, finallyData});
}
-function setWorkspaceCompanyCardFeedName(policyID: string, domainOrWorkspaceAccountID: number, bankName: CompanyCardFeed, userDefinedName: string) {
+function setWorkspaceCompanyCardFeedName(policyID: string, domainOrWorkspaceAccountID: number, bankName: string, userDefinedName: string) {
const authToken = NetworkStore.getAuthToken();
const onyxData: OnyxData = {
optimisticData: [
@@ -220,7 +210,7 @@ function setWorkspaceCompanyCardTransactionLiability(domainOrWorkspaceAccountID:
API.write(WRITE_COMMANDS.SET_COMPANY_CARD_TRANSACTION_LIABILITY, parameters, onyxData);
}
-function deleteWorkspaceCompanyCardFeed(policyID: string, domainOrWorkspaceAccountID: number, bankName: CompanyCardFeed, cardIDs: string[], feedToOpen?: CompanyCardFeedWithDomainID) {
+function deleteWorkspaceCompanyCardFeed(policyID: string, domainOrWorkspaceAccountID: number, bankName: CompanyCardFeed, cardIDs: string[], feedToOpen?: CompanyCardFeed) {
const authToken = NetworkStore.getAuthToken();
const isCustomFeed = CardUtils.isCustomFeed(bankName);
const optimisticFeedUpdates = {[bankName]: {pendingAction: CONST.RED_BRICK_ROAD_PENDING_ACTION.DELETE}};
@@ -385,7 +375,7 @@ function assignWorkspaceCompanyCard(policyID: string, data?: Partial;
@@ -52,7 +52,7 @@ function BankConnection({policyID: policyIDFromProps, feed, route}: BankConnecti
const selectedBank = addNewCard?.data?.selectedBank;
const {bankName: bankNameFromRoute, backTo, policyID: policyIDFromRoute} = route?.params ?? {};
const policyID = policyIDFromProps ?? policyIDFromRoute;
- const bankName = feed ? getBankName(getCompanyCardFeed(feed)) : (bankNameFromRoute ?? addNewCard?.data?.plaidConnectedFeed ?? selectedBank);
+ const bankName = feed ? getBankName(feed) : (bankNameFromRoute ?? addNewCard?.data?.plaidConnectedFeed ?? selectedBank);
const {isBetaEnabled} = usePermissions();
const plaidToken = addNewCard?.data?.publicToken ?? assignCard?.data?.plaidAccessToken;
const isPlaid = isBetaEnabled(CONST.BETAS.PLAID_COMPANY_CARDS) && !!plaidToken;
@@ -60,17 +60,17 @@ function BankConnection({policyID: policyIDFromProps, feed, route}: BankConnecti
const url = getCompanyCardBankConnection(policyID, bankName);
const [cardFeeds] = useCardFeeds(policyID);
const [isConnectionCompleted, setConnectionCompleted] = useState(false);
- const prevFeedsData = usePrevious(cardFeeds);
- const isFeedExpired = feed ? isSelectedFeedExpired(cardFeeds?.[feed]) : false;
+ const prevFeedsData = usePrevious(cardFeeds?.settings?.oAuthAccountDetails);
+ const isFeedExpired = feed ? isSelectedFeedExpired(cardFeeds?.settings?.oAuthAccountDetails?.[feed]) : false;
const {isNewFeedConnected, newFeed} = useMemo(
- () => checkIfNewFeedConnected(prevFeedsData ?? {}, cardFeeds ?? {}, addNewCard?.data?.plaidConnectedFeed),
- [addNewCard?.data?.plaidConnectedFeed, cardFeeds, prevFeedsData],
+ () => checkIfNewFeedConnected(prevFeedsData ?? {}, cardFeeds?.settings?.oAuthAccountDetails ?? {}, addNewCard?.data?.plaidConnectedFeed),
+ [addNewCard?.data?.plaidConnectedFeed, cardFeeds?.settings?.oAuthAccountDetails, prevFeedsData],
);
const headerTitleAddCards = !backTo ? translate('workspace.companyCards.addCards') : undefined;
const headerTitle = feed ? translate('workspace.companyCards.assignCard') : headerTitleAddCards;
const onImportPlaidAccounts = useImportPlaidAccounts(policyID);
const {updateBrokenConnection, isFeedConnectionBroken} = useUpdateFeedBrokenConnection({policyID, feed});
- const isNewFeedHasError = !!(newFeed && cardFeeds?.[newFeed]?.errors);
+ const isNewFeedHasError = !!(newFeed && cardFeeds?.settings?.oAuthAccountDetails?.[newFeed]?.errors);
const renderLoading = () => ;
diff --git a/src/pages/workspace/companyCards/BankConnection/index.tsx b/src/pages/workspace/companyCards/BankConnection/index.tsx
index d956ec2edc02..37f4daace2e5 100644
--- a/src/pages/workspace/companyCards/BankConnection/index.tsx
+++ b/src/pages/workspace/companyCards/BankConnection/index.tsx
@@ -17,7 +17,7 @@ import usePrevious from '@hooks/usePrevious';
import useThemeStyles from '@hooks/useThemeStyles';
import useUpdateFeedBrokenConnection from '@hooks/useUpdateFeedBrokenConnection';
import {setAssignCardStepAndData} from '@libs/actions/CompanyCards';
-import {checkIfNewFeedConnected, getBankName, getCompanyCardFeed, isSelectedFeedExpired} from '@libs/CardUtils';
+import {checkIfNewFeedConnected, getBankName, isSelectedFeedExpired} from '@libs/CardUtils';
import Navigation from '@libs/Navigation/Navigation';
import type {PlatformStackRouteProp} from '@navigation/PlatformStackNavigation/types';
import type {SettingsNavigatorParamList} from '@navigation/types';
@@ -29,7 +29,7 @@ import CONST from '@src/CONST';
import ONYXKEYS from '@src/ONYXKEYS';
import ROUTES from '@src/ROUTES';
import type SCREENS from '@src/SCREENS';
-import type {CompanyCardFeedWithDomainID} from '@src/types/onyx';
+import type {CompanyCardFeed} from '@src/types/onyx';
import openBankConnection from './openBankConnection';
let customWindow: Window | null = null;
@@ -39,7 +39,7 @@ type BankConnectionProps = {
policyID?: string;
/** Selected feed for assign card flow */
- feed?: CompanyCardFeedWithDomainID;
+ feed?: CompanyCardFeed;
/** Route params for add new card flow */
route?: PlatformStackRouteProp;
@@ -53,13 +53,13 @@ function BankConnection({policyID: policyIDFromProps, feed, route}: BankConnecti
const {bankName: bankNameFromRoute, backTo, policyID: policyIDFromRoute} = route?.params ?? {};
const policyID = policyIDFromProps ?? policyIDFromRoute;
const [cardFeeds] = useCardFeeds(policyID);
- const prevFeedsData = usePrevious(cardFeeds);
+ const prevFeedsData = usePrevious(cardFeeds?.settings?.oAuthAccountDetails);
const [shouldBlockWindowOpen, setShouldBlockWindowOpen] = useState(false);
const selectedBank = addNewCard?.data?.selectedBank;
- const bankName = feed ? getBankName(getCompanyCardFeed(feed)) : (bankNameFromRoute ?? addNewCard?.data?.plaidConnectedFeed ?? selectedBank);
+ const bankName = feed ? getBankName(feed) : (bankNameFromRoute ?? addNewCard?.data?.plaidConnectedFeed ?? selectedBank);
const {isNewFeedConnected, newFeed} = useMemo(
- () => checkIfNewFeedConnected(prevFeedsData ?? {}, cardFeeds ?? {}, addNewCard?.data?.plaidConnectedFeed),
- [addNewCard?.data?.plaidConnectedFeed, cardFeeds, prevFeedsData],
+ () => checkIfNewFeedConnected(prevFeedsData ?? {}, cardFeeds?.settings?.oAuthAccountDetails ?? {}, addNewCard?.data?.plaidConnectedFeed),
+ [addNewCard?.data?.plaidConnectedFeed, cardFeeds?.settings?.oAuthAccountDetails, prevFeedsData],
);
const {isOffline} = useNetwork();
const plaidToken = addNewCard?.data?.publicToken ?? assignCard?.data?.plaidAccessToken;
@@ -68,10 +68,10 @@ function BankConnection({policyID: policyIDFromProps, feed, route}: BankConnecti
const isPlaid = isBetaEnabled(CONST.BETAS.PLAID_COMPANY_CARDS) && !!plaidToken;
const url = getCompanyCardBankConnection(policyID, bankName);
- const isFeedExpired = feed ? isSelectedFeedExpired(cardFeeds?.[feed]) : false;
+ const isFeedExpired = feed ? isSelectedFeedExpired(cardFeeds?.settings?.oAuthAccountDetails?.[feed]) : false;
const headerTitleAddCards = !backTo ? translate('workspace.companyCards.addCards') : undefined;
const headerTitle = feed ? translate('workspace.companyCards.assignCard') : headerTitleAddCards;
- const isNewFeedHasError = !!(newFeed && cardFeeds?.[newFeed]?.errors);
+ const isNewFeedHasError = !!(newFeed && cardFeeds?.settings?.oAuthAccountDetails?.[newFeed]?.errors);
const onImportPlaidAccounts = useImportPlaidAccounts(policyID);
const onOpenBankConnectionFlow = useCallback(() => {
diff --git a/src/pages/workspace/companyCards/WorkspaceCompanyCardAccountSelectCardPage.tsx b/src/pages/workspace/companyCards/WorkspaceCompanyCardAccountSelectCardPage.tsx
index b0691d963b23..40598d869b91 100644
--- a/src/pages/workspace/companyCards/WorkspaceCompanyCardAccountSelectCardPage.tsx
+++ b/src/pages/workspace/companyCards/WorkspaceCompanyCardAccountSelectCardPage.tsx
@@ -14,7 +14,7 @@ import usePolicy from '@hooks/usePolicy';
import useThemeStyles from '@hooks/useThemeStyles';
import useWorkspaceAccountID from '@hooks/useWorkspaceAccountID';
import {setCompanyCardExportAccount} from '@libs/actions/CompanyCards';
-import {getCompanyCardFeed, getCompanyFeeds, getDomainOrWorkspaceAccountID} from '@libs/CardUtils';
+import {getCompanyFeeds, getDomainOrWorkspaceAccountID} from '@libs/CardUtils';
import type {PlatformStackScreenProps} from '@libs/Navigation/PlatformStackNavigation/types';
import {getConnectedIntegration, getCurrentConnectionName} from '@libs/PolicyUtils';
import tokenizedSearch from '@libs/tokenizedSearch';
@@ -24,7 +24,7 @@ import variables from '@styles/variables';
import CONST from '@src/CONST';
import ROUTES from '@src/ROUTES';
import type SCREENS from '@src/SCREENS';
-import type {CompanyCardFeedWithDomainID} from '@src/types/onyx';
+import type {CompanyCardFeed} from '@src/types/onyx';
import {getExportMenuItem} from './utils';
type WorkspaceCompanyCardAccountSelectCardProps = PlatformStackScreenProps;
@@ -34,12 +34,12 @@ function WorkspaceCompanyCardAccountSelectCardPage({route}: WorkspaceCompanyCard
const styles = useThemeStyles();
const {environmentURL} = useEnvironment();
const {policyID, cardID, backTo} = route.params;
- const bank = decodeURIComponent(route.params.bank) as CompanyCardFeedWithDomainID;
+ const bank = decodeURIComponent(route.params.bank);
const policy = usePolicy(policyID);
const workspaceAccountID = useWorkspaceAccountID(policyID);
const [searchText, setSearchText] = useState('');
- const [allBankCards] = useCardsList(bank);
+ const [allBankCards] = useCardsList(policyID, bank as CompanyCardFeed);
const card = allBankCards?.[cardID];
const connectedIntegration = getConnectedIntegration(policy) ?? CONST.POLICY.CONNECTIONS.NAME.QBO;
// We need to have an unchanged active route for getExportMenuItem so the export page link is not updated incorrectly when user is in other pages
@@ -54,7 +54,7 @@ function WorkspaceCompanyCardAccountSelectCardPage({route}: WorkspaceCompanyCard
const [cardFeeds] = useCardFeeds(policyID);
const companyFeeds = getCompanyFeeds(cardFeeds);
- const domainOrWorkspaceAccountID = getDomainOrWorkspaceAccountID(workspaceAccountID, companyFeeds[bank]);
+ const domainOrWorkspaceAccountID = getDomainOrWorkspaceAccountID(workspaceAccountID, companyFeeds[bank as CompanyCardFeed]);
const searchedListOptions = useMemo(() => {
return tokenizedSearch(exportMenuItem?.data ?? [], searchText, (option) => [option.value]);
@@ -81,7 +81,7 @@ function WorkspaceCompanyCardAccountSelectCardPage({route}: WorkspaceCompanyCard
}
const isDefaultCardSelected = value === defaultCard;
const exportValue = isDefaultCardSelected ? CONST.COMPANY_CARDS.DEFAULT_EXPORT_TYPE : value;
- setCompanyCardExportAccount(policyID, domainOrWorkspaceAccountID, cardID, exportMenuItem.exportType, exportValue, getCompanyCardFeed(bank));
+ setCompanyCardExportAccount(policyID, domainOrWorkspaceAccountID, cardID, exportMenuItem.exportType, exportValue, bank);
Navigation.goBack(ROUTES.WORKSPACE_COMPANY_CARD_DETAILS.getRoute(policyID, cardID, bank));
},
diff --git a/src/pages/workspace/companyCards/WorkspaceCompanyCardDetailsPage.tsx b/src/pages/workspace/companyCards/WorkspaceCompanyCardDetailsPage.tsx
index 41b5799e4fd0..43961fd46334 100644
--- a/src/pages/workspace/companyCards/WorkspaceCompanyCardDetailsPage.tsx
+++ b/src/pages/workspace/companyCards/WorkspaceCompanyCardDetailsPage.tsx
@@ -23,7 +23,7 @@ import usePolicy from '@hooks/usePolicy';
import useStyleUtils from '@hooks/useStyleUtils';
import useThemeIllustrations from '@hooks/useThemeIllustrations';
import useThemeStyles from '@hooks/useThemeStyles';
-import {getCardFeedIcon, getCompanyCardFeed, getCompanyFeeds, getDefaultCardName, getDomainOrWorkspaceAccountID, getPlaidInstitutionIconUrl, maskCardNumber} from '@libs/CardUtils';
+import {getCardFeedIcon, getCompanyFeeds, getDefaultCardName, getDomainOrWorkspaceAccountID, getPlaidInstitutionIconUrl, maskCardNumber} from '@libs/CardUtils';
import {getLatestErrorField} from '@libs/ErrorUtils';
import type {PlatformStackScreenProps} from '@libs/Navigation/PlatformStackNavigation/types';
import type {SettingsNavigatorParamList} from '@libs/Navigation/types';
@@ -39,7 +39,7 @@ import CONST from '@src/CONST';
import ONYXKEYS from '@src/ONYXKEYS';
import ROUTES from '@src/ROUTES';
import type SCREENS from '@src/SCREENS';
-import type {CompanyCardFeed, CompanyCardFeedWithDomainID} from '@src/types/onyx';
+import type {CompanyCardFeed} from '@src/types/onyx';
import isLoadingOnyxValue from '@src/types/utils/isLoadingOnyxValue';
import {getExportMenuItem} from './utils';
@@ -47,8 +47,7 @@ type WorkspaceCompanyCardDetailsPageProps = PlatformStackScreenProps {
setIsUnassignModalVisible(false);
if (card) {
- unassignWorkspaceCompanyCard(domainOrWorkspaceAccountID, feed, card);
+ unassignWorkspaceCompanyCard(domainOrWorkspaceAccountID, bank, card);
}
Navigation.goBack();
};
const updateCard = () => {
- updateWorkspaceCompanyCard(domainOrWorkspaceAccountID, cardID, feed, card?.lastScrapeResult);
+ updateWorkspaceCompanyCard(domainOrWorkspaceAccountID, cardID, bank as CompanyCardFeed, card?.lastScrapeResult);
};
const lastScrape = useMemo(() => {
@@ -155,7 +154,7 @@ function WorkspaceCompanyCardDetailsPage({route}: WorkspaceCompanyCardDetailsPag
@@ -163,7 +162,7 @@ function WorkspaceCompanyCardDetailsPage({route}: WorkspaceCompanyCardDetailsPag
pendingAction={card?.nameValuePairs?.pendingFields?.cardTitle}
errorRowStyles={[styles.ph5, styles.mb3]}
errors={getLatestErrorField(card?.nameValuePairs ?? {}, 'cardTitle')}
- onClose={() => clearCompanyCardErrorField(domainOrWorkspaceAccountID, cardID, feed, 'cardTitle')}
+ onClose={() => clearCompanyCardErrorField(domainOrWorkspaceAccountID, cardID, bank, 'cardTitle')}
>
clearCompanyCardErrorField(domainOrWorkspaceAccountID, cardID, feed, 'lastScrape', true)}
+ onClose={() => clearCompanyCardErrorField(domainOrWorkspaceAccountID, cardID, bank, 'lastScrape', true)}
>