Skip to content
Merged
Original file line number Diff line number Diff line change
Expand Up @@ -637,4 +637,11 @@ function MoneyRequestParticipantsSelector({

MoneyRequestParticipantsSelector.displayName = 'MoneyRequestParticipantsSelector';

export default memo(MoneyRequestParticipantsSelector, (prevProps, nextProps) => deepEqual(prevProps.participants, nextProps.participants) && prevProps.iouType === nextProps.iouType);
export default memo(
MoneyRequestParticipantsSelector,
(prevProps, nextProps) =>
deepEqual(prevProps.participants, nextProps.participants) &&
prevProps.iouType === nextProps.iouType &&
prevProps.onParticipantsAdded === nextProps.onParticipantsAdded &&
prevProps.onFinish === nextProps.onFinish,
);
51 changes: 33 additions & 18 deletions src/pages/iou/request/step/IOURequestStepParticipants.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -40,6 +40,7 @@ import type SCREENS from '@src/SCREENS';
import type {Policy} from '@src/types/onyx';
import type {Participant} from '@src/types/onyx/IOU';
import type Transaction from '@src/types/onyx/Transaction';
import getEmptyArray from '@src/types/utils/getEmptyArray';
import KeyboardUtils from '@src/utils/keyboard';
import StepScreenWrapper from './StepScreenWrapper';
import type {WithFullTransactionOrNotFoundProps} from './withFullTransactionOrNotFound';
Expand Down Expand Up @@ -124,6 +125,8 @@ function IOURequestStepParticipants({

const isAndroidNative = getPlatform() === CONST.PLATFORM.ANDROID;
const isMobileSafari = isMobileSafariBrowser();
const isPerDiem = isPerDiemRequest(initialTransaction);
const isCorporateCard = isCorporateCardTransaction(initialTransaction);

useEffect(() => {
Performance.markEnd(CONST.TIMING.OPEN_CREATE_EXPENSE_CONTACT);
Expand Down Expand Up @@ -208,19 +211,33 @@ function IOURequestStepParticipants({
const firstParticipantReportID = val.at(0)?.reportID;
const isInvoice = iouType === CONST.IOU.TYPE.INVOICE && isInvoiceRoomWithID(firstParticipantReportID);
numberOfParticipants.current = val.length;
transactions.forEach((transaction) => {
setMoneyRequestParticipants(transaction.transactionID, val);
});

// Use transactions array if available, otherwise use initialTransactionID directly
// This handles the case where initialTransaction hasn't loaded yet but we still need to set participants
if (transactions.length > 0) {
transactions.forEach((transaction) => {
setMoneyRequestParticipants(transaction.transactionID, val);
});
} else {
// Fallback to using initialTransactionID directly when transaction object isn't loaded yet
setMoneyRequestParticipants(initialTransactionID, val);
}

if (!isMovingTransactionFromTrackExpense) {
// If not moving the transaction from track expense, select the default rate automatically.
// Otherwise, keep the original p2p rate and let the user manually change it to the one they want from the workspace.
const isPolicyExpenseChat = !!firstParticipant?.isPolicyExpenseChat;
const policy = isPolicyExpenseChat && firstParticipant?.policyID ? allPolicies?.[`${ONYXKEYS.COLLECTION.POLICY}${firstParticipant.policyID}`] : undefined;
const rateID = DistanceRequestUtils.getCustomUnitRateID({reportID: firstParticipantReportID, isPolicyExpenseChat, policy, lastSelectedDistanceRates});
transactions.forEach((transaction) => {
setCustomUnitRateID(transaction.transactionID, rateID);
});

if (transactions.length > 0) {
transactions.forEach((transaction) => {
setCustomUnitRateID(transaction.transactionID, rateID);
});
} else {
// Fallback to using initialTransactionID directly
setCustomUnitRateID(initialTransactionID, rateID);
}
}

// When multiple valid participants are selected, the reportID is generated at the end of the confirmation step.
Expand All @@ -239,7 +256,7 @@ function IOURequestStepParticipants({
// eslint-disable-next-line @typescript-eslint/prefer-nullish-coalescing
selectedReportID.current = firstParticipantReportID || generateReportID();
},
[iouType, transactions, isMovingTransactionFromTrackExpense, reportID, trackExpense, allPolicies, lastSelectedDistanceRates],
[iouType, transactions, isMovingTransactionFromTrackExpense, reportID, trackExpense, allPolicies, lastSelectedDistanceRates, initialTransactionID],
);

const goToNextStep = useCallback(() => {
Expand Down Expand Up @@ -344,17 +361,15 @@ function IOURequestStepParticipants({
message={translate('quickAction.noLongerHaveReportAccess')}
/>
)}
{transactions.length > 0 && (
<MoneyRequestParticipantsSelector
participants={isSplitRequest ? participants : []}
onParticipantsAdded={addParticipant}
onFinish={goToNextStep}
iouType={iouType}
action={action}
isPerDiemRequest={isPerDiemRequest(initialTransaction)}
isCorporateCardTransaction={isCorporateCardTransaction(initialTransaction)}
/>
)}
<MoneyRequestParticipantsSelector
participants={isSplitRequest ? participants : getEmptyArray()}
onParticipantsAdded={addParticipant}
onFinish={goToNextStep}
iouType={iouType}
action={action}
isPerDiemRequest={isPerDiem}
isCorporateCardTransaction={isCorporateCard}
/>
</StepScreenWrapper>
);
}
Expand Down
Loading