From 35e8f4d738f7fe95bcc49ee28ba7ec68e63c7348 Mon Sep 17 00:00:00 2001 From: Kevin Brian Bader Date: Mon, 12 Jan 2026 19:08:44 -0800 Subject: [PATCH 1/2] fix: RHP shows not here page briefly after Unassign card --- .../companyCards/WorkspaceCompanyCardDetailsPage.tsx | 12 +++++++++--- 1 file changed, 9 insertions(+), 3 deletions(-) diff --git a/src/pages/workspace/companyCards/WorkspaceCompanyCardDetailsPage.tsx b/src/pages/workspace/companyCards/WorkspaceCompanyCardDetailsPage.tsx index 58fe341f94ec..24d04245ecf4 100644 --- a/src/pages/workspace/companyCards/WorkspaceCompanyCardDetailsPage.tsx +++ b/src/pages/workspace/companyCards/WorkspaceCompanyCardDetailsPage.tsx @@ -1,6 +1,6 @@ import {format, parseISO} from 'date-fns'; import {Str} from 'expensify-common'; -import React, {useMemo, useState} from 'react'; +import React, {useMemo, useRef, useState} from 'react'; import {View} from 'react-native'; import ActivityIndicator from '@components/ActivityIndicator'; import ConfirmModal from '@components/ConfirmModal'; @@ -56,6 +56,7 @@ function WorkspaceCompanyCardDetailsPage({route}: WorkspaceCompanyCardDetailsPag const policy = usePolicy(policyID); const workspaceAccountID = policy?.workspaceAccountID ?? CONST.DEFAULT_NUMBER_ID; const [isUnassignModalVisible, setIsUnassignModalVisible] = useState(false); + const isUnassigningRef = useRef(false); const {translate, getLocalDateFromDatetime} = useLocalize(); const styles = useThemeStyles(); const StyleUtils = useStyleUtils(); @@ -69,7 +70,10 @@ function WorkspaceCompanyCardDetailsPage({route}: WorkspaceCompanyCardDetailsPag const [personalDetails] = useOnyx(ONYXKEYS.PERSONAL_DETAILS_LIST, {canBeMissing: false}); const [allBankCards, allBankCardsMetadata] = useCardsList(feedName); - const card = allBankCards?.[cardID]; + const [cardList, cardListMetadata] = useOnyx(ONYXKEYS.CARD_LIST, {canBeMissing: true}); + // Use card from CARD_LIST instead of WORKSPACE_CARDS_LIST so we can access it even after unassignment + // this prevents NotFoundPage from being shown briefly in RHP when the card is being unassigned + const card = cardList?.[cardID] ?? allBankCards?.[cardID]; const cardBank = card?.bank ?? ''; const cardholder = personalDetails?.[card?.accountID ?? CONST.DEFAULT_NUMBER_ID]; @@ -84,6 +88,7 @@ function WorkspaceCompanyCardDetailsPage({route}: WorkspaceCompanyCardDetailsPag const unassignCard = () => { setIsUnassignModalVisible(false); if (card) { + isUnassigningRef.current = true; unassignWorkspaceCompanyCard(domainOrWorkspaceAccountID, bank, card); } Navigation.goBack(); @@ -100,7 +105,8 @@ function WorkspaceCompanyCardDetailsPage({route}: WorkspaceCompanyCardDetailsPag return format(getLocalDateFromDatetime(card?.lastScrape), CONST.DATE.FNS_DATE_TIME_FORMAT_STRING); }, [getLocalDateFromDatetime, card?.lastScrape, translate]); - if (!card && !isLoadingOnyxValue(allBankCardsMetadata)) { + // Don't show NotFoundPage if card is being unassigned or data is still loading + if (!card && !isUnassigningRef.current && !isLoadingOnyxValue(allBankCardsMetadata) && !isLoadingOnyxValue(cardListMetadata)) { return ; } From f5e74c27257724e7b84fdaf7226352b33b7b06d4 Mon Sep 17 00:00:00 2001 From: Kevin Brian Bader Date: Mon, 12 Jan 2026 20:33:28 -0800 Subject: [PATCH 2/2] fix: prevent RHP flash on card unassign while maintaining feed scoping --- .../companyCards/WorkspaceCompanyCardDetailsPage.tsx | 12 +++++++++--- 1 file changed, 9 insertions(+), 3 deletions(-) diff --git a/src/pages/workspace/companyCards/WorkspaceCompanyCardDetailsPage.tsx b/src/pages/workspace/companyCards/WorkspaceCompanyCardDetailsPage.tsx index 24d04245ecf4..29c093eeeaa8 100644 --- a/src/pages/workspace/companyCards/WorkspaceCompanyCardDetailsPage.tsx +++ b/src/pages/workspace/companyCards/WorkspaceCompanyCardDetailsPage.tsx @@ -71,9 +71,15 @@ function WorkspaceCompanyCardDetailsPage({route}: WorkspaceCompanyCardDetailsPag const [personalDetails] = useOnyx(ONYXKEYS.PERSONAL_DETAILS_LIST, {canBeMissing: false}); const [allBankCards, allBankCardsMetadata] = useCardsList(feedName); const [cardList, cardListMetadata] = useOnyx(ONYXKEYS.CARD_LIST, {canBeMissing: true}); - // Use card from CARD_LIST instead of WORKSPACE_CARDS_LIST so we can access it even after unassignment - // this prevents NotFoundPage from being shown briefly in RHP when the card is being unassigned - const card = cardList?.[cardID] ?? allBankCards?.[cardID]; + + // Prefer feed-scoped card from WORKSPACE_CARDS_LIST to maintain proper access control + // Only use CARD_LIST as fallback if card is being unassigned (has pendingAction: DELETE) + // This prevents showing cards from other feeds/workspaces via deep links while still + // preventing NotHerePage flash during the unassignment flow + const feedScopedCard = allBankCards?.[cardID]; + const globalCard = cardList?.[cardID]; + const isCardBeingUnassigned = globalCard?.pendingAction === CONST.RED_BRICK_ROAD_PENDING_ACTION.DELETE; + const card = feedScopedCard ?? (isCardBeingUnassigned ? globalCard : undefined); const cardBank = card?.bank ?? ''; const cardholder = personalDetails?.[card?.accountID ?? CONST.DEFAULT_NUMBER_ID];