diff --git a/src/hooks/useCardFeeds.tsx b/src/hooks/useCardFeeds.tsx index 76b661bbec3e..dafa10e710c6 100644 --- a/src/hooks/useCardFeeds.tsx +++ b/src/hooks/useCardFeeds.tsx @@ -31,8 +31,8 @@ const useCardFeeds = (policyID: string | undefined): [CardFeeds | undefined, Res const defaultFeed = allFeeds?.[`${ONYXKEYS.COLLECTION.SHARED_NVP_PRIVATE_DOMAIN_MEMBER}${workspaceAccountID}`]; const {companyCards = {}, companyCardNicknames = {}, oAuthAccountDetails = {}} = defaultFeed?.settings ?? {}; - return Object.values(allFeeds).reduce}>( - (acc, feed) => { + return Object.entries(allFeeds).reduce}>( + (acc, [onyxKey, feed]) => { if (!feed?.settings?.companyCards) { return acc; } @@ -46,7 +46,9 @@ const useCardFeeds = (policyID: string | undefined): [CardFeeds | undefined, Res return; } - acc.settings.companyCards[feedName] = feedSettings; + const domainID = onyxKey.split('_').at(-1); + + acc.settings.companyCards[feedName] = {...feedSettings, domainID: domainID ? Number(domainID) : undefined}; if (feedOAuthAccountDetails) { acc.settings.oAuthAccountDetails[feedName] = feedOAuthAccountDetails; diff --git a/src/hooks/useCardsList.tsx b/src/hooks/useCardsList.tsx new file mode 100644 index 000000000000..769144a1a02b --- /dev/null +++ b/src/hooks/useCardsList.tsx @@ -0,0 +1,23 @@ +import type {ResultMetadata} from 'react-native-onyx'; +import {filterInactiveCards, getCompanyFeeds, getDomainOrWorkspaceAccountID} from '@libs/CardUtils'; +import ONYXKEYS from '@src/ONYXKEYS'; +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 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, + }); + + return [cardsList, cardsListMetadata]; +}; + +export default useCardsList; diff --git a/src/hooks/useDefaultFundID.ts b/src/hooks/useDefaultFundID.ts index 1515a473bfa9..42b98c9b8132 100644 --- a/src/hooks/useDefaultFundID.ts +++ b/src/hooks/useDefaultFundID.ts @@ -6,11 +6,11 @@ import useWorkspaceAccountID from './useWorkspaceAccountID'; /** * Hook to get the default fundID for a given policyID. This is used to get the settings and cards for each of the feeds. - * It will always return lastSelectedExpensifyCardFeed if it exists or fallback to the workspaceAccountID or domainFundID. + * It will always return lastSelectedExpensifyCardFeed if it exists or fallback to the domainFundID or workspaceAccountID. */ function useDefaultFundID(policyID: string | undefined) { const workspaceAccountID = useWorkspaceAccountID(policyID); - const [lastSelectedExpensifyCardFeed] = useOnyx(`${ONYXKEYS.COLLECTION.LAST_SELECTED_EXPENSIFY_CARD_FEED}${policyID}`); + const [lastSelectedExpensifyCardFeed] = useOnyx(`${ONYXKEYS.COLLECTION.LAST_SELECTED_EXPENSIFY_CARD_FEED}${policyID}`, {canBeMissing: true}); const [domainFundID] = useOnyx(ONYXKEYS.COLLECTION.PRIVATE_EXPENSIFY_CARD_SETTINGS, { selector: (cardSettings) => { @@ -21,17 +21,22 @@ function useDefaultFundID(policyID: string | undefined) { return getFundIdFromSettingsKey(matchingKey?.[0] ?? ''); }, + canBeMissing: true, }); if (lastSelectedExpensifyCardFeed) { return lastSelectedExpensifyCardFeed; } + if (domainFundID) { + return domainFundID; + } + if (workspaceAccountID) { return workspaceAccountID; } - return domainFundID ?? CONST.DEFAULT_NUMBER_ID; + return CONST.DEFAULT_NUMBER_ID; } export default useDefaultFundID; diff --git a/src/libs/API/parameters/SetCompanyCardFeedName.ts b/src/libs/API/parameters/SetCompanyCardFeedName.ts index 3db87f52bff2..7d17cb1f302a 100644 --- a/src/libs/API/parameters/SetCompanyCardFeedName.ts +++ b/src/libs/API/parameters/SetCompanyCardFeedName.ts @@ -2,6 +2,7 @@ type SetCompanyCardFeedName = { authToken?: string | null; policyID: string; bankName: string; + domainAccountID: number; userDefinedName: string; }; diff --git a/src/libs/CardUtils.ts b/src/libs/CardUtils.ts index aa3f8679612f..0c365083c675 100644 --- a/src/libs/CardUtils.ts +++ b/src/libs/CardUtils.ts @@ -12,7 +12,7 @@ import type {OnyxValues} from '@src/ONYXKEYS'; import ONYXKEYS from '@src/ONYXKEYS'; import type {BankAccountList, Card, CardFeeds, CardList, CompanyCardFeed, ExpensifyCardSettings, PersonalDetailsList, Policy, WorkspaceCardsList} from '@src/types/onyx'; import type {FilteredCardList} from '@src/types/onyx/Card'; -import type {CompanyCardFeedWithNumber, CompanyCardNicknames, CompanyFeeds, DirectCardFeedData} 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'; import localeCompare from './LocaleCompare'; @@ -405,6 +405,10 @@ function getCustomOrFormattedFeedName(feed?: CompanyCardFeed, companyCardNicknam return customFeedName ?? formattedFeedName; } +function getDomainOrWorkspaceAccountID(workspaceAccountID: number, cardFeedData: CardFeedData | undefined): number { + return cardFeedData?.domainID ?? workspaceAccountID; +} + // We will simplify the logic below once we have #50450 #50451 implemented const getCorrectStepForSelectedBank = (selectedBank: ValueOf) => { const banksWithFeedType = [ @@ -505,10 +509,22 @@ function filterInactiveCards(cards: CardList | undefined): CardList { return filterObject(cards ?? {}, (key, card) => !closedStates.includes(card.state)); } -function getAllCardsForWorkspace(workspaceAccountID: number, allCardList: OnyxCollection = allWorkspaceCards): CardList { +function getAllCardsForWorkspace( + workspaceAccountID: number, + allCardList: OnyxCollection = allWorkspaceCards, + cardFeeds?: CardFeeds, + expensifyCardSettings?: OnyxCollection, +): CardList { const cards = {}; + 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); for (const [key, values] of Object.entries(allCardList ?? {})) { - if (key.includes(workspaceAccountID.toString()) && values) { + const isWorkspaceAccountCards = key.includes(workspaceAccountID.toString()); + const isCompanyDomainCards = companyCardsDomainFeeds?.some((domainFeed) => domainFeed.domainID && key.includes(domainFeed.domainID.toString()) && key.includes(domainFeed.feedName)); + const isExpensifyDomainCards = expensifyCardsDomainIDs.some((domainID) => key.includes(domainID.toString()) && key.includes(CONST.EXPENSIFY_CARD.BANK)); + if ((isWorkspaceAccountCards || isCompanyDomainCards || isExpensifyDomainCards) && values) { const {cardList, ...rest} = values; const filteredCards = filterInactiveCards(rest); Object.assign(cards, filteredCards); @@ -548,14 +564,17 @@ function getFeedType(feedKey: CompanyCardFeed, cardFeeds: OnyxEntry): * * @param allCardsList the list where cards split by workspaces and feeds and stored under `card_${workspaceAccountID}_${feedName}` keys * @param workspaceAccountID the workspace account id we want to get cards for + * @param domainIDs the domain ids we want to get cards for */ -function flatAllCardsList(allCardsList: OnyxCollection, workspaceAccountID: number): Record | undefined { +function flatAllCardsList(allCardsList: OnyxCollection, workspaceAccountID: number, domainIDs?: number[]): Record | undefined { if (!allCardsList) { return; } return Object.entries(allCardsList).reduce((acc, [key, cards]) => { - if (!key.includes(workspaceAccountID.toString()) || key.includes(CONST.EXPENSIFY_CARD.BANK)) { + const isWorkspaceAccountCards = key.includes(workspaceAccountID.toString()); + const isDomainCards = domainIDs?.some((domainID) => key.includes(domainID.toString())); + if ((!isWorkspaceAccountCards && !isDomainCards) || key.includes(CONST.EXPENSIFY_CARD.BANK)) { return acc; } const {cardList, ...feedCards} = cards ?? {}; @@ -637,6 +656,7 @@ export { hasOnlyOneCardToAssign, checkIfNewFeedConnected, getDefaultCardName, + getDomainOrWorkspaceAccountID, mergeCardListWithWorkspaceFeeds, isCard, getAllCardsForWorkspace, diff --git a/src/libs/actions/CompanyCards.ts b/src/libs/actions/CompanyCards.ts index 44b33c29600c..5372d87b2255 100644 --- a/src/libs/actions/CompanyCards.ts +++ b/src/libs/actions/CompanyCards.ts @@ -137,13 +137,13 @@ function addNewCompanyCardsFeed(policyID: string | undefined, cardFeed: CompanyC API.write(WRITE_COMMANDS.REQUEST_FEED_SETUP, parameters, {optimisticData, failureData, successData, finallyData}); } -function setWorkspaceCompanyCardFeedName(policyID: string, workspaceAccountID: number, bankName: string, userDefinedName: string) { +function setWorkspaceCompanyCardFeedName(policyID: string, domainOrWorkspaceAccountID: number, bankName: string, userDefinedName: string) { const authToken = NetworkStore.getAuthToken(); const onyxData: OnyxData = { optimisticData: [ { onyxMethod: Onyx.METHOD.MERGE, - key: `${ONYXKEYS.COLLECTION.SHARED_NVP_PRIVATE_DOMAIN_MEMBER}${workspaceAccountID}`, + key: `${ONYXKEYS.COLLECTION.SHARED_NVP_PRIVATE_DOMAIN_MEMBER}${domainOrWorkspaceAccountID}`, value: { settings: { companyCardNicknames: { @@ -158,6 +158,7 @@ function setWorkspaceCompanyCardFeedName(policyID: string, workspaceAccountID: n const parameters = { authToken, policyID, + domainAccountID: domainOrWorkspaceAccountID, bankName, userDefinedName, }; @@ -165,7 +166,7 @@ function setWorkspaceCompanyCardFeedName(policyID: string, workspaceAccountID: n API.write(WRITE_COMMANDS.SET_COMPANY_CARD_FEED_NAME, parameters, onyxData); } -function setWorkspaceCompanyCardTransactionLiability(workspaceAccountID: number, policyID: string, bankName: CompanyCardFeed, liabilityType: string) { +function setWorkspaceCompanyCardTransactionLiability(domainOrWorkspaceAccountID: number, policyID: string, bankName: CompanyCardFeed, liabilityType: string) { const authToken = NetworkStore.getAuthToken(); const feedUpdates = { [bankName]: {liabilityType}, @@ -175,7 +176,7 @@ function setWorkspaceCompanyCardTransactionLiability(workspaceAccountID: number, optimisticData: [ { onyxMethod: Onyx.METHOD.MERGE, - key: `${ONYXKEYS.COLLECTION.SHARED_NVP_PRIVATE_DOMAIN_MEMBER}${workspaceAccountID}`, + key: `${ONYXKEYS.COLLECTION.SHARED_NVP_PRIVATE_DOMAIN_MEMBER}${domainOrWorkspaceAccountID}`, value: { settings: {companyCards: feedUpdates}, }, @@ -193,7 +194,7 @@ function setWorkspaceCompanyCardTransactionLiability(workspaceAccountID: number, API.write(WRITE_COMMANDS.SET_COMPANY_CARD_TRANSACTION_LIABILITY, parameters, onyxData); } -function deleteWorkspaceCompanyCardFeed(policyID: string, workspaceAccountID: number, bankName: CompanyCardFeed, cardIDs: string[], feedToOpen?: CompanyCardFeed) { +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}}; @@ -205,7 +206,7 @@ function deleteWorkspaceCompanyCardFeed(policyID: string, workspaceAccountID: nu const optimisticData: OnyxUpdate[] = [ { onyxMethod: Onyx.METHOD.MERGE, - key: `${ONYXKEYS.COLLECTION.SHARED_NVP_PRIVATE_DOMAIN_MEMBER}${workspaceAccountID}`, + key: `${ONYXKEYS.COLLECTION.SHARED_NVP_PRIVATE_DOMAIN_MEMBER}${domainOrWorkspaceAccountID}`, value: { settings: { companyCards: optimisticFeedUpdates, @@ -214,7 +215,7 @@ function deleteWorkspaceCompanyCardFeed(policyID: string, workspaceAccountID: nu }, { onyxMethod: Onyx.METHOD.MERGE, - key: `${ONYXKEYS.COLLECTION.WORKSPACE_CARDS_LIST}${workspaceAccountID}_${bankName}`, + key: `${ONYXKEYS.COLLECTION.WORKSPACE_CARDS_LIST}${domainOrWorkspaceAccountID}_${bankName}`, value: optimisticCardUpdates, }, { @@ -227,7 +228,7 @@ function deleteWorkspaceCompanyCardFeed(policyID: string, workspaceAccountID: nu const successData: OnyxUpdate[] = [ { onyxMethod: Onyx.METHOD.MERGE, - key: `${ONYXKEYS.COLLECTION.SHARED_NVP_PRIVATE_DOMAIN_MEMBER}${workspaceAccountID}`, + key: `${ONYXKEYS.COLLECTION.SHARED_NVP_PRIVATE_DOMAIN_MEMBER}${domainOrWorkspaceAccountID}`, value: { settings: { ...(isCustomFeed ? {companyCards: successFeedUpdates} : {oAuthAccountDetails: successFeedUpdates, companyCards: successFeedUpdates}), @@ -239,7 +240,7 @@ function deleteWorkspaceCompanyCardFeed(policyID: string, workspaceAccountID: nu }, { onyxMethod: Onyx.METHOD.MERGE, - key: `${ONYXKEYS.COLLECTION.WORKSPACE_CARDS_LIST}${workspaceAccountID}_${bankName}`, + key: `${ONYXKEYS.COLLECTION.WORKSPACE_CARDS_LIST}${domainOrWorkspaceAccountID}_${bankName}`, value: successAndFailureCardUpdates, }, { @@ -252,7 +253,7 @@ function deleteWorkspaceCompanyCardFeed(policyID: string, workspaceAccountID: nu const failureData: OnyxUpdate[] = [ { onyxMethod: Onyx.METHOD.MERGE, - key: `${ONYXKEYS.COLLECTION.SHARED_NVP_PRIVATE_DOMAIN_MEMBER}${workspaceAccountID}`, + key: `${ONYXKEYS.COLLECTION.SHARED_NVP_PRIVATE_DOMAIN_MEMBER}${domainOrWorkspaceAccountID}`, value: { settings: { companyCards: failureFeedUpdates, @@ -261,7 +262,7 @@ function deleteWorkspaceCompanyCardFeed(policyID: string, workspaceAccountID: nu }, { onyxMethod: Onyx.METHOD.MERGE, - key: `${ONYXKEYS.COLLECTION.WORKSPACE_CARDS_LIST}${workspaceAccountID}_${bankName}`, + key: `${ONYXKEYS.COLLECTION.WORKSPACE_CARDS_LIST}${domainOrWorkspaceAccountID}_${bankName}`, value: successAndFailureCardUpdates, }, { @@ -355,7 +356,7 @@ function assignWorkspaceCompanyCard(policyID: string, data?: Partial session?.email, canBeMissing: false}); const [policyCategories] = useOnyx(`${ONYXKEYS.COLLECTION.POLICY_CATEGORIES}${route.params?.policyID}`, {canBeMissing: true}); const [personalDetails] = useOnyx(ONYXKEYS.PERSONAL_DETAILS_LIST, {canBeMissing: false}); + const cardsDomainIDs = Object.values(getCompanyFeeds(cardFeeds)) + .map((data) => data.domainID) + .filter((domainID): domainID is number => !!domainID); const {login, accountID} = useCurrentUserPersonalDetails(); const hasSyncError = shouldShowSyncError(policy, isConnectionInProgress(connectionSyncProgress, policy)); const waitForNavigate = useWaitForNavigation(); @@ -269,7 +274,7 @@ function WorkspaceInitialPage({policyDraft, policy: policyProp, route}: Workspac } if (featureStates?.[CONST.POLICY.MORE_FEATURES.ARE_COMPANY_CARDS_ENABLED]) { - const hasBrokenFeedConnection = checkIfFeedConnectionIsBroken(flatAllCardsList(allFeedsCards, workspaceAccountID)); + const hasBrokenFeedConnection = checkIfFeedConnectionIsBroken(flatAllCardsList(allFeedsCards, workspaceAccountID, cardsDomainIDs)); protectedMenuItems.push({ translationKey: 'workspace.common.companyCards', @@ -342,6 +347,7 @@ function WorkspaceInitialPage({policyDraft, policy: policyProp, route}: Workspac singleExecution, waitForNavigate, allFeedsCards, + cardsDomainIDs, workspaceAccountID, ]); diff --git a/src/pages/workspace/WorkspaceMoreFeaturesPage.tsx b/src/pages/workspace/WorkspaceMoreFeaturesPage.tsx index b29ef882d9ad..5a35c3841a56 100644 --- a/src/pages/workspace/WorkspaceMoreFeaturesPage.tsx +++ b/src/pages/workspace/WorkspaceMoreFeaturesPage.tsx @@ -98,7 +98,7 @@ function WorkspaceMoreFeaturesPage({policy, route}: WorkspaceMoreFeaturesPagePro const perDiemCustomUnit = getPerDiemCustomUnit(policy); const [cardList] = useOnyx(`${ONYXKEYS.COLLECTION.WORKSPACE_CARDS_LIST}`, {canBeMissing: true}); - const workspaceCards = getAllCardsForWorkspace(workspaceAccountID, cardList); + const workspaceCards = getAllCardsForWorkspace(workspaceAccountID, cardList, cardFeeds); const isSmartLimitEnabled = isSmartLimitEnabledUtil(workspaceCards); const onDisabledOrganizeSwitchPress = useCallback(() => { diff --git a/src/pages/workspace/companyCards/WorkspaceCompanyCardAccountSelectCardPage.tsx b/src/pages/workspace/companyCards/WorkspaceCompanyCardAccountSelectCardPage.tsx index 3c862f78c8c7..2a0de3c50106 100644 --- a/src/pages/workspace/companyCards/WorkspaceCompanyCardAccountSelectCardPage.tsx +++ b/src/pages/workspace/companyCards/WorkspaceCompanyCardAccountSelectCardPage.tsx @@ -1,6 +1,5 @@ import React, {useCallback, useMemo, useState} from 'react'; import {View} from 'react-native'; -import {useOnyx} from 'react-native-onyx'; import BlockingView from '@components/BlockingViews/BlockingView'; import {TeleScope} from '@components/Icon/Illustrations'; import RadioListItem from '@components/SelectionList/RadioListItem'; @@ -8,21 +7,23 @@ import SelectionScreen from '@components/SelectionScreen'; import type {SelectorType} from '@components/SelectionScreen'; import Text from '@components/Text'; import TextLink from '@components/TextLink'; +import useCardFeeds from '@hooks/useCardFeeds'; +import useCardsList from '@hooks/useCardsList'; import useLocalize from '@hooks/useLocalize'; import usePolicy from '@hooks/usePolicy'; import useThemeStyles from '@hooks/useThemeStyles'; import useWorkspaceAccountID from '@hooks/useWorkspaceAccountID'; import {setCompanyCardExportAccount} from '@libs/actions/CompanyCards'; -import {filterInactiveCards} from '@libs/CardUtils'; +import {getCompanyFeeds, getDomainOrWorkspaceAccountID} from '@libs/CardUtils'; import type {PlatformStackScreenProps} from '@libs/Navigation/PlatformStackNavigation/types'; import {getConnectedIntegration, getCurrentConnectionName} from '@libs/PolicyUtils'; import Navigation from '@navigation/Navigation'; import type {SettingsNavigatorParamList} from '@navigation/types'; import variables from '@styles/variables'; import CONST from '@src/CONST'; -import ONYXKEYS from '@src/ONYXKEYS'; import ROUTES from '@src/ROUTES'; import type SCREENS from '@src/SCREENS'; +import type {CompanyCardFeed} from '@src/types/onyx'; import {getExportMenuItem} from './utils'; type WorkspaceCompanyCardAccountSelectCardProps = PlatformStackScreenProps; @@ -36,7 +37,7 @@ function WorkspaceCompanyCardAccountSelectCardPage({route}: WorkspaceCompanyCard const workspaceAccountID = useWorkspaceAccountID(policyID); const [searchText, setSearchText] = useState(''); - const [allBankCards] = useOnyx(`${ONYXKEYS.COLLECTION.WORKSPACE_CARDS_LIST}${workspaceAccountID}_${bank}`, {selector: filterInactiveCards}); + const [allBankCards] = useCardsList(policyID, bank as CompanyCardFeed); const card = allBankCards?.[cardID]; const connectedIntegration = getConnectedIntegration(policy) ?? CONST.POLICY.CONNECTIONS.NAME.QBO; const exportMenuItem = getExportMenuItem(connectedIntegration, policyID, translate, policy, card, Navigation.getActiveRoute()); @@ -45,6 +46,10 @@ function WorkspaceCompanyCardAccountSelectCardPage({route}: WorkspaceCompanyCard const defaultCard = translate('workspace.moreFeatures.companyCards.defaultCard'); const isXeroConnection = connectedIntegration === CONST.POLICY.CONNECTIONS.NAME.XERO; + const [cardFeeds] = useCardFeeds(policyID); + const companyFeeds = getCompanyFeeds(cardFeeds); + const domainOrWorkspaceAccountID = getDomainOrWorkspaceAccountID(workspaceAccountID, companyFeeds[bank as CompanyCardFeed]); + const searchedListOptions = useMemo(() => { return exportMenuItem?.data.filter((option) => option.value.toLowerCase().includes(searchText)); }, [exportMenuItem?.data, searchText]); @@ -70,11 +75,11 @@ function WorkspaceCompanyCardAccountSelectCardPage({route}: WorkspaceCompanyCard } const isDefaultCardSelected = value === defaultCard; const exportValue = isDefaultCardSelected ? CONST.COMPANY_CARDS.DEFAULT_EXPORT_TYPE : value; - setCompanyCardExportAccount(policyID, workspaceAccountID, cardID, exportMenuItem.exportType, exportValue, bank); + setCompanyCardExportAccount(policyID, domainOrWorkspaceAccountID, cardID, exportMenuItem.exportType, exportValue, bank); Navigation.goBack(ROUTES.WORKSPACE_COMPANY_CARD_DETAILS.getRoute(policyID, cardID, bank)); }, - [exportMenuItem?.exportType, workspaceAccountID, cardID, policyID, bank, defaultCard], + [exportMenuItem?.exportType, domainOrWorkspaceAccountID, cardID, policyID, bank, defaultCard], ); return ( diff --git a/src/pages/workspace/companyCards/WorkspaceCompanyCardDetailsPage.tsx b/src/pages/workspace/companyCards/WorkspaceCompanyCardDetailsPage.tsx index 157da7be6aeb..b3fab4d8be52 100644 --- a/src/pages/workspace/companyCards/WorkspaceCompanyCardDetailsPage.tsx +++ b/src/pages/workspace/companyCards/WorkspaceCompanyCardDetailsPage.tsx @@ -12,13 +12,15 @@ import MenuItemWithTopDescription from '@components/MenuItemWithTopDescription'; import OfflineWithFeedback from '@components/OfflineWithFeedback'; import ScreenWrapper from '@components/ScreenWrapper'; import ScrollView from '@components/ScrollView'; +import useCardFeeds from '@hooks/useCardFeeds'; +import useCardsList from '@hooks/useCardsList'; import useLocalize from '@hooks/useLocalize'; import useNetwork from '@hooks/useNetwork'; import usePolicy from '@hooks/usePolicy'; import useTheme from '@hooks/useTheme'; import useThemeIllustrations from '@hooks/useThemeIllustrations'; import useThemeStyles from '@hooks/useThemeStyles'; -import {filterInactiveCards, getCardFeedIcon, getDefaultCardName, maskCardNumber} from '@libs/CardUtils'; +import {getCardFeedIcon, getCompanyFeeds, getDefaultCardName, getDomainOrWorkspaceAccountID, maskCardNumber} from '@libs/CardUtils'; import DateUtils from '@libs/DateUtils'; import {getLatestErrorField} from '@libs/ErrorUtils'; import type {PlatformStackScreenProps} from '@libs/Navigation/PlatformStackNavigation/types'; @@ -44,8 +46,8 @@ type WorkspaceCompanyCardDetailsPageProps = PlatformStackScreenProps { setIsUnassignModalVisible(false); if (card) { - unassignWorkspaceCompanyCard(workspaceAccountID, bank, card); + unassignWorkspaceCompanyCard(domainOrWorkspaceAccountID, bank, card); } Navigation.goBack(); }; const updateCard = () => { - updateWorkspaceCompanyCard(workspaceAccountID, cardID, bank as CompanyCardFeed); + updateWorkspaceCompanyCard(domainOrWorkspaceAccountID, cardID, bank as CompanyCardFeed); }; const lastScrape = useMemo(() => { @@ -136,7 +142,7 @@ function WorkspaceCompanyCardDetailsPage({route}: WorkspaceCompanyCardDetailsPag pendingAction={card?.nameValuePairs?.pendingFields?.cardTitle} errorRowStyles={[styles.ph5, styles.mb3]} errors={getLatestErrorField(card?.nameValuePairs ?? {}, 'cardTitle')} - onClose={() => clearCompanyCardErrorField(workspaceAccountID, cardID, bank, 'cardTitle')} + onClose={() => clearCompanyCardErrorField(domainOrWorkspaceAccountID, cardID, bank, 'cardTitle')} > clearCompanyCardErrorField(workspaceAccountID, cardID, bank, 'lastScrape', true)} + onClose={() => clearCompanyCardErrorField(domainOrWorkspaceAccountID, cardID, bank, 'lastScrape', true)} > ; @@ -30,15 +33,19 @@ function WorkspaceCompanyCardEditCardNamePage({route}: WorkspaceCompanyCardEditC const {policyID, cardID} = route.params; const workspaceAccountID = useWorkspaceAccountID(policyID); const bank = decodeURIComponent(route.params.bank); - const [customCardNames] = useOnyx(ONYXKEYS.NVP_EXPENSIFY_COMPANY_CARDS_CUSTOM_NAMES); + const [customCardNames] = useOnyx(ONYXKEYS.NVP_EXPENSIFY_COMPANY_CARDS_CUSTOM_NAMES, {canBeMissing: true}); const defaultValue = customCardNames?.[cardID]; const {translate} = useLocalize(); const {inputCallbackRef} = useAutoFocusInput(); const styles = useThemeStyles(); + const [cardFeeds] = useCardFeeds(policyID); + const companyFeeds = getCompanyFeeds(cardFeeds); + const domainOrWorkspaceAccountID = getDomainOrWorkspaceAccountID(workspaceAccountID, companyFeeds[bank as CompanyCardFeed]); + const submit = (values: FormOnyxValues) => { - updateCompanyCardName(workspaceAccountID, cardID, values[INPUT_IDS.NAME], bank, defaultValue); + updateCompanyCardName(domainOrWorkspaceAccountID, cardID, values[INPUT_IDS.NAME], bank, defaultValue); Navigation.goBack(ROUTES.WORKSPACE_COMPANY_CARD_DETAILS.getRoute(policyID, cardID, bank), {compareParams: false}); }; diff --git a/src/pages/workspace/companyCards/WorkspaceCompanyCardFeedSelectorPage.tsx b/src/pages/workspace/companyCards/WorkspaceCompanyCardFeedSelectorPage.tsx index bedb3c75f01a..9607fff353bf 100644 --- a/src/pages/workspace/companyCards/WorkspaceCompanyCardFeedSelectorPage.tsx +++ b/src/pages/workspace/companyCards/WorkspaceCompanyCardFeedSelectorPage.tsx @@ -13,7 +13,15 @@ import useLocalize from '@hooks/useLocalize'; import usePolicy from '@hooks/usePolicy'; import useThemeIllustrations from '@hooks/useThemeIllustrations'; import useThemeStyles from '@hooks/useThemeStyles'; -import {checkIfFeedConnectionIsBroken, filterInactiveCards, getCardFeedIcon, getCompanyFeeds, getCustomOrFormattedFeedName, getSelectedFeed} from '@libs/CardUtils'; +import { + checkIfFeedConnectionIsBroken, + filterInactiveCards, + getCardFeedIcon, + getCompanyFeeds, + getCustomOrFormattedFeedName, + getDomainOrWorkspaceAccountID, + getSelectedFeed, +} from '@libs/CardUtils'; import type {PlatformStackScreenProps} from '@libs/Navigation/PlatformStackNavigation/types'; import type {SettingsNavigatorParamList} from '@libs/Navigation/types'; import {isCollectPolicy} from '@libs/PolicyUtils'; @@ -50,8 +58,11 @@ function WorkspaceCompanyCardFeedSelectorPage({route}: WorkspaceCompanyCardFeedS const companyFeeds = getCompanyFeeds(cardFeeds); const isCollect = isCollectPolicy(policy); - const feeds: CardFeedListItem[] = (Object.keys(companyFeeds) as CompanyCardFeed[]).map((feed) => { - const filteredFeedCards = filterInactiveCards(allFeedsCards?.[`${ONYXKEYS.COLLECTION.WORKSPACE_CARDS_LIST}${workspaceAccountID}_${feed}`]); + const feeds: CardFeedListItem[] = Object.entries(companyFeeds).map(([key, feedSettings]) => { + const feed = key as CompanyCardFeed; + const filteredFeedCards = filterInactiveCards( + allFeedsCards?.[`${ONYXKEYS.COLLECTION.WORKSPACE_CARDS_LIST}${getDomainOrWorkspaceAccountID(workspaceAccountID, feedSettings)}_${feed}`], + ); const isFeedConnectionBroken = checkIfFeedConnectionIsBroken(filteredFeedCards); return { value: feed, diff --git a/src/pages/workspace/companyCards/WorkspaceCompanyCardsListHeaderButtons.tsx b/src/pages/workspace/companyCards/WorkspaceCompanyCardsListHeaderButtons.tsx index a3c095d7ff48..910a6a857b43 100644 --- a/src/pages/workspace/companyCards/WorkspaceCompanyCardsListHeaderButtons.tsx +++ b/src/pages/workspace/companyCards/WorkspaceCompanyCardsListHeaderButtons.tsx @@ -23,6 +23,7 @@ import { getCardFeedIcon, getCompanyFeeds, getCustomOrFormattedFeedName, + getDomainOrWorkspaceAccountID, isCustomFeed, } from '@libs/CardUtils'; import Navigation from '@navigation/Navigation'; @@ -60,7 +61,8 @@ function WorkspaceCompanyCardsListHeaderButtons({policyID, selectedFeed, shouldS const companyFeeds = getCompanyFeeds(cardFeeds); const currentFeedData = companyFeeds?.[selectedFeed]; const bankName = getBankName(selectedFeed); - const filteredFeedCards = filterInactiveCards(allFeedsCards?.[`${ONYXKEYS.COLLECTION.WORKSPACE_CARDS_LIST}${workspaceAccountID}_${selectedFeed}`]); + const domainOrWorkspaceAccountID = getDomainOrWorkspaceAccountID(workspaceAccountID, currentFeedData); + const filteredFeedCards = filterInactiveCards(allFeedsCards?.[`${ONYXKEYS.COLLECTION.WORKSPACE_CARDS_LIST}${domainOrWorkspaceAccountID}_${selectedFeed}`]); const isSelectedFeedConnectionBroken = checkIfFeedConnectionIsBroken(filteredFeedCards); return ( @@ -72,7 +74,7 @@ function WorkspaceCompanyCardsListHeaderButtons({policyID, selectedFeed, shouldS shouldChangeLayout={shouldChangeLayout} feedName={formattedFeedName} supportingText={translate(isCommercialFeed ? 'workspace.companyCards.commercialFeed' : 'workspace.companyCards.directFeed')} - shouldShowRBR={checkIfFeedConnectionIsBroken(flatAllCardsList(allFeedsCards, workspaceAccountID), selectedFeed)} + shouldShowRBR={checkIfFeedConnectionIsBroken(flatAllCardsList(allFeedsCards, domainOrWorkspaceAccountID), selectedFeed)} /> {!!shouldShowAssignCardButton && ( diff --git a/src/pages/workspace/companyCards/WorkspaceCompanyCardsPage.tsx b/src/pages/workspace/companyCards/WorkspaceCompanyCardsPage.tsx index 67addcf7b6d8..6106addfcd88 100644 --- a/src/pages/workspace/companyCards/WorkspaceCompanyCardsPage.tsx +++ b/src/pages/workspace/companyCards/WorkspaceCompanyCardsPage.tsx @@ -5,7 +5,7 @@ import DecisionModal from '@components/DecisionModal'; import DelegateNoAccessModal from '@components/DelegateNoAccessModal'; import * as Illustrations from '@components/Icon/Illustrations'; import useCardFeeds from '@hooks/useCardFeeds'; -import useDefaultFundID from '@hooks/useDefaultFundID'; +import useCardsList from '@hooks/useCardsList'; import useLocalize from '@hooks/useLocalize'; import useNetwork from '@hooks/useNetwork'; import useResponsiveLayout from '@hooks/useResponsiveLayout'; @@ -13,8 +13,8 @@ import useTheme from '@hooks/useTheme'; import useThemeStyles from '@hooks/useThemeStyles'; import { checkIfFeedConnectionIsBroken, - filterInactiveCards, getCompanyFeeds, + getDomainOrWorkspaceAccountID, getFilteredCardList, getSelectedFeed, hasOnlyOneCardToAssign, @@ -52,7 +52,7 @@ function WorkspaceCompanyCardsPage({route}: WorkspaceCompanyCardsPageProps) { const [lastSelectedFeed] = useOnyx(`${ONYXKEYS.COLLECTION.LAST_SELECTED_FEED}${policyID}`, {canBeMissing: true}); const [cardFeeds] = useCardFeeds(policyID); const selectedFeed = getSelectedFeed(lastSelectedFeed, cardFeeds); - const [cardsList] = useOnyx(`${ONYXKEYS.COLLECTION.WORKSPACE_CARDS_LIST}${workspaceAccountID}_${selectedFeed}`, {selector: filterInactiveCards, canBeMissing: true}); + const [cardsList] = useCardsList(policyID, selectedFeed); const {cardList, ...cards} = cardsList ?? {}; @@ -69,15 +69,14 @@ function WorkspaceCompanyCardsPage({route}: WorkspaceCompanyCardsPageProps) { const isFeedConnectionBroken = checkIfFeedConnectionIsBroken(cards); const [shouldShowOfflineModal, setShouldShowOfflineModal] = useState(false); const {shouldUseNarrowLayout} = useResponsiveLayout(); + const domainOrWorkspaceAccountID = getDomainOrWorkspaceAccountID(workspaceAccountID, selectedFeedData); const fetchCompanyCards = useCallback(() => { - openPolicyCompanyCardsPage(policyID, workspaceAccountID); - }, [policyID, workspaceAccountID]); + openPolicyCompanyCardsPage(policyID, domainOrWorkspaceAccountID); + }, [policyID, domainOrWorkspaceAccountID]); const {isOffline} = useNetwork({onReconnect: fetchCompanyCards}); const isLoading = !isOffline && (!cardFeeds || (!!cardFeeds.isLoading && isEmptyObject(cardsList))); - const defaultFundID = useDefaultFundID(policyID); - useEffect(() => { fetchCompanyCards(); }, [fetchCompanyCards]); @@ -87,8 +86,8 @@ function WorkspaceCompanyCardsPage({route}: WorkspaceCompanyCardsPageProps) { return; } - openPolicyCompanyCardsFeed(defaultFundID, policyID, selectedFeed); - }, [selectedFeed, isLoading, policyID, isPending, defaultFundID]); + openPolicyCompanyCardsFeed(domainOrWorkspaceAccountID, policyID, selectedFeed); + }, [selectedFeed, isLoading, policyID, isPending, domainOrWorkspaceAccountID]); const handleAssignCard = () => { if (isActingAsDelegate) { diff --git a/src/pages/workspace/companyCards/WorkspaceCompanyCardsSettingsFeedNamePage.tsx b/src/pages/workspace/companyCards/WorkspaceCompanyCardsSettingsFeedNamePage.tsx index 5cd56a8cd51d..5fde011faebe 100644 --- a/src/pages/workspace/companyCards/WorkspaceCompanyCardsSettingsFeedNamePage.tsx +++ b/src/pages/workspace/companyCards/WorkspaceCompanyCardsSettingsFeedNamePage.tsx @@ -14,7 +14,7 @@ import useCardFeeds from '@hooks/useCardFeeds'; import useLocalize from '@hooks/useLocalize'; import usePolicy from '@hooks/usePolicy'; import useThemeStyles from '@hooks/useThemeStyles'; -import {getCustomOrFormattedFeedName, getSelectedFeed} from '@libs/CardUtils'; +import {getCompanyFeeds, getCustomOrFormattedFeedName, getDomainOrWorkspaceAccountID, getSelectedFeed} from '@libs/CardUtils'; import Navigation from '@libs/Navigation/Navigation'; import type {PlatformStackScreenProps} from '@libs/Navigation/PlatformStackNavigation/types'; import type {SettingsNavigatorParamList} from '@libs/Navigation/types'; @@ -44,7 +44,9 @@ function WorkspaceCompanyCardsSettingsFeedNamePage({ const [lastSelectedFeed, lastSelectedFeedResult] = useOnyx(`${ONYXKEYS.COLLECTION.LAST_SELECTED_FEED}${policyID}`, {canBeMissing: true}); const [cardFeeds, cardFeedsResult] = useCardFeeds(policyID); const selectedFeed = getSelectedFeed(lastSelectedFeed, cardFeeds); + const companyFeeds = getCompanyFeeds(cardFeeds); const feedName = getCustomOrFormattedFeedName(selectedFeed, cardFeeds?.settings?.companyCardNicknames); + const domainOrWorkspaceAccountID = getDomainOrWorkspaceAccountID(workspaceAccountID, selectedFeed ? companyFeeds[selectedFeed] : undefined); const validate = useCallback( (values: FormOnyxValues) => { @@ -67,7 +69,7 @@ function WorkspaceCompanyCardsSettingsFeedNamePage({ const submit = ({name}: WorkspaceCompanyCardFeedName) => { if (selectedFeed) { - setWorkspaceCompanyCardFeedName(policyID, workspaceAccountID, selectedFeed, name); + setWorkspaceCompanyCardFeedName(policyID, domainOrWorkspaceAccountID, selectedFeed, name); } Navigation.goBack(ROUTES.WORKSPACE_COMPANY_CARDS_SETTINGS.getRoute(policyID)); }; diff --git a/src/pages/workspace/companyCards/WorkspaceCompanyCardsSettingsPage.tsx b/src/pages/workspace/companyCards/WorkspaceCompanyCardsSettingsPage.tsx index 1cf89ba77e82..2a3b2fca7317 100644 --- a/src/pages/workspace/companyCards/WorkspaceCompanyCardsSettingsPage.tsx +++ b/src/pages/workspace/companyCards/WorkspaceCompanyCardsSettingsPage.tsx @@ -10,11 +10,12 @@ import ScreenWrapper from '@components/ScreenWrapper'; import ScrollView from '@components/ScrollView'; import Text from '@components/Text'; import useCardFeeds from '@hooks/useCardFeeds'; +import useCardsList from '@hooks/useCardsList'; import useLocalize from '@hooks/useLocalize'; import usePolicy from '@hooks/usePolicy'; import useThemeStyles from '@hooks/useThemeStyles'; import {deleteWorkspaceCompanyCardFeed, setWorkspaceCompanyCardTransactionLiability} from '@libs/actions/CompanyCards'; -import {filterInactiveCards, getCompanyFeeds, getCustomOrFormattedFeedName, getSelectedFeed} from '@libs/CardUtils'; +import {getCompanyFeeds, getCustomOrFormattedFeedName, getDomainOrWorkspaceAccountID, getSelectedFeed} from '@libs/CardUtils'; import Navigation from '@libs/Navigation/Navigation'; import type {PlatformStackScreenProps} from '@libs/Navigation/PlatformStackNavigation/types'; import type {SettingsNavigatorParamList} from '@libs/Navigation/types'; @@ -44,11 +45,13 @@ function WorkspaceCompanyCardsSettingsPage({ const selectedFeed = useMemo(() => getSelectedFeed(lastSelectedFeed, cardFeeds), [cardFeeds, lastSelectedFeed]); - const [cardsList] = useOnyx(`${ONYXKEYS.COLLECTION.WORKSPACE_CARDS_LIST}${workspaceAccountID}_${selectedFeed}`, {selector: filterInactiveCards, canBeMissing: false}); + const [cardsList] = useCardsList(policyID, selectedFeed); const feedName = getCustomOrFormattedFeedName(selectedFeed, cardFeeds?.settings?.companyCardNicknames); const companyFeeds = getCompanyFeeds(cardFeeds); - const liabilityType = selectedFeed && companyFeeds[selectedFeed]?.liabilityType; + const selectedFeedData = selectedFeed ? companyFeeds[selectedFeed] : undefined; + const liabilityType = selectedFeedData?.liabilityType; const isPersonal = liabilityType === CONST.COMPANY_CARDS.DELETE_TRANSACTIONS.ALLOW; + const domainOrWorkspaceAccountID = getDomainOrWorkspaceAccountID(workspaceAccountID, selectedFeedData); const navigateToChangeFeedName = () => { Navigation.navigate(ROUTES.WORKSPACE_COMPANY_CARDS_SETTINGS_FEED_NAME.getRoute(policyID)); @@ -64,7 +67,7 @@ function WorkspaceCompanyCardsSettingsPage({ .filter((feed) => feed !== selectedFeed && companyFeeds[feed]?.pendingAction !== CONST.RED_BRICK_ROAD_PENDING_ACTION.DELETE) .at(0); InteractionManager.runAfterInteractions(() => { - deleteWorkspaceCompanyCardFeed(policyID, workspaceAccountID, selectedFeed, cardIDs, feedToOpen); + deleteWorkspaceCompanyCardFeed(policyID, domainOrWorkspaceAccountID, selectedFeed, cardIDs, feedToOpen); }); } }; @@ -74,7 +77,7 @@ function WorkspaceCompanyCardsSettingsPage({ return; } setWorkspaceCompanyCardTransactionLiability( - workspaceAccountID, + domainOrWorkspaceAccountID, policyID, selectedFeed, isOn ? CONST.COMPANY_CARDS.DELETE_TRANSACTIONS.ALLOW : CONST.COMPANY_CARDS.DELETE_TRANSACTIONS.RESTRICT, diff --git a/src/pages/workspace/companyCards/assignCard/AssigneeStep.tsx b/src/pages/workspace/companyCards/assignCard/AssigneeStep.tsx index 1eeba58378fe..53f380f58691 100644 --- a/src/pages/workspace/companyCards/assignCard/AssigneeStep.tsx +++ b/src/pages/workspace/companyCards/assignCard/AssigneeStep.tsx @@ -10,11 +10,12 @@ import type {ListItem} from '@components/SelectionList/types'; import UserListItem from '@components/SelectionList/UserListItem'; import Text from '@components/Text'; import useCardFeeds from '@hooks/useCardFeeds'; +import useCardsList from '@hooks/useCardsList'; import useDebouncedState from '@hooks/useDebouncedState'; import useLocalize from '@hooks/useLocalize'; import useNetwork from '@hooks/useNetwork'; import useThemeStyles from '@hooks/useThemeStyles'; -import {filterInactiveCards, getDefaultCardName, getFilteredCardList, hasOnlyOneCardToAssign} from '@libs/CardUtils'; +import {getDefaultCardName, getFilteredCardList, hasOnlyOneCardToAssign} from '@libs/CardUtils'; import {formatPhoneNumber} from '@libs/LocalePhoneNumber'; import {getHeaderMessage, getSearchValueForPhoneOrEmail, sortAlphabetically} from '@libs/OptionsListUtils'; import {getPersonalDetailByEmail} from '@libs/PersonalDetailsUtils'; @@ -41,9 +42,7 @@ function AssigneeStep({policy, feed}: AssigneeStepProps) { const styles = useThemeStyles(); const {isOffline} = useNetwork(); const [assignCard] = useOnyx(ONYXKEYS.ASSIGN_CARD, {canBeMissing: true}); - const workspaceAccountID = policy?.workspaceAccountID ?? CONST.DEFAULT_NUMBER_ID; - - const [list] = useOnyx(`${ONYXKEYS.COLLECTION.WORKSPACE_CARDS_LIST}${workspaceAccountID}_${feed}`, {selector: filterInactiveCards, canBeMissing: false}); + const [list] = useCardsList(policy?.id, feed); const [cardFeeds] = useCardFeeds(policy?.id); const filteredCardList = getFilteredCardList(list, cardFeeds?.settings?.oAuthAccountDetails?.[feed]); diff --git a/src/pages/workspace/companyCards/assignCard/CardSelectionStep.tsx b/src/pages/workspace/companyCards/assignCard/CardSelectionStep.tsx index 394b0049c161..adfcce86459f 100644 --- a/src/pages/workspace/companyCards/assignCard/CardSelectionStep.tsx +++ b/src/pages/workspace/companyCards/assignCard/CardSelectionStep.tsx @@ -12,13 +12,13 @@ import Text from '@components/Text'; import TextLink from '@components/TextLink'; import useBottomSafeSafeAreaPaddingStyle from '@hooks/useBottomSafeSafeAreaPaddingStyle'; import useCardFeeds from '@hooks/useCardFeeds'; +import useCardsList from '@hooks/useCardsList'; import useEnvironment from '@hooks/useEnvironment'; import useLocalize from '@hooks/useLocalize'; import useThemeIllustrations from '@hooks/useThemeIllustrations'; import useThemeStyles from '@hooks/useThemeStyles'; -import useWorkspaceAccountID from '@hooks/useWorkspaceAccountID'; import {setAssignCardStepAndData} from '@libs/actions/CompanyCards'; -import {filterInactiveCards, getBankName, getCardFeedIcon, getFilteredCardList, lastFourNumbersFromCardName, maskCardNumber} from '@libs/CardUtils'; +import {getBankName, getCardFeedIcon, getFilteredCardList, lastFourNumbersFromCardName, maskCardNumber} from '@libs/CardUtils'; import {getPersonalDetailByEmail} from '@libs/PersonalDetailsUtils'; import variables from '@styles/variables'; import CONST from '@src/CONST'; @@ -35,15 +35,13 @@ type CardSelectionStepProps = { }; function CardSelectionStep({feed, policyID}: CardSelectionStepProps) { - const workspaceAccountID = useWorkspaceAccountID(policyID); - const {translate} = useLocalize(); const styles = useThemeStyles(); const illustrations = useThemeIllustrations(); const {environmentURL} = useEnvironment(); const [searchText, setSearchText] = useState(''); const [assignCard] = useOnyx(ONYXKEYS.ASSIGN_CARD, {canBeMissing: false}); - const [list] = useOnyx(`${ONYXKEYS.COLLECTION.WORKSPACE_CARDS_LIST}${workspaceAccountID}_${feed}`, {selector: filterInactiveCards, canBeMissing: false}); + const [list] = useCardsList(policyID, feed); const [workspaceCardFeeds] = useOnyx(ONYXKEYS.COLLECTION.WORKSPACE_CARDS_LIST, {canBeMissing: false}); const [cardFeeds] = useCardFeeds(policyID); diff --git a/src/pages/workspace/members/WorkspaceMemberDetailsPage.tsx b/src/pages/workspace/members/WorkspaceMemberDetailsPage.tsx index 90f751ed38bb..3f4285273a72 100644 --- a/src/pages/workspace/members/WorkspaceMemberDetailsPage.tsx +++ b/src/pages/workspace/members/WorkspaceMemberDetailsPage.tsx @@ -18,6 +18,7 @@ import ScrollView from '@components/ScrollView'; import Text from '@components/Text'; import useCardFeeds from '@hooks/useCardFeeds'; import useCurrentUserPersonalDetails from '@hooks/useCurrentUserPersonalDetails'; +import useExpensifyCardFeeds from '@hooks/useExpensifyCardFeeds'; import useLocalize from '@hooks/useLocalize'; import usePrevious from '@hooks/usePrevious'; import useStyleUtils from '@hooks/useStyleUtils'; @@ -75,7 +76,7 @@ function WorkspaceMemberDetailsPage({personalDetails, policy, route}: WorkspaceM const currentUserPersonalDetails = useCurrentUserPersonalDetails(); const [cardFeeds] = useCardFeeds(policyID); const [cardList] = useOnyx(`${ONYXKEYS.COLLECTION.WORKSPACE_CARDS_LIST}`, {canBeMissing: true}); - const [cardSettings] = useOnyx(`${ONYXKEYS.COLLECTION.PRIVATE_EXPENSIFY_CARD_SETTINGS}${workspaceAccountID}`, {canBeMissing: true}); + const expensifyCardSettings = useExpensifyCardFeeds(policyID); const [isRemoveMemberConfirmModalVisible, setIsRemoveMemberConfirmModalVisible] = useState(false); const [isRoleSelectionModalVisible, setIsRoleSelectionModalVisible] = useState(false); @@ -94,7 +95,7 @@ function WorkspaceMemberDetailsPage({personalDetails, policy, route}: WorkspaceM const ownerDetails = useMemo(() => personalDetails?.[policy?.ownerAccountID ?? CONST.DEFAULT_NUMBER_ID] ?? ({} as PersonalDetails), [personalDetails, policy?.ownerAccountID]); const policyOwnerDisplayName = formatPhoneNumber(getDisplayNameOrDefault(ownerDetails)) ?? policy?.owner ?? ''; const hasMultipleFeeds = Object.keys(getCompanyFeeds(cardFeeds, false, true)).length > 0; - const workspaceCards = getAllCardsForWorkspace(workspaceAccountID, cardList); + const workspaceCards = getAllCardsForWorkspace(workspaceAccountID, cardList, cardFeeds, expensifyCardSettings); const isSMSLogin = Str.isSMSLogin(memberLogin); const phoneNumber = getPhoneNumber(details); @@ -271,7 +272,7 @@ function WorkspaceMemberDetailsPage({personalDetails, policy, route}: WorkspaceM return ; } - const shouldShowCardsSection = isExpensifyCardFullySetUp(policy, cardSettings) || hasMultipleFeeds; + const shouldShowCardsSection = Object.values(expensifyCardSettings ?? {}).some((cardSettings) => isExpensifyCardFullySetUp(policy, cardSettings)) || hasMultipleFeeds; return ( ; @@ -131,6 +137,7 @@ export type { CompanyCardFeed, DirectCardFeedData, CardFeedProvider, + CardFeedData, CompanyFeeds, CompanyCardNicknames, CompanyCardFeedWithNumber,