Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
46 changes: 32 additions & 14 deletions src/libs/ReportUtils.ts
Original file line number Diff line number Diff line change
Expand Up @@ -552,6 +552,24 @@ type OptimisticModifiedExpenseReportAction = Pick<
| 'delegateAccountID'
> & {reportID?: string};

type OptimisticMoneyRequestEntities = {
iouReport: Report;
type: ValueOf<typeof CONST.IOU.REPORT_ACTION_TYPE>;
amount: number;
currency: string;
comment: string;
payeeEmail: string;
participants: Participant[];
transactionID: string;
paymentType?: PaymentMethodType;
isSettlingUp?: boolean;
isSendMoneyFlow?: boolean;
isOwnPolicyExpenseChat?: boolean;
isPersonalTrackingExpense?: boolean;
existingTransactionThreadReportID?: string;
linkedTrackedExpenseReportAction?: ReportAction;
};

type OptimisticTaskReport = SetRequired<
Pick<
Report,
Expand Down Expand Up @@ -6944,23 +6962,23 @@ function buildTransactionThread(
* 4. Transaction Thread linked to the IOU action via `parentReportActionID`
* 5. CREATED action for the Transaction Thread
*/
function buildOptimisticMoneyRequestEntities(
iouReport: Report,
type: ValueOf<typeof CONST.IOU.REPORT_ACTION_TYPE>,
amount: number,
currency: string,
comment: string,
payeeEmail: string,
participants: Participant[],
transactionID: string,
paymentType?: PaymentMethodType,
function buildOptimisticMoneyRequestEntities({
iouReport,
type,
amount,
currency,
comment,
payeeEmail,
participants,
transactionID,
paymentType,
isSettlingUp = false,
isSendMoneyFlow = false,
isOwnPolicyExpenseChat = false,
isPersonalTrackingExpense?: boolean,
existingTransactionThreadReportID?: string,
linkedTrackedExpenseReportAction?: ReportAction,
): [OptimisticCreatedReportAction, OptimisticCreatedReportAction, OptimisticIOUReportAction, OptimisticChatReport, OptimisticCreatedReportAction | null] {
isPersonalTrackingExpense,
existingTransactionThreadReportID,
linkedTrackedExpenseReportAction,
}: OptimisticMoneyRequestEntities): [OptimisticCreatedReportAction, OptimisticCreatedReportAction, OptimisticIOUReportAction, OptimisticChatReport, OptimisticCreatedReportAction | null] {
const createdActionForChat = buildOptimisticCreatedReportAction(payeeEmail);

// The `CREATED` action must be optimistically generated before the IOU action so that it won't appear after the IOU action in the chat.
Expand Down
129 changes: 56 additions & 73 deletions src/libs/actions/IOU.ts
Original file line number Diff line number Diff line change
Expand Up @@ -2693,20 +2693,16 @@ function getSendInvoiceInformation(
optimisticInvoiceReport.parentReportActionID = reportPreviewAction.reportActionID;
chatReport.lastVisibleActionCreated = reportPreviewAction.created;
const [optimisticCreatedActionForChat, optimisticCreatedActionForIOUReport, iouAction, optimisticTransactionThread, optimisticCreatedActionForTransactionThread] =
buildOptimisticMoneyRequestEntities(
optimisticInvoiceReport,
CONST.IOU.REPORT_ACTION_TYPE.CREATE,
buildOptimisticMoneyRequestEntities({
iouReport: optimisticInvoiceReport,
type: CONST.IOU.REPORT_ACTION_TYPE.CREATE,
amount,
currency,
trimmedComment,
receiver.login ?? '',
[receiver],
optimisticTransaction.transactionID,
undefined,
false,
false,
false,
);
comment: trimmedComment,
payeeEmail: receiver.login ?? '',
participants: [receiver],
transactionID: optimisticTransaction.transactionID,
});

// STEP 6: Build Onyx Data
const [optimisticData, successData, failureData] = buildOnyxDataForInvoice({
Expand Down Expand Up @@ -2860,23 +2856,20 @@ function getMoneyRequestInformation(moneyRequestInformation: MoneyRequestInforma
// 5. REPORT_PREVIEW action for the chatReport
// Note: The CREATED action for the IOU report must be optimistically generated before the IOU action so there's no chance that it appears after the IOU action in the chat
const [optimisticCreatedActionForChat, optimisticCreatedActionForIOUReport, iouAction, optimisticTransactionThread, optimisticCreatedActionForTransactionThread] =
buildOptimisticMoneyRequestEntities(
buildOptimisticMoneyRequestEntities({
iouReport,
CONST.IOU.REPORT_ACTION_TYPE.CREATE,
type: CONST.IOU.REPORT_ACTION_TYPE.CREATE,
amount,
currency,
comment,
payeeEmail,
[participant],
optimisticTransaction.transactionID,
isSelectedManagerMcTest(participant.login) ? CONST.IOU.PAYMENT_TYPE.ELSEWHERE : undefined,
false,
false,
false,
undefined,
linkedTrackedExpenseReportAction?.childReportID,
participants: [participant],
transactionID: optimisticTransaction.transactionID,
paymentType: isSelectedManagerMcTest(participant.login) ? CONST.IOU.PAYMENT_TYPE.ELSEWHERE : undefined,

existingTransactionThreadReportID: linkedTrackedExpenseReportAction?.childReportID,
linkedTrackedExpenseReportAction,
);
});

let reportPreviewAction = shouldCreateNewMoneyRequestReport ? null : getReportPreviewAction(chatReport.reportID, iouReport.reportID);

Expand Down Expand Up @@ -3102,20 +3095,16 @@ function getPerDiemExpenseInformation(perDiemExpenseInformation: PerDiemExpenseI
// 5. REPORT_PREVIEW action for the chatReport
// Note: The CREATED action for the IOU report must be optimistically generated before the IOU action so there's no chance that it appears after the IOU action in the chat
const [optimisticCreatedActionForChat, optimisticCreatedActionForIOUReport, iouAction, optimisticTransactionThread, optimisticCreatedActionForTransactionThread] =
buildOptimisticMoneyRequestEntities(
buildOptimisticMoneyRequestEntities({
iouReport,
CONST.IOU.REPORT_ACTION_TYPE.CREATE,
type: CONST.IOU.REPORT_ACTION_TYPE.CREATE,
amount,
currency,
comment,
payeeEmail,
[participant],
optimisticTransaction.transactionID,
undefined,
false,
false,
false,
);
participants: [participant],
transactionID: optimisticTransaction.transactionID,
});

let reportPreviewAction = shouldCreateNewMoneyRequestReport ? null : getReportPreviewAction(chatReport.reportID, iouReport.reportID);

Expand Down Expand Up @@ -3334,23 +3323,19 @@ function getTrackExpenseInformation(params: GetTrackExpenseInformationParams): T
// 2. IOU action for the iouReport (if tracking in the Expense chat), otherwise – for chatReport
// 3. The transaction thread, which requires the iouAction, and CREATED action for the transaction thread
// 4. REPORT_PREVIEW action for the chatReport (if tracking in the Expense chat)
const [, optimisticCreatedActionForIOUReport, iouAction, optimisticTransactionThread, optimisticCreatedActionForTransactionThread] = buildOptimisticMoneyRequestEntities(
shouldUseMoneyReport && iouReport ? iouReport : chatReport,
CONST.IOU.REPORT_ACTION_TYPE.TRACK,
const [, optimisticCreatedActionForIOUReport, iouAction, optimisticTransactionThread, optimisticCreatedActionForTransactionThread] = buildOptimisticMoneyRequestEntities({
iouReport: shouldUseMoneyReport && iouReport ? iouReport : chatReport,
type: CONST.IOU.REPORT_ACTION_TYPE.TRACK,
amount,
currency,
comment,
payeeEmail,
[participant],
optimisticTransaction.transactionID,
undefined,
false,
false,
false,
!shouldUseMoneyReport,
linkedTrackedExpenseReportAction?.childReportID,
participants: [participant],
transactionID: optimisticTransaction.transactionID,
isPersonalTrackingExpense: !shouldUseMoneyReport,
existingTransactionThreadReportID: linkedTrackedExpenseReportAction?.childReportID,
linkedTrackedExpenseReportAction,
);
});

let reportPreviewAction: OnyxInputValue<OnyxTypes.ReportAction<typeof CONST.REPORT.ACTIONS.TYPE.REPORT_PREVIEW>> = null;
if (shouldUseMoneyReport && iouReport) {
Expand Down Expand Up @@ -5511,16 +5496,16 @@ function createSplitsAndOnyxData({
// 4. Transaction Thread and the CREATED action for it
// 5. REPORT_PREVIEW action for the chatReport
const [oneOnOneCreatedActionForChat, oneOnOneCreatedActionForIOU, oneOnOneIOUAction, optimisticTransactionThread, optimisticCreatedActionForTransactionThread] =
buildOptimisticMoneyRequestEntities(
oneOnOneIOUReport,
CONST.IOU.REPORT_ACTION_TYPE.CREATE,
splitAmount,
buildOptimisticMoneyRequestEntities({
iouReport: oneOnOneIOUReport,
type: CONST.IOU.REPORT_ACTION_TYPE.CREATE,
amount: splitAmount,
currency,
comment,
currentUserEmailForIOUSplit,
[participant],
oneOnOneTransaction.transactionID,
);
payeeEmail: currentUserEmailForIOUSplit,
participants: [participant],
transactionID: oneOnOneTransaction.transactionID,
});

// Add optimistic personal details for new participants
const oneOnOnePersonalDetailListAction: OnyxTypes.PersonalDetailsList = shouldCreateOptimisticPersonalDetails
Expand Down Expand Up @@ -6289,17 +6274,16 @@ function completeSplitBill(
});

const [oneOnOneCreatedActionForChat, oneOnOneCreatedActionForIOU, oneOnOneIOUAction, optimisticTransactionThread, optimisticCreatedActionForTransactionThread] =
buildOptimisticMoneyRequestEntities(
oneOnOneIOUReport,
CONST.IOU.REPORT_ACTION_TYPE.CREATE,
splitAmount,
currency ?? '',
parsedComment,
currentUserEmailForIOUSplit,
[participant],
oneOnOneTransaction.transactionID,
undefined,
);
buildOptimisticMoneyRequestEntities({
iouReport: oneOnOneIOUReport,
type: CONST.IOU.REPORT_ACTION_TYPE.CREATE,
amount: splitAmount,
currency: currency ?? '',
comment: parsedComment,
payeeEmail: currentUserEmailForIOUSplit,
participants: [participant],
transactionID: oneOnOneTransaction.transactionID,
});

let oneOnOneReportPreviewAction = getReportPreviewAction(oneOnOneChatReport?.reportID, oneOnOneIOUReport?.reportID);
if (oneOnOneReportPreviewAction) {
Expand Down Expand Up @@ -7384,19 +7368,18 @@ function getSendMoneyParams(
};

const [optimisticCreatedActionForChat, optimisticCreatedActionForIOUReport, optimisticIOUReportAction, optimisticTransactionThread, optimisticCreatedActionForTransactionThread] =
buildOptimisticMoneyRequestEntities(
optimisticIOUReport,
CONST.IOU.REPORT_ACTION_TYPE.PAY,
buildOptimisticMoneyRequestEntities({
iouReport: optimisticIOUReport,
type: CONST.IOU.REPORT_ACTION_TYPE.PAY,
amount,
currency,
comment,
recipientEmail,
[recipient],
optimisticTransaction.transactionID,
paymentMethodType,
false,
true,
);
payeeEmail: recipientEmail,
participants: [recipient],
transactionID: optimisticTransaction.transactionID,
paymentType: paymentMethodType,
isSendMoneyFlow: true,
});

const reportPreviewAction = buildOptimisticReportPreview(chatReport, optimisticIOUReport);

Expand Down