Skip to content

Commit 5c1a600

Browse files
authored
Merge pull request Expensify#65898 from callstack-internal/fix/65849-fix-changing-participant-to-self-dm
fix selfDM assigning
2 parents 4ac09ee + 45213be commit 5c1a600

5 files changed

Lines changed: 70 additions & 35 deletions

File tree

src/libs/actions/IOU.ts

Lines changed: 6 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -10558,10 +10558,14 @@ function getMoneyRequestParticipantsFromReport(report: OnyxEntry<OnyxTypes.Repor
1055810558
* Sets the participants for an IOU based on the attached report
1055910559
* @param transactionID of the transaction to set the participants of
1056010560
* @param report attached to the transaction
10561+
* @param participantsAutoAssigned whether participants were auto assigned
1056110562
*/
10562-
function setMoneyRequestParticipantsFromReport(transactionID: string, report: OnyxEntry<OnyxTypes.Report>) {
10563+
function setMoneyRequestParticipantsFromReport(transactionID: string, report: OnyxEntry<OnyxTypes.Report>, participantsAutoAssigned = true) {
1056310564
const participants = getMoneyRequestParticipantsFromReport(report);
10564-
return Onyx.merge(`${ONYXKEYS.COLLECTION.TRANSACTION_DRAFT}${transactionID}`, {participants, participantsAutoAssigned: true});
10565+
return Onyx.merge(`${ONYXKEYS.COLLECTION.TRANSACTION_DRAFT}${transactionID}`, {
10566+
participants,
10567+
participantsAutoAssigned,
10568+
});
1056510569
}
1056610570

1056710571
function setMoneyRequestTaxRate(transactionID: string, taxCode: string | null) {

src/pages/iou/request/step/IOURequestStepConfirmation.tsx

Lines changed: 9 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -317,8 +317,15 @@ function IOURequestStepConfirmation({
317317
if (transaction?.isFromGlobalCreate && !transaction.receipt?.isTestReceipt) {
318318
// If the participants weren't automatically added to the transaction, then we should go back to the IOURequestStepParticipants.
319319
if (!transaction?.participantsAutoAssigned && participantsAutoAssignedFromRoute !== 'true') {
320-
// eslint-disable-next-line @typescript-eslint/prefer-nullish-coalescing
321-
Navigation.goBack(ROUTES.MONEY_REQUEST_STEP_PARTICIPANTS.getRoute(iouType, initialTransactionID, transaction?.reportID || reportID, undefined, action), {
320+
// TODO: temporary fix for multi-files dnd; check if other flow can use reportID instead of transaction?.reportID
321+
const shouldUseNewScanFlow = isBetaEnabled(CONST.BETAS.NEWDOT_MULTI_FILES_DRAG_AND_DROP) && (iouType === CONST.IOU.TYPE.TRACK || iouType === CONST.IOU.TYPE.SUBMIT);
322+
const backToReportID =
323+
shouldUseNewScanFlow && !transaction?.participants?.at(0)?.isPolicyExpenseChat
324+
? reportID
325+
: // eslint-disable-next-line @typescript-eslint/prefer-nullish-coalescing
326+
transaction?.reportID || reportID;
327+
const iouTypeForRoute = shouldUseNewScanFlow ? CONST.IOU.TYPE.CREATE : iouType;
328+
Navigation.goBack(ROUTES.MONEY_REQUEST_STEP_PARTICIPANTS.getRoute(iouTypeForRoute, initialTransactionID, backToReportID, undefined, action), {
322329
compareParams: false,
323330
});
324331
return;

src/pages/iou/request/step/IOURequestStepParticipants.tsx

Lines changed: 12 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,7 @@ import React, {useCallback, useEffect, useMemo, useRef} from 'react';
33
import FormHelpMessage from '@components/FormHelpMessage';
44
import useLocalize from '@hooks/useLocalize';
55
import useOnyx from '@hooks/useOnyx';
6+
import usePermissions from '@hooks/usePermissions';
67
import useThemeStyles from '@hooks/useThemeStyles';
78
import {setTransactionReport} from '@libs/actions/Transaction';
89
import {READ_COMMANDS} from '@libs/API/types';
@@ -13,7 +14,9 @@ import HttpUtils from '@libs/HttpUtils';
1314
import {isMovingTransactionFromTrackExpense as isMovingTransactionFromTrackExpenseIOUUtils, navigateToStartMoneyRequestStep} from '@libs/IOUUtils';
1415
import Navigation from '@libs/Navigation/Navigation';
1516
import Performance from '@libs/Performance';
17+
import {isPaidGroupPolicy} from '@libs/PolicyUtils';
1618
import {findSelfDMReportID, generateReportID, isInvoiceRoomWithID} from '@libs/ReportUtils';
19+
import {shouldRestrictUserBillableActions} from '@libs/SubscriptionUtils';
1720
import {getRequestType, isPerDiemRequest} from '@libs/TransactionUtils';
1821
import MoneyRequestParticipantsSelector from '@pages/iou/request/MoneyRequestParticipantsSelector';
1922
import {
@@ -93,6 +96,13 @@ function IOURequestStepParticipants({
9396

9497
const selfDMReportID = useMemo(() => findSelfDMReportID(), []);
9598
const [selfDMReport] = useOnyx(`${ONYXKEYS.COLLECTION.REPORT}${selfDMReportID}`, {canBeMissing: true});
99+
const [activePolicyID] = useOnyx(ONYXKEYS.NVP_ACTIVE_POLICY_ID, {canBeMissing: false});
100+
const [activePolicy] = useOnyx(`${ONYXKEYS.COLLECTION.POLICY}${activePolicyID}`, {canBeMissing: true});
101+
102+
const {isBetaEnabled} = usePermissions();
103+
104+
const isActivePolicyRequest =
105+
iouType === CONST.IOU.TYPE.CREATE && isPaidGroupPolicy(activePolicy) && activePolicy?.isPolicyExpenseChatEnabled && !shouldRestrictUserBillableActions(activePolicy.id);
96106

97107
const isAndroidNative = getPlatform() === CONST.PLATFORM.ANDROID;
98108
const isMobileSafari = isMobileSafariBrowser();
@@ -150,7 +160,8 @@ function IOURequestStepParticipants({
150160
const rateID = DistanceRequestUtils.getCustomUnitRateID(selfDMReportID);
151161
transactions.forEach((transaction) => {
152162
setCustomUnitRateID(transaction.transactionID, rateID);
153-
setMoneyRequestParticipantsFromReport(transaction.transactionID, selfDMReport);
163+
const shouldSetParticipantAutoAssignment = isBetaEnabled(CONST.BETAS.NEWDOT_MULTI_FILES_DRAG_AND_DROP) && iouType === CONST.IOU.TYPE.CREATE;
164+
setMoneyRequestParticipantsFromReport(transaction.transactionID, selfDMReport, shouldSetParticipantAutoAssignment ? isActivePolicyRequest : true);
154165
});
155166
const iouConfirmationPageRoute = ROUTES.MONEY_REQUEST_STEP_CONFIRMATION.getRoute(action, CONST.IOU.TYPE.TRACK, initialTransactionID, selfDMReportID);
156167
waitForKeyboardDismiss(() => {

src/pages/iou/request/step/IOURequestStepScan/index.native.tsx

Lines changed: 21 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -44,7 +44,7 @@ import Log from '@libs/Log';
4444
import Navigation from '@libs/Navigation/Navigation';
4545
import {getManagerMcTestParticipant, getParticipantsOption, getReportOption} from '@libs/OptionsListUtils';
4646
import {isPaidGroupPolicy} from '@libs/PolicyUtils';
47-
import {generateReportID, getPolicyExpenseChat, isArchivedReport, isPolicyExpenseChat} from '@libs/ReportUtils';
47+
import {findSelfDMReportID, generateReportID, getPolicyExpenseChat, isArchivedReport, isPolicyExpenseChat} from '@libs/ReportUtils';
4848
import {shouldRestrictUserBillableActions} from '@libs/SubscriptionUtils';
4949
import {getDefaultTaxCode} from '@libs/TransactionUtils';
5050
import StepScreenWrapper from '@pages/iou/request/step/StepScreenWrapper';
@@ -134,6 +134,8 @@ function IOURequestStepScan({
134134

135135
const shouldAcceptMultipleFiles = isBetaEnabled(CONST.BETAS.NEWDOT_MULTI_FILES_DRAG_AND_DROP) && !isEditing && !backTo;
136136

137+
const selfDMReportID = useMemo(() => findSelfDMReportID(), []);
138+
137139
const blinkOpacity = useSharedValue(0);
138140
const blinkStyle = useAnimatedStyle(() => ({
139141
opacity: blinkOpacity.get(),
@@ -446,14 +448,24 @@ function IOURequestStepScan({
446448

447449
// If there was no reportID, then that means the user started this flow from the global + menu
448450
// and an optimistic reportID was generated. In that case, the next step is to select the participants for this expense.
449-
const activePolicyExpenseChat = getPolicyExpenseChat(currentUserPersonalDetails.accountID, activePolicy?.id);
450-
if (
451-
(!initialTransaction?.participants || initialTransaction?.participants?.at(0)?.reportID === activePolicyExpenseChat?.reportID) &&
452-
iouType === CONST.IOU.TYPE.CREATE &&
453-
isPaidGroupPolicy(activePolicy) &&
454-
activePolicy?.isPolicyExpenseChatEnabled &&
455-
!shouldRestrictUserBillableActions(activePolicy.id)
456-
) {
451+
if (iouType === CONST.IOU.TYPE.CREATE && isPaidGroupPolicy(activePolicy) && activePolicy?.isPolicyExpenseChatEnabled && !shouldRestrictUserBillableActions(activePolicy.id)) {
452+
const activePolicyExpenseChat = getPolicyExpenseChat(currentUserPersonalDetails.accountID, activePolicy?.id);
453+
454+
// If the initial transaction has different participants selected that means that the user has changed the participant in the confirmation step
455+
if (initialTransaction?.participants && initialTransaction?.participants?.at(0)?.reportID !== activePolicyExpenseChat?.reportID) {
456+
const isTrackExpense = initialTransaction?.participants?.at(0)?.reportID === selfDMReportID;
457+
458+
const setParticipantsPromises = files.map((receiptFile) => setMoneyRequestParticipants(receiptFile.transactionID, initialTransaction?.participants));
459+
Promise.all(setParticipantsPromises).then(() => {
460+
if (isTrackExpense) {
461+
Navigation.navigate(ROUTES.MONEY_REQUEST_STEP_CONFIRMATION.getRoute(CONST.IOU.ACTION.CREATE, CONST.IOU.TYPE.TRACK, initialTransactionID, selfDMReportID));
462+
} else {
463+
navigateToConfirmationPage(iouType === CONST.IOU.TYPE.CREATE, initialTransaction?.reportID);
464+
}
465+
});
466+
return;
467+
}
468+
457469
const setParticipantsPromises = files.map((receiptFile) => setMoneyRequestParticipantsFromReport(receiptFile.transactionID, activePolicyExpenseChat));
458470
Promise.all(setParticipantsPromises).then(() =>
459471
Navigation.navigate(
@@ -466,12 +478,6 @@ function IOURequestStepScan({
466478
),
467479
);
468480
} else {
469-
// If the initial transaction already has the participants selected, then we can skip the participants step and go straight to the confirmation step.
470-
if (initialTransaction?.participants && initialTransaction?.participants.length > 0) {
471-
const setParticipantsPromises = files.map((receiptFile) => setMoneyRequestParticipants(receiptFile.transactionID, initialTransaction?.participants));
472-
Promise.all(setParticipantsPromises).then(() => navigateToConfirmationPage(false, initialTransaction?.reportID));
473-
return;
474-
}
475481
navigateToParticipantPage(iouType, initialTransactionID, reportID);
476482
}
477483
},

src/pages/iou/request/step/IOURequestStepScan/index.tsx

Lines changed: 22 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -44,7 +44,7 @@ import Log from '@libs/Log';
4444
import Navigation from '@libs/Navigation/Navigation';
4545
import {getManagerMcTestParticipant, getParticipantsOption, getReportOption} from '@libs/OptionsListUtils';
4646
import {isPaidGroupPolicy} from '@libs/PolicyUtils';
47-
import {generateReportID, getPolicyExpenseChat, isArchivedReport, isPolicyExpenseChat} from '@libs/ReportUtils';
47+
import {findSelfDMReportID, generateReportID, getPolicyExpenseChat, isArchivedReport, isPolicyExpenseChat} from '@libs/ReportUtils';
4848
import {shouldRestrictUserBillableActions} from '@libs/SubscriptionUtils';
4949
import {getDefaultTaxCode, hasReceipt} from '@libs/TransactionUtils';
5050
import ReceiptDropUI from '@pages/iou/ReceiptDropUI';
@@ -142,6 +142,8 @@ function IOURequestStepScan({
142142
const canUseMultiDragAndDrop = isBetaEnabled(CONST.BETAS.NEWDOT_MULTI_FILES_DRAG_AND_DROP);
143143
const shouldAcceptMultipleFiles = canUseMultiDragAndDrop && !isEditing && !backTo;
144144

145+
const selfDMReportID = useMemo(() => findSelfDMReportID(), []);
146+
145147
const blinkOpacity = useSharedValue(0);
146148
const blinkStyle = useAnimatedStyle(() => ({
147149
opacity: blinkOpacity.get(),
@@ -505,14 +507,24 @@ function IOURequestStepScan({
505507

506508
// If there was no reportID, then that means the user started this flow from the global + menu
507509
// and an optimistic reportID was generated. In that case, the next step is to select the participants for this expense.
508-
const activePolicyExpenseChat = getPolicyExpenseChat(currentUserPersonalDetails.accountID, activePolicy?.id);
509-
if (
510-
(!initialTransaction?.participants || initialTransaction?.participants?.at(0)?.reportID === activePolicyExpenseChat?.reportID) &&
511-
iouType === CONST.IOU.TYPE.CREATE &&
512-
isPaidGroupPolicy(activePolicy) &&
513-
activePolicy?.isPolicyExpenseChatEnabled &&
514-
!shouldRestrictUserBillableActions(activePolicy.id)
515-
) {
510+
if (iouType === CONST.IOU.TYPE.CREATE && isPaidGroupPolicy(activePolicy) && activePolicy?.isPolicyExpenseChatEnabled && !shouldRestrictUserBillableActions(activePolicy.id)) {
511+
const activePolicyExpenseChat = getPolicyExpenseChat(currentUserPersonalDetails.accountID, activePolicy?.id);
512+
513+
// If the initial transaction has different participants selected that means that the user has changed the participant in the confirmation step
514+
if (initialTransaction?.participants && initialTransaction?.participants?.at(0)?.reportID !== activePolicyExpenseChat?.reportID) {
515+
const isTrackExpense = initialTransaction?.participants?.at(0)?.reportID === selfDMReportID;
516+
517+
const setParticipantsPromises = files.map((receiptFile) => setMoneyRequestParticipants(receiptFile.transactionID, initialTransaction?.participants));
518+
Promise.all(setParticipantsPromises).then(() => {
519+
if (isTrackExpense) {
520+
Navigation.navigate(ROUTES.MONEY_REQUEST_STEP_CONFIRMATION.getRoute(CONST.IOU.ACTION.CREATE, CONST.IOU.TYPE.TRACK, initialTransactionID, selfDMReportID));
521+
} else {
522+
navigateToConfirmationPage(iouType === CONST.IOU.TYPE.CREATE, initialTransaction?.reportID);
523+
}
524+
});
525+
return;
526+
}
527+
516528
const setParticipantsPromises = files.map((receiptFile) => setMoneyRequestParticipantsFromReport(receiptFile.transactionID, activePolicyExpenseChat));
517529
Promise.all(setParticipantsPromises).then(() =>
518530
Navigation.navigate(
@@ -525,12 +537,6 @@ function IOURequestStepScan({
525537
),
526538
);
527539
} else {
528-
// If the initial transaction already has the participants selected, then we can skip the participants step and go straight to the confirmation step.
529-
if (initialTransaction?.participants && initialTransaction?.participants.length > 0) {
530-
const setParticipantsPromises = files.map((receiptFile) => setMoneyRequestParticipants(receiptFile.transactionID, initialTransaction?.participants));
531-
Promise.all(setParticipantsPromises).then(() => navigateToConfirmationPage(true, initialTransaction?.reportID));
532-
return;
533-
}
534540
navigateToParticipantPage(iouType, initialTransactionID, reportID);
535541
}
536542
},
@@ -554,6 +560,7 @@ function IOURequestStepScan({
554560
transactionTaxCode,
555561
transactionTaxAmount,
556562
policy,
563+
selfDMReportID,
557564
],
558565
);
559566

0 commit comments

Comments
 (0)