Skip to content
3 changes: 3 additions & 0 deletions src/hooks/useExpenseActions.ts
Original file line number Diff line number Diff line change
Expand Up @@ -54,6 +54,7 @@ import type {ValueOf} from 'type-fest';

import {hasSeenTourSelector} from '@selectors/Onboarding';
import passthroughPolicyTagListSelector from '@selectors/PolicyTagList';
import {isDraftReportSelector} from '@selectors/Report';
import {validTransactionDraftsSelector} from '@selectors/TransactionDraft';
import {useRef} from 'react';

Expand Down Expand Up @@ -171,6 +172,7 @@ function useExpenseActions({reportID, isReportInSearch = false, backTo, onDuplic
// Default expense policy / chat
const defaultExpensePolicy = useDefaultExpensePolicy();
const activePolicyExpenseChat = getPolicyExpenseChat(accountID, defaultExpensePolicy?.id);
const [isDraftChatReport] = useOnyx(`${ONYXKEYS.COLLECTION.REPORT_DRAFT}${activePolicyExpenseChat?.reportID}`, {selector: isDraftReportSelector});

// Duplicate detection
const {duplicateTransactions, duplicateTransactionViolations} = useDuplicateTransactionsAndViolations(transactions.map((t) => t.transactionID));
Expand Down Expand Up @@ -276,6 +278,7 @@ function useExpenseActions({reportID, isReportInSearch = false, backTo, onDuplic
targetPolicyTags,
currentUser: {accountID: currentUserPersonalDetails?.accountID, email: currentUserPersonalDetails?.email ?? ''},
currentUserLocalCurrency: currentUserPersonalDetails?.localCurrencyCode ?? CONST.CURRENCY.USD,
isDraftChatReport: !!isDraftChatReport,
Comment thread
daledah marked this conversation as resolved.
isTrackIntentUser,
delegateAccountID,
policyTagList,
Expand Down
1 change: 1 addition & 0 deletions src/libs/IOUAmountSubmission.ts
Original file line number Diff line number Diff line change
Expand Up @@ -313,6 +313,7 @@ function submitSkipConfirmationExpense(args: SubmitAmountArgs, ctx: SubmitAmount
if (isTrackExpenseSubmit) {
trackExpense({
report,
parentChatReport: report,
isDraftPolicy: false,
isDraftChatReport: !!isDraftChatReport,
participantParams: {
Expand Down
10 changes: 0 additions & 10 deletions src/libs/ReportUtils.ts
Original file line number Diff line number Diff line change
Expand Up @@ -1284,15 +1284,6 @@ function isReportTotalPending(report: OnyxInputOrEntry<Report>): boolean {
return !!report?.pendingFields?.total;
}

/**
* Check if a report is a draft report
*/
function isDraftReport(reportID: string | undefined): boolean {
const draftReport = deprecatedAllReportsDraft?.[`${ONYXKEYS.COLLECTION.REPORT_DRAFT}${reportID}`];

return !!draftReport;
}

/**
* @private
*/
Expand Down Expand Up @@ -14082,7 +14073,6 @@ export {
getTripIDFromTransactionParentReportID,
buildOptimisticInvoiceReport,
isCurrentUserInvoiceReceiver,
isDraftReport,
changeMoneyRequestHoldStatus,
rejectMoneyRequestReason,
isAdminOwnerApproverOrReportOwner,
Expand Down
4 changes: 4 additions & 0 deletions src/libs/actions/IOU/Duplicate.ts
Original file line number Diff line number Diff line change
Expand Up @@ -752,6 +752,7 @@ type DuplicateExpenseTransactionParams = {
optimisticReportPreviewActionID?: string;
currentUser: CurrentUser;
currentUserLocalCurrency: string | undefined;
isDraftChatReport?: boolean;
isTrackIntentUser: boolean | undefined;
delegateAccountID: number | undefined;
policyTagList: OnyxTypes.PolicyTagLists;
Expand Down Expand Up @@ -781,6 +782,7 @@ function duplicateExpenseTransaction({
optimisticReportPreviewActionID: externalReportPreviewActionID,
currentUser,
currentUserLocalCurrency,
isDraftChatReport,
isTrackIntentUser,
delegateAccountID,
policyTagList,
Expand Down Expand Up @@ -865,7 +867,9 @@ function duplicateExpenseTransaction({
validWaypoints: waypoints,
},
report: undefined,
parentChatReport: targetReport,
isDraftPolicy: false,
isDraftChatReport: !!isDraftChatReport,
currentUser: {accountID: currentUserAccountID, email: currentUserLogin},
introSelected,
quickAction,
Expand Down
4 changes: 4 additions & 0 deletions src/libs/actions/IOU/MoneyRequest.ts
Original file line number Diff line number Diff line change
Expand Up @@ -98,6 +98,7 @@ type CreateTransactionParams = {
optimisticTransactionIDs: string[];
optimisticChatReportID: string | undefined;
currentUserLocalCurrency: string | undefined;
isDraftChatReport?: boolean;
isTrackIntentUser: boolean | undefined;
delegateAccountID: number | undefined;
};
Expand Down Expand Up @@ -128,6 +129,7 @@ function createTransaction({
optimisticTransactionIDs,
optimisticChatReportID,
currentUserLocalCurrency,
isDraftChatReport,
isTrackIntentUser,
delegateAccountID,
}: CreateTransactionParams) {
Expand All @@ -154,7 +156,9 @@ function createTransaction({
if (iouType === CONST.IOU.TYPE.TRACK && report) {
trackExpense({
report,
parentChatReport: report,
isDraftPolicy: false,
isDraftChatReport: !!isDraftChatReport,
existingTransaction: transaction,
participantParams: {
payeeEmail: currentUserEmail,
Expand Down
7 changes: 3 additions & 4 deletions src/libs/actions/IOU/TrackExpense.ts
Original file line number Diff line number Diff line change
Expand Up @@ -49,7 +49,6 @@ import {
getReportOrDraftReport,
getReportRecipientAccountIDs,
getReportTransactions,
isDraftReport,
isHiddenForCurrentUser,
isMoneyRequestReport as isMoneyRequestReportReportUtils,
isPolicyExpenseChat as isPolicyExpenseChatReportUtil,
Expand Down Expand Up @@ -988,8 +987,7 @@ function getTrackExpenseInformation(params: GetTrackExpenseInformationParams): T
);
}

// Check if the report is a draft
const isDraftReportLocal = isDraftChatReport ?? isDraftReport(chatReport?.reportID);
const isDraftReportLocal = isDraftChatReport;
Comment thread
daledah marked this conversation as resolved.

let createdWorkspaceParams: CreateWorkspaceParams | undefined;

Expand Down Expand Up @@ -2394,6 +2392,7 @@ function shareTrackedExpense(trackedExpenseParams: TrackedExpenseParams) {
function trackExpense(params: CreateTrackExpenseParams) {
const {
report,
parentChatReport: parentChatReportParam,
action,
isDraftPolicy,
participantParams,
Expand Down Expand Up @@ -2454,7 +2453,7 @@ function trackExpense(params: CreateTrackExpenseParams) {
distanceRequestType,
} = transactionData;
const isMoneyRequestReport = isMoneyRequestReportReportUtils(report);
const currentChatReport = isMoneyRequestReport ? getReportOrDraftReport(report?.chatReportID) : report;
const currentChatReport = parentChatReportParam;
const moneyRequestReportID = isMoneyRequestReport ? report?.reportID : '';
const isMovingTransactionFromTrackExpense = isMovingTransactionFromTrackExpenseIOUUtils(action);

Expand Down
4 changes: 2 additions & 2 deletions src/libs/actions/IOU/types/CreateTrackExpenseParams.ts
Original file line number Diff line number Diff line change
Expand Up @@ -18,6 +18,7 @@ type TrackExpenseAccountantParams = {

type CreateTrackExpenseParams = {
report: OnyxEntry<OnyxTypes.Report>;
parentChatReport: OnyxEntry<OnyxTypes.Report>;
isDraftPolicy: boolean;
action?: IOUAction;
participantParams: RequestMoneyParticipantParams;
Expand Down Expand Up @@ -46,8 +47,7 @@ type CreateTrackExpenseParams = {
previousOdometerDraft?: OnyxEntry<OnyxTypes.OdometerDraft>;
delegateAccountID: number | undefined;
reportActionsList: OnyxCollection<OnyxTypes.ReportActions> | undefined;
// TODO: Remove optional (?) once all callers are updated in follow-up PRs of https://github.com/Expensify/App/issues/66414
isDraftChatReport?: boolean;
isDraftChatReport: boolean;
};

export type {CreateTrackExpenseParams, TrackExpenseAccountantParams};
1 change: 1 addition & 0 deletions src/pages/Share/SubmitDetailsPage.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -279,6 +279,7 @@ function SubmitDetailsPage({
if (isSelfDM(report)) {
trackExpense({
report: report ?? {reportID: reportOrAccountID},
parentChatReport: report ?? {reportID: reportOrAccountID},
isDraftPolicy: false,
isDraftChatReport: !!reportDraft,
participantParams: {payeeEmail: currentUserPersonalDetails.login, payeeAccountID: currentUserPersonalDetails.accountID, participant},
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -284,7 +284,9 @@ function handleMoneyRequestStepDistanceNavigation({
executeWrite: (overrides) => {
trackExpense({
report,
parentChatReport: report,
isDraftPolicy: false,
isDraftChatReport: !!reportDraft,
existingTransaction: transaction,
participantParams: {
payeeEmail: currentUserLogin,
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -300,6 +300,7 @@ function ScanSkipConfirmation({report, action, iouType, reportID, transactionID,
optimisticTransactionIDs,
optimisticChatReportID,
currentUserLocalCurrency: currentUserPersonalDetails.localCurrencyCode ?? CONST.CURRENCY.USD,
isDraftChatReport: !!reportDraft,
isTrackIntentUser,
delegateAccountID,
};
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -696,8 +696,9 @@ function useExpenseSubmission(params: UseExpenseSubmissionParams) {
const email = currentUserPersonalDetails.email ?? '';
trackExpenseIOUActions({
report: trackReport,
parentChatReport: isSelfDMDestination ? selfDMReport : currentChatReport,
isDraftPolicy,
isDraftChatReport,
isDraftChatReport: !!isDraftChatReport,
action,
existingTransaction: item,
participantParams: {
Expand Down
15 changes: 15 additions & 0 deletions tests/actions/IOU/MoneyRequestTest.ts
Original file line number Diff line number Diff line change
Expand Up @@ -196,6 +196,21 @@ describe('MoneyRequest', () => {
expect(lastTrackExpenseParams && 'shouldHandleNavigation' in lastTrackExpenseParams).toBeFalsy();
});

it('should pass isDraftChatReport to trackExpense when provided', () => {
createTransaction({
...baseParams,
iouType: CONST.IOU.TYPE.TRACK,
allTransactionDrafts: {},
isDraftChatReport: true,
});

expect(TrackExpense.trackExpense).toHaveBeenCalledWith(
expect.objectContaining({
isDraftChatReport: true,
}),
);
});

it('should call requestMoney for non-TRACK (SEND) iouType', () => {
createTransaction({
...baseParams,
Expand Down
8 changes: 8 additions & 0 deletions tests/actions/IOU/RequestMoneyTest.ts
Original file line number Diff line number Diff line change
Expand Up @@ -1247,7 +1247,9 @@ describe('actions/IOU', () => {
// First create a tracked expense in self DM
trackExpense({
report: selfDMReport,
parentChatReport: selfDMReport,
isDraftPolicy: true,
isDraftChatReport: false,
action: CONST.IOU.ACTION.CREATE,
participantParams: {
payeeEmail: RORY_EMAIL,
Expand Down Expand Up @@ -1306,7 +1308,9 @@ describe('actions/IOU', () => {
mockFetch?.pause?.();
trackExpense({
report: policyExpenseChat,
parentChatReport: policyExpenseChat,
isDraftPolicy: false,
isDraftChatReport: false,
action: CONST.IOU.ACTION.SHARE,
participantParams: {
payeeEmail: RORY_EMAIL,
Expand Down Expand Up @@ -1863,7 +1867,9 @@ describe('actions/IOU', () => {
// Create a tracked expense
trackExpense({
report: selfDMReport,
parentChatReport: selfDMReport,
isDraftPolicy: true,
isDraftChatReport: false,
action: CONST.IOU.ACTION.CREATE,
participantParams: {
payeeEmail: TEST_USER_LOGIN,
Expand Down Expand Up @@ -2702,7 +2708,9 @@ describe('actions/IOU', () => {
// When a track expense is created
trackExpense({
report: {reportID: '123', policyID: 'A'},
parentChatReport: {reportID: '123', policyID: 'A'},
isDraftPolicy: false,
isDraftChatReport: false,
action,
participantParams: {
payeeEmail: RORY_EMAIL,
Expand Down
54 changes: 54 additions & 0 deletions tests/actions/IOUTest/DuplicateTest.ts
Original file line number Diff line number Diff line change
Expand Up @@ -1803,6 +1803,60 @@ describe('actions/Duplicate', () => {
expect(writeSpy).toHaveBeenCalledWith(WRITE_COMMANDS.TRACK_EXPENSE, expect.objectContaining({}), expect.objectContaining({}));
});

it('should pass isDraftChatReport to trackExpense when no targetPolicy is provided', async () => {
const {waypoints, ...restOfComment} = mockTransaction.comment ?? {};
const mockCashExpenseTransaction = {
...mockTransaction,
amount: mockTransaction.amount * -1,
comment: {
...restOfComment,
},
};

await Onyx.clear();

duplicateExpenseTransaction({
transaction: mockCashExpenseTransaction,
optimisticChatReportID: mockOptimisticChatReportID,
optimisticIOUReportID: mockOptimisticIOUReportID,
isASAPSubmitBetaEnabled: mockIsASAPSubmitBetaEnabled,
introSelected: undefined,
quickAction: undefined,
policyRecentlyUsedCurrencies: [],
isSelfTourViewed: false,
customUnitPolicyID: '',
targetPolicy: undefined,
targetPolicyCategories: undefined,
targetReport: undefined,
existingTransactionDraft: undefined,
betas: [CONST.BETAS.ALL],
personalDetails: {},
recentWaypoints: [],
targetPolicyTags,
currentUser: {accountID: RORY_ACCOUNT_ID, email: RORY_EMAIL},
currentUserLocalCurrency: undefined,
isDraftChatReport: true,
isTrackIntentUser: false,
delegateAccountID: undefined,
policyTagList: targetPolicyTags ?? {},
formatPhoneNumber,
});

await waitForBatchedUpdates();

expect(writeSpy).toHaveBeenCalledWith(
WRITE_COMMANDS.TRACK_EXPENSE,
expect.objectContaining({}),
expect.objectContaining({
optimisticData: expect.arrayContaining([
expect.objectContaining({
key: expect.stringContaining(ONYXKEYS.COLLECTION.POLICY),
}),
]),
}),
);
});

it('should call createDistanceRequest for distance transactions', async () => {
const mockDistanceTransaction = {
...mockTransaction,
Expand Down
Loading
Loading