Skip to content

Commit 0349d96

Browse files
authored
Merge pull request #52612 from callstack-internal/fix/51881-show-cards-from-all-feeds
2 parents fb487a5 + e0120b5 commit 0349d96

File tree

2 files changed

+30
-21
lines changed

2 files changed

+30
-21
lines changed

src/libs/CardUtils.ts

+22-1
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
import {fromUnixTime, isBefore} from 'date-fns';
22
import groupBy from 'lodash/groupBy';
33
import Onyx from 'react-native-onyx';
4-
import type {OnyxEntry} from 'react-native-onyx';
4+
import type {OnyxCollection, OnyxEntry} from 'react-native-onyx';
55
import type {ValueOf} from 'type-fest';
66
import ExpensifyCardImage from '@assets/images/expensify-card.svg';
77
import * as Illustrations from '@src/components/Icon/Illustrations';
@@ -30,6 +30,15 @@ Onyx.connect({
3030
},
3131
});
3232

33+
let allWorkspaceCards: OnyxCollection<WorkspaceCardsList> = {};
34+
Onyx.connect({
35+
key: ONYXKEYS.COLLECTION.WORKSPACE_CARDS_LIST,
36+
waitForCollectionCallback: true,
37+
callback: (value) => {
38+
allWorkspaceCards = value;
39+
},
40+
});
41+
3342
/**
3443
* @returns string with a month in MM format
3544
*/
@@ -398,6 +407,17 @@ function checkIfNewFeedConnected(prevFeedsData: CompanyFeeds, currentFeedsData:
398407
};
399408
}
400409

410+
function getAllCardsForWorkspace(workspaceAccountID: number): CardList {
411+
const cards = {};
412+
for (const [key, values] of Object.entries(allWorkspaceCards ?? {})) {
413+
if (key.includes(workspaceAccountID.toString()) && values) {
414+
const {cardList, ...rest} = values;
415+
Object.assign(cards, rest);
416+
}
417+
}
418+
return cards;
419+
}
420+
401421
export {
402422
isExpensifyCard,
403423
isCorporateCard,
@@ -427,4 +447,5 @@ export {
427447
hasOnlyOneCardToAssign,
428448
checkIfNewFeedConnected,
429449
getDefaultCardName,
450+
getAllCardsForWorkspace,
430451
};

src/pages/workspace/members/WorkspaceMemberDetailsPage.tsx

+8-20
Original file line numberDiff line numberDiff line change
@@ -62,10 +62,7 @@ function WorkspaceMemberDetailsPage({personalDetails, policy, route}: WorkspaceM
6262
const {formatPhoneNumber, translate} = useLocalize();
6363
const StyleUtils = useStyleUtils();
6464
const currentUserPersonalDetails = useCurrentUserPersonalDetails();
65-
const [cards] = useOnyx(`${ONYXKEYS.CARD_LIST}`);
66-
const [expensifyCards] = useOnyx(`${ONYXKEYS.COLLECTION.WORKSPACE_CARDS_LIST}${workspaceAccountID}_${CONST.EXPENSIFY_CARD.BANK}`);
6765
const [cardFeeds] = useOnyx(`${ONYXKEYS.COLLECTION.SHARED_NVP_PRIVATE_DOMAIN_MEMBER}${workspaceAccountID}`);
68-
const [cardSettings] = useOnyx(`${ONYXKEYS.COLLECTION.PRIVATE_EXPENSIFY_CARD_SETTINGS}${workspaceAccountID}`);
6966

7067
const [isRemoveMemberConfirmModalVisible, setIsRemoveMemberConfirmModalVisible] = useState(false);
7168
const [isRoleSelectionModalVisible, setIsRoleSelectionModalVisible] = useState(false);
@@ -84,29 +81,20 @@ function WorkspaceMemberDetailsPage({personalDetails, policy, route}: WorkspaceM
8481
const ownerDetails = personalDetails?.[policy?.ownerAccountID ?? CONST.DEFAULT_NUMBER_ID] ?? ({} as PersonalDetails);
8582
const policyOwnerDisplayName = formatPhoneNumber(PersonalDetailsUtils.getDisplayNameOrDefault(ownerDetails)) ?? policy?.owner ?? '';
8683
const hasMultipleFeeds = Object.values(CardUtils.getCompanyFeeds(cardFeeds)).filter((feed) => !feed.pending).length > 0;
87-
const paymentAccountID = cardSettings?.paymentBankAccountID ?? CONST.DEFAULT_NUMBER_ID;
84+
85+
const workspaceCards = CardUtils.getAllCardsForWorkspace(workspaceAccountID);
86+
const hasWorkspaceCardsAssigned = !!workspaceCards && !!Object.values(workspaceCards).length;
8887

8988
useEffect(() => {
9089
CompanyCards.openPolicyCompanyCardsPage(policyID, workspaceAccountID);
9190
}, [policyID, workspaceAccountID]);
9291

9392
const memberCards = useMemo(() => {
94-
if (!cards && !expensifyCards) {
93+
if (!workspaceCards) {
9594
return [];
9695
}
97-
// For admin Expensify Cards can also appear in the cards list, so we need to remove duplicates
98-
const allCards = [...Object.values(cards ?? {}), ...Object.values(expensifyCards ?? {})];
99-
const cardIDs = new Set();
100-
const uniqueObjects = allCards.filter((obj) => {
101-
if (cardIDs.has(obj.cardID)) {
102-
return false;
103-
}
104-
cardIDs.add(obj.cardID);
105-
return true;
106-
});
107-
108-
return Object.values(uniqueObjects ?? {}).filter((card) => card.accountID === accountID && workspaceAccountID.toString() === card.fundID);
109-
}, [accountID, workspaceAccountID, cards, expensifyCards]);
96+
return Object.values(workspaceCards ?? {}).filter((card) => card.accountID === accountID);
97+
}, [accountID, workspaceCards]);
11098

11199
const confirmModalPrompt = useMemo(() => {
112100
const isApprover = Member.isApprover(policy, accountID);
@@ -220,7 +208,7 @@ function WorkspaceMemberDetailsPage({personalDetails, policy, route}: WorkspaceM
220208
return <NotFoundPage />;
221209
}
222210

223-
const shouldShowCardsSection = (!!policy?.areExpensifyCardsEnabled && !!paymentAccountID) || (!!policy?.areCompanyCardsEnabled && hasMultipleFeeds);
211+
const shouldShowCardsSection = hasWorkspaceCardsAssigned && (!!policy?.areExpensifyCardsEnabled || !!policy?.areCompanyCardsEnabled);
224212

225213
return (
226214
<AccessOrNotFoundWrapper
@@ -316,7 +304,7 @@ function WorkspaceMemberDetailsPage({personalDetails, policy, route}: WorkspaceM
316304
{translate('walletPage.assignedCards')}
317305
</Text>
318306
</View>
319-
{(memberCards as MemberCard[]).map((memberCard) => {
307+
{memberCards.map((memberCard) => {
320308
const isCardDeleted = memberCard.pendingAction === CONST.RED_BRICK_ROAD_PENDING_ACTION.DELETE;
321309
return (
322310
<OfflineWithFeedback

0 commit comments

Comments
 (0)