From 12e1ee8c4873710c50f13d0efc120ccde9d29aee Mon Sep 17 00:00:00 2001 From: dukenv0307 Date: Mon, 8 Jun 2026 16:07:32 +0700 Subject: [PATCH] Expense-To field shows correct avatar but wrong name after creating new report on confirm page --- src/hooks/useParticipantsPolicies.ts | 38 +++++++++++++++++++ .../step/IOURequestStepConfirmation.tsx | 8 +++- 2 files changed, 44 insertions(+), 2 deletions(-) create mode 100644 src/hooks/useParticipantsPolicies.ts diff --git a/src/hooks/useParticipantsPolicies.ts b/src/hooks/useParticipantsPolicies.ts new file mode 100644 index 000000000000..d560aa68100c --- /dev/null +++ b/src/hooks/useParticipantsPolicies.ts @@ -0,0 +1,38 @@ +import type {OnyxCollection} from 'react-native-onyx'; +import ONYXKEYS from '@src/ONYXKEYS'; +import type {Policy} from '@src/types/onyx'; +import {getEmptyObject} from '@src/types/utils/EmptyObject'; +import useOnyx from './useOnyx'; + +type ParticipantWithPolicyID = { + policyID?: string; +}; + +function getPoliciesSelector(participants: ParticipantWithPolicyID[]): (allPolicies: OnyxCollection) => Record { + return (allPolicies: OnyxCollection) => { + if (!participants) { + return {}; + } + return participants.reduce>((acc, participant) => { + const key = `${ONYXKEYS.COLLECTION.POLICY}${participant.policyID}`; + if (allPolicies?.[key] && participant.policyID) { + acc[participant.policyID] = allPolicies[key]; + } + return acc; + }, {}); + }; +} + +/** + * Hook that extracts policies only for participants' policies. + * + * @param participants - Array of participants with optional policyID + * @returns Record mapping policyID to Policy + */ +function useParticipantsPolicies(participants: ParticipantWithPolicyID[]): Record { + const [participantsPolicies = getEmptyObject>()] = useOnyx(ONYXKEYS.COLLECTION.POLICY, {selector: getPoliciesSelector(participants)}, [participants]); + + return participantsPolicies; +} + +export default useParticipantsPolicies; diff --git a/src/pages/iou/request/step/IOURequestStepConfirmation.tsx b/src/pages/iou/request/step/IOURequestStepConfirmation.tsx index b3fb954ae007..d05a62d8a9a1 100644 --- a/src/pages/iou/request/step/IOURequestStepConfirmation.tsx +++ b/src/pages/iou/request/step/IOURequestStepConfirmation.tsx @@ -23,6 +23,7 @@ import useNetwork from '@hooks/useNetwork'; import useOdometerReceiptStitcher from '@hooks/useOdometerReceiptStitcher'; import useOnyx from '@hooks/useOnyx'; import useOptimisticDraftTransactions from '@hooks/useOptimisticDraftTransactions'; +import useParticipantsPolicies from '@hooks/useParticipantsPolicies'; import usePermissions from '@hooks/usePermissions'; import usePolicyForTransaction from '@hooks/usePolicyForTransaction'; import usePrivateIsArchivedMap from '@hooks/usePrivateIsArchivedMap'; @@ -247,6 +248,8 @@ function IOURequestStepConfirmation({ setMoneyRequestParticipantsFromReport(transaction.transactionID, transactionReport, currentUserPersonalDetails.accountID); }, [transactionReport, currentUserPersonalDetails.accountID, transaction?.transactionID, iouType]); + const participantsPolicies = useParticipantsPolicies(transaction?.participants ?? []); + const participants = useMemo( () => transaction?.participants?.map((participant) => { @@ -255,11 +258,12 @@ function IOURequestStepConfirmation({ } const privateIsArchived = privateIsArchivedMap[`${ONYXKEYS.COLLECTION.REPORT_NAME_VALUE_PAIRS}${participant.reportID}`]; const participantReportDraft = reportDrafts?.[`${ONYXKEYS.COLLECTION.REPORT_DRAFT}${participant.reportID}`]; + const participantPolicy = participant.policyID ? participantsPolicies[participant.policyID] : policy; return participant.accountID ? getParticipantsOption(participant, personalDetails) - : getReportOption(participant, privateIsArchived, policy, personalDetails, conciergeReportID, reportAttributesDerived, participantReportDraft); + : getReportOption(participant, privateIsArchived, participantPolicy, personalDetails, conciergeReportID, reportAttributesDerived, participantReportDraft); }) ?? [], - [transaction?.participants, iouType, personalDetails, reportAttributesDerived, privateIsArchivedMap, policy, conciergeReportID, reportDrafts], + [transaction?.participants, iouType, personalDetails, reportAttributesDerived, privateIsArchivedMap, participantsPolicies, policy, conciergeReportID, reportDrafts], ); const sourceReportID = transaction?.reportID ?? reportID;