From 570156fbaff290b552e2d78ff7a16f2c0f795aaa Mon Sep 17 00:00:00 2001 From: mkzie2 Date: Wed, 15 Jan 2025 17:07:14 +0700 Subject: [PATCH 1/4] refactor TrackExpense function --- src/libs/actions/IOU.ts | 81 ++++++++++++------- .../iou/request/step/IOURequestStepAmount.tsx | 26 +++--- .../step/IOURequestStepConfirmation.tsx | 56 +++++++------ .../step/IOURequestStepScan/index.native.tsx | 74 +++++++++-------- .../request/step/IOURequestStepScan/index.tsx | 74 +++++++++-------- tests/unit/GoogleTagManagerTest.tsx | 51 ++++++------ 6 files changed, 200 insertions(+), 162 deletions(-) diff --git a/src/libs/actions/IOU.ts b/src/libs/actions/IOU.ts index 0ac396709b07..a590acec5d48 100644 --- a/src/libs/actions/IOU.ts +++ b/src/libs/actions/IOU.ts @@ -402,6 +402,35 @@ type CreateDistanceRequestInformation = { policyParams?: RequestMoneyPolicyParams; }; +type TrackExpenseTransactionParams = { + amount: number; + currency: string; + created: string | undefined; + merchant: string; + comment: string; + receipt?: Receipt; + category?: string; + tag?: string; + taxCode?: string; + taxAmount?: number; + billable?: boolean; + validWaypoints?: WaypointCollection; + gpsPoints?: GPSPoint; + actionableWhisperReportActionID?: string; + linkedTrackedExpenseReportAction?: OnyxTypes.ReportAction; + linkedTrackedExpenseReportID?: string; + customUnitRateID?: string; +}; + +type CreateTrackExpenseParams = { + report: OnyxTypes.Report; + isDraftPolicy: boolean; + action?: IOUAction; + participantParams: RequestMoneyParticipantParams; + policyParams?: RequestMoneyPolicyParams; + transactionParams: TrackExpenseTransactionParams; +}; + let allPersonalDetails: OnyxTypes.PersonalDetailsList = {}; Onyx.connect({ key: ONYXKEYS.PERSONAL_DETAILS_LIST, @@ -4154,34 +4183,30 @@ function sendInvoice( /** * Track an expense */ -function trackExpense( - report: OnyxTypes.Report, - amount: number, - currency: string, - created: string, - merchant: string, - payeeEmail: string | undefined, - payeeAccountID: number, - participant: Participant, - comment: string, - isDraftPolicy: boolean, - receipt?: Receipt, - category?: string, - tag?: string, - taxCode = '', - taxAmount = 0, - billable?: boolean, - policy?: OnyxEntry, - policyTagList?: OnyxEntry, - policyCategories?: OnyxEntry, - gpsPoints?: GPSPoint, - validWaypoints?: WaypointCollection, - action?: IOUAction, - actionableWhisperReportActionID?: string, - linkedTrackedExpenseReportAction?: OnyxTypes.ReportAction, - linkedTrackedExpenseReportID?: string, - customUnitRateID?: string, -) { +function trackExpense(params: CreateTrackExpenseParams) { + const {report, action, isDraftPolicy, participantParams, policyParams: policyData = {}, transactionParams: transactionData} = params; + const {participant, payeeAccountID, payeeEmail} = participantParams; + const {policy, policyCategories, policyTagList} = policyData; + const { + amount, + currency, + created = '', + merchant, + comment, + receipt, + category, + tag, + taxCode = '', + taxAmount = 0, + billable, + gpsPoints, + validWaypoints, + actionableWhisperReportActionID, + linkedTrackedExpenseReportAction, + linkedTrackedExpenseReportID, + customUnitRateID, + } = transactionData; + const isMoneyRequestReport = isMoneyRequestReportReportUtils(report); const currentChatReport = isMoneyRequestReport ? getReportOrDraftReport(report.chatReportID) : report; const moneyRequestReportID = isMoneyRequestReport ? report.reportID : ''; diff --git a/src/pages/iou/request/step/IOURequestStepAmount.tsx b/src/pages/iou/request/step/IOURequestStepAmount.tsx index 4814cd184ddf..776cded37d1b 100644 --- a/src/pages/iou/request/step/IOURequestStepAmount.tsx +++ b/src/pages/iou/request/step/IOURequestStepAmount.tsx @@ -208,18 +208,22 @@ function IOURequestStepAmount({ } if (iouType === CONST.IOU.TYPE.TRACK) { playSound(SOUNDS.DONE); - IOU.trackExpense( + IOU.trackExpense({ report, - backendAmount, - currency ?? 'USD', - transaction?.created ?? '', - CONST.TRANSACTION.PARTIAL_TRANSACTION_MERCHANT, - currentUserPersonalDetails.login, - currentUserPersonalDetails.accountID, - participants.at(0) ?? {}, - '', - false, - ); + isDraftPolicy: false, + participantParams: { + payeeEmail: currentUserPersonalDetails.login, + payeeAccountID: currentUserPersonalDetails.accountID, + participant: participants.at(0) ?? {}, + }, + transactionParams: { + amount: backendAmount, + currency: currency ?? 'USD', + created: transaction?.created, + merchant: CONST.TRANSACTION.PARTIAL_TRANSACTION_MERCHANT, + comment: '', + }, + }); return; } } diff --git a/src/pages/iou/request/step/IOURequestStepConfirmation.tsx b/src/pages/iou/request/step/IOURequestStepConfirmation.tsx index 3c24f317c812..189932394ebc 100644 --- a/src/pages/iou/request/step/IOURequestStepConfirmation.tsx +++ b/src/pages/iou/request/step/IOURequestStepConfirmation.tsx @@ -275,34 +275,40 @@ function IOURequestStepConfirmation({ if (!participant) { return; } - IOU.trackExpense( + IOU.trackExpense({ report, - transaction.amount, - transaction.currency, - transaction.created, - transaction.merchant, - currentUserPersonalDetails.login, - currentUserPersonalDetails.accountID, - participant, - trimmedComment, isDraftPolicy, - receiptObj, - transaction.category, - transaction.tag, - transactionTaxCode, - transactionTaxAmount, - transaction.billable, - policy, - policyTags, - policyCategories, - gpsPoints, - Object.keys(transaction?.comment?.waypoints ?? {}).length ? TransactionUtils.getValidWaypoints(transaction.comment?.waypoints, true) : undefined, action, - transaction.actionableWhisperReportActionID, - transaction.linkedTrackedExpenseReportAction, - transaction.linkedTrackedExpenseReportID, - customUnitRateID, - ); + participantParams: { + payeeEmail: currentUserPersonalDetails.login, + payeeAccountID: currentUserPersonalDetails.accountID, + participant, + }, + policyParams: { + policy, + policyCategories, + policyTagList: policyTags, + }, + transactionParams: { + amount: transaction.amount, + currency: transaction.currency, + created: transaction.created, + merchant: transaction.merchant, + comment: trimmedComment, + receipt: receiptObj, + category: transaction.category, + tag: transaction.tag, + taxCode: transactionTaxCode, + taxAmount: transactionTaxAmount, + billable: transaction.billable, + gpsPoints, + validWaypoints: Object.keys(transaction?.comment?.waypoints ?? {}).length ? TransactionUtils.getValidWaypoints(transaction.comment?.waypoints, true) : undefined, + actionableWhisperReportActionID: transaction.actionableWhisperReportActionID, + linkedTrackedExpenseReportAction: transaction.linkedTrackedExpenseReportAction, + linkedTrackedExpenseReportID: transaction.linkedTrackedExpenseReportID, + customUnitRateID, + }, + }); }, [ report, diff --git a/src/pages/iou/request/step/IOURequestStepScan/index.native.tsx b/src/pages/iou/request/step/IOURequestStepScan/index.native.tsx index 180868c8ca51..cae8b46af6bb 100644 --- a/src/pages/iou/request/step/IOURequestStepScan/index.native.tsx +++ b/src/pages/iou/request/step/IOURequestStepScan/index.native.tsx @@ -246,19 +246,23 @@ function IOURequestStepScan({ const createTransaction = useCallback( (receipt: Receipt, participant: Participant) => { if (iouType === CONST.IOU.TYPE.TRACK && report) { - IOU.trackExpense( + IOU.trackExpense({ report, - 0, - transaction?.currency ?? 'USD', - transaction?.created ?? '', - '', - currentUserPersonalDetails.login, - currentUserPersonalDetails.accountID, - participant, - '', - false, - receipt, - ); + isDraftPolicy: false, + participantParams: { + payeeEmail: currentUserPersonalDetails.login, + payeeAccountID: currentUserPersonalDetails.accountID, + participant, + }, + transactionParams: { + amount: 0, + currency: transaction?.currency ?? 'USD', + created: transaction?.created, + merchant: '', + comment: '', + receipt, + }, + }); } else { IOU.requestMoney({ report, @@ -334,31 +338,31 @@ function IOURequestStepScan({ (successData) => { playSound(SOUNDS.DONE); if (iouType === CONST.IOU.TYPE.TRACK && report) { - IOU.trackExpense( + IOU.trackExpense({ report, - 0, - transaction?.currency ?? 'USD', - transaction?.created ?? '', - '', - currentUserPersonalDetails.login, - currentUserPersonalDetails.accountID, - participant, - '', - false, - receipt, - '', - '', - '', - 0, - false, - policy, - {}, - {}, - { - lat: successData.coords.latitude, - long: successData.coords.longitude, + isDraftPolicy: false, + participantParams: { + payeeEmail: currentUserPersonalDetails.login, + payeeAccountID: currentUserPersonalDetails.accountID, + participant, }, - ); + policyParams: { + policy, + }, + transactionParams: { + amount: 0, + currency: transaction?.currency ?? 'USD', + created: transaction?.created, + merchant: '', + comment: '', + receipt, + billable: false, + gpsPoints: { + lat: successData.coords.latitude, + long: successData.coords.longitude, + }, + }, + }); } else { IOU.requestMoney({ report, diff --git a/src/pages/iou/request/step/IOURequestStepScan/index.tsx b/src/pages/iou/request/step/IOURequestStepScan/index.tsx index 8dbe72d3f9fa..692381d3301f 100644 --- a/src/pages/iou/request/step/IOURequestStepScan/index.tsx +++ b/src/pages/iou/request/step/IOURequestStepScan/index.tsx @@ -271,19 +271,23 @@ function IOURequestStepScan({ const createTransaction = useCallback( (receipt: Receipt, participant: Participant) => { if (iouType === CONST.IOU.TYPE.TRACK && report) { - IOU.trackExpense( + IOU.trackExpense({ report, - 0, - transaction?.currency ?? 'USD', - transaction?.created ?? '', - '', - currentUserPersonalDetails.login, - currentUserPersonalDetails.accountID, - participant, - '', - false, - receipt, - ); + isDraftPolicy: false, + participantParams: { + payeeEmail: currentUserPersonalDetails.login, + payeeAccountID: currentUserPersonalDetails.accountID, + participant, + }, + transactionParams: { + amount: 0, + currency: transaction?.currency ?? 'USD', + created: transaction?.created, + merchant: '', + comment: '', + receipt, + }, + }); } else { IOU.requestMoney({ report, @@ -360,31 +364,31 @@ function IOURequestStepScan({ (successData) => { playSound(SOUNDS.DONE); if (iouType === CONST.IOU.TYPE.TRACK && report) { - IOU.trackExpense( + IOU.trackExpense({ report, - 0, - transaction?.currency ?? 'USD', - transaction?.created ?? '', - '', - currentUserPersonalDetails.login, - currentUserPersonalDetails.accountID, - participant, - '', - false, - receipt, - '', - '', - '', - 0, - false, - policy, - {}, - {}, - { - lat: successData.coords.latitude, - long: successData.coords.longitude, + isDraftPolicy: false, + participantParams: { + payeeEmail: currentUserPersonalDetails.login, + payeeAccountID: currentUserPersonalDetails.accountID, + participant, }, - ); + policyParams: { + policy, + }, + transactionParams: { + amount: 0, + currency: transaction?.currency ?? 'USD', + created: transaction?.created, + merchant: '', + comment: '', + receipt, + billable: false, + gpsPoints: { + lat: successData.coords.latitude, + long: successData.coords.longitude, + }, + }, + }); } else { IOU.requestMoney({ report, diff --git a/tests/unit/GoogleTagManagerTest.tsx b/tests/unit/GoogleTagManagerTest.tsx index dcb6bdea0eec..9a2041634443 100644 --- a/tests/unit/GoogleTagManagerTest.tsx +++ b/tests/unit/GoogleTagManagerTest.tsx @@ -67,34 +67,29 @@ describe('GoogleTagManagerTest', () => { }); test('workspace_created - categorizeTrackedExpense', () => { - // When we categorize a tracked expense with a draft policy - IOU.trackExpense( - {reportID: '123'}, - 1000, - 'USD', - '2024-10-30', - 'merchant', - undefined, - 0, - {accountID}, - 'comment', - true, - undefined, - 'category', - 'tag', - 'taxCode', - 0, - undefined, - undefined, - undefined, - undefined, - undefined, - undefined, - CONST.IOU.ACTION.CATEGORIZE, - 'actionableWhisperReportActionID', - {actionName: 'IOU', reportActionID: 'linkedTrackedExpenseReportAction', created: '2024-10-30'}, - 'linkedTrackedExpenseReportID', - ); + IOU.trackExpense({ + report: {reportID: '123'}, + isDraftPolicy: true, + action: CONST.IOU.ACTION.CATEGORIZE, + participantParams: { + payeeEmail: undefined, + payeeAccountID: 0, + participant: {accountID}, + }, + transactionParams: { + amount: 1000, + currency: 'USD', + created: '2024-10-30', + merchant: 'merchant', + comment: 'comment', + category: 'category', + tag: 'tag', + taxCode: 'taxCode', + actionableWhisperReportActionID: 'actionableWhisperReportActionID', + linkedTrackedExpenseReportAction: {actionName: 'IOU', reportActionID: 'linkedTrackedExpenseReportAction', created: '2024-10-30'}, + linkedTrackedExpenseReportID: 'linkedTrackedExpenseReportID', + }, + }); // Then we publish a workspace_created event only once expect(GoogleTagManager.publishEvent).toBeCalledTimes(1); From 738ab3e396a2e70ba691b22d4ba6c2bea1732307 Mon Sep 17 00:00:00 2001 From: mkzie2 Date: Wed, 15 Jan 2025 21:36:39 +0700 Subject: [PATCH 2/4] update all trackExpense function --- .../request/step/IOURequestStepDistance.tsx | 49 +++--- tests/actions/IOUTest.ts | 156 ++++++++---------- 2 files changed, 94 insertions(+), 111 deletions(-) diff --git a/src/pages/iou/request/step/IOURequestStepDistance.tsx b/src/pages/iou/request/step/IOURequestStepDistance.tsx index 9a136f514a9b..e2855ba32eea 100644 --- a/src/pages/iou/request/step/IOURequestStepDistance.tsx +++ b/src/pages/iou/request/step/IOURequestStepDistance.tsx @@ -322,34 +322,29 @@ function IOURequestStepDistance({ const participant = participants.at(0); if (iouType === CONST.IOU.TYPE.TRACK && participant) { playSound(SOUNDS.DONE); - trackExpense( + trackExpense({ report, - 0, - transaction?.currency ?? 'USD', - transaction?.created ?? '', - translate('iou.fieldPending'), - currentUserPersonalDetails.login, - currentUserPersonalDetails.accountID, - participant, - '', - false, - {}, - '', - '', - '', - 0, - false, - policy, - undefined, - undefined, - undefined, - getValidWaypoints(waypoints, true), - undefined, - undefined, - undefined, - undefined, - customUnitRateID, - ); + isDraftPolicy: false, + participantParams: { + payeeEmail: currentUserPersonalDetails.login, + payeeAccountID: currentUserPersonalDetails.accountID, + participant, + }, + policyParams: { + policy, + }, + transactionParams: { + amount: 0, + currency: transaction?.currency ?? 'USD', + created: transaction?.created ?? '', + merchant: translate('iou.fieldPending'), + comment: '', + receipt: {}, + billable: false, + validWaypoints: getValidWaypoints(waypoints, true), + customUnitRateID, + }, + }); return; } diff --git a/tests/actions/IOUTest.ts b/tests/actions/IOUTest.ts index 291d2d4ac1e3..1d7cb03dcb87 100644 --- a/tests/actions/IOUTest.ts +++ b/tests/actions/IOUTest.ts @@ -190,34 +190,29 @@ describe('actions/IOU', () => { mockFetch?.pause?.(); // When the user submits the transaction to the selfDM report - trackExpense( - selfDMReport, - fakeTransaction.amount, - fakeTransaction.currency, - format(new Date(), CONST.DATE.FNS_FORMAT_STRING), - fakeTransaction.merchant, - participant.login, - participant.accountID, - participant, - '', - true, - undefined, - '', - undefined, - '', - 0, - false, - undefined, - undefined, - undefined, - undefined, - fakeWayPoints, - CONST.IOU.ACTION.CREATE, - fakeTransaction?.actionableWhisperReportActionID, - fakeTransaction?.linkedTrackedExpenseReportAction, - fakeTransaction?.linkedTrackedExpenseReportID, - CONST.CUSTOM_UNITS.FAKE_P2P_ID, - ); + trackExpense({ + report: selfDMReport, + isDraftPolicy: true, + action: CONST.IOU.ACTION.CREATE, + participantParams: { + payeeEmail: participant.login, + payeeAccountID: participant.accountID, + participant, + }, + transactionParams: { + amount: fakeTransaction.amount, + currency: fakeTransaction.currency, + created: format(new Date(), CONST.DATE.FNS_FORMAT_STRING), + merchant: fakeTransaction.merchant, + comment: '', + billable: false, + validWaypoints: fakeWayPoints, + actionableWhisperReportActionID: fakeTransaction?.actionableWhisperReportActionID, + linkedTrackedExpenseReportAction: fakeTransaction?.linkedTrackedExpenseReportAction, + linkedTrackedExpenseReportID: fakeTransaction?.linkedTrackedExpenseReportID, + customUnitRateID: CONST.CUSTOM_UNITS.FAKE_P2P_ID, + }, + }); await waitForBatchedUpdates(); await mockFetch?.resume?.(); @@ -283,34 +278,33 @@ describe('actions/IOU', () => { const transactionDraft = allTransactionsDraft?.[`${ONYXKEYS.COLLECTION.TRANSACTION_DRAFT}${transaction?.transactionID}`]; // When the user confirms the category for the tracked expense - trackExpense( - expenseReport, - transactionDraft?.amount ?? fakeTransaction.amount, - transactionDraft?.currency ?? fakeTransaction.currency, - format(new Date(), CONST.DATE.FNS_FORMAT_STRING), - transactionDraft?.merchant ?? fakeTransaction.merchant, - participant.login, - participant.accountID, - {...participant, isPolicyExpenseChat: true}, - '', - false, - undefined, - Object.keys(fakeCategories).at(0) ?? '', - '', - '', - 0, - undefined, - fakePolicy, - undefined, - fakeCategories, - undefined, - Object.keys(transactionDraft?.comment?.waypoints ?? {}).length ? getValidWaypoints(transactionDraft?.comment?.waypoints, true) : undefined, - CONST.IOU.ACTION.CATEGORIZE, - transactionDraft?.actionableWhisperReportActionID, - transactionDraft?.linkedTrackedExpenseReportAction, - transactionDraft?.linkedTrackedExpenseReportID, - CONST.CUSTOM_UNITS.FAKE_P2P_ID, - ); + trackExpense({ + report: expenseReport, + isDraftPolicy: false, + action: CONST.IOU.ACTION.CATEGORIZE, + participantParams: { + payeeEmail: participant.login, + payeeAccountID: participant.accountID, + participant: {...participant, isPolicyExpenseChat: true}, + }, + policyParams: { + policy: fakePolicy, + policyCategories: fakeCategories, + }, + transactionParams: { + amount: transactionDraft?.amount ?? fakeTransaction.amount, + currency: transactionDraft?.currency ?? fakeTransaction.currency, + created: format(new Date(), CONST.DATE.FNS_FORMAT_STRING), + merchant: transactionDraft?.merchant ?? fakeTransaction.merchant, + comment: '', + category: Object.keys(fakeCategories).at(0) ?? '', + validWaypoints: Object.keys(transactionDraft?.comment?.waypoints ?? {}).length ? getValidWaypoints(transactionDraft?.comment?.waypoints, true) : undefined, + actionableWhisperReportActionID: transactionDraft?.actionableWhisperReportActionID, + linkedTrackedExpenseReportAction: transactionDraft?.linkedTrackedExpenseReportAction, + linkedTrackedExpenseReportID: transactionDraft?.linkedTrackedExpenseReportID, + customUnitRateID: CONST.CUSTOM_UNITS.FAKE_P2P_ID, + }, + }); await waitForBatchedUpdates(); await mockFetch?.resume?.(); @@ -4398,37 +4392,31 @@ describe('actions/IOU', () => { [WRITE_COMMANDS.SHARE_TRACKED_EXPENSE, CONST.IOU.ACTION.SHARE], ])('%s', async (expectedCommand: ApiCommand, action: IOUAction) => { // When a track expense is created - trackExpense( - {reportID: ''}, - 10000, - CONST.CURRENCY.USD, - '2024-10-30', - 'KFC', - RORY_EMAIL, - RORY_ACCOUNT_ID, - {login: CARLOS_EMAIL, accountID: CARLOS_ACCOUNT_ID}, - '', - false, - {}, - undefined, - undefined, - undefined, - undefined, - undefined, - undefined, - undefined, - undefined, - undefined, - undefined, + trackExpense({ + report: {reportID: ''}, + isDraftPolicy: false, action, - '1', - { - reportActionID: '', - actionName: CONST.REPORT.ACTIONS.TYPE.IOU, + participantParams: { + payeeEmail: RORY_EMAIL, + payeeAccountID: RORY_ACCOUNT_ID, + participant: {login: CARLOS_EMAIL, accountID: CARLOS_ACCOUNT_ID}, + }, + transactionParams: { + amount: 10000, + currency: CONST.CURRENCY.USD, created: '2024-10-30', + merchant: 'KFC', + comment: '', + receipt: {}, + actionableWhisperReportActionID: '1', + linkedTrackedExpenseReportAction: { + reportActionID: '', + actionName: CONST.REPORT.ACTIONS.TYPE.IOU, + created: '2024-10-30', + }, + linkedTrackedExpenseReportID: '1', }, - '1', - ); + }); await waitForBatchedUpdates(); From c3bd9f11b88dfd305ff8c3f4d6bdc44de755dfd7 Mon Sep 17 00:00:00 2001 From: mkzie2 Date: Thu, 16 Jan 2025 12:27:47 +0700 Subject: [PATCH 3/4] fix lint --- .../iou/request/step/IOURequestStepAmount.tsx | 89 +++++++++------- .../step/IOURequestStepConfirmation.tsx | 100 ++++++++++-------- .../step/IOURequestStepScan/index.native.tsx | 61 ++++++----- .../request/step/IOURequestStepScan/index.tsx | 73 +++++++------ tests/unit/GoogleTagManagerTest.tsx | 18 ++-- 5 files changed, 189 insertions(+), 152 deletions(-) diff --git a/src/pages/iou/request/step/IOURequestStepAmount.tsx b/src/pages/iou/request/step/IOURequestStepAmount.tsx index 776cded37d1b..3aa83a857530 100644 --- a/src/pages/iou/request/step/IOURequestStepAmount.tsx +++ b/src/pages/iou/request/step/IOURequestStepAmount.tsx @@ -6,22 +6,33 @@ import type {BaseTextInputRef} from '@components/TextInput/BaseTextInput/types'; import withCurrentUserPersonalDetails from '@components/withCurrentUserPersonalDetails'; import type {WithCurrentUserPersonalDetailsProps} from '@components/withCurrentUserPersonalDetails'; import useLocalize from '@hooks/useLocalize'; -import * as TransactionEdit from '@libs/actions/TransactionEdit'; -import * as CurrencyUtils from '@libs/CurrencyUtils'; +import { + requestMoney, + resetSplitShares, + sendMoneyElsewhere, + sendMoneyWithWallet, + setDraftSplitTransaction, + setMoneyRequestAmount, + setMoneyRequestParticipantsFromReport, + setMoneyRequestTaxAmount, + setSplitShares, + trackExpense, + updateMoneyRequestAmountAndCurrency, +} from '@libs/actions/IOU'; +import {createDraftTransaction, removeDraftTransaction} from '@libs/actions/TransactionEdit'; +import {convertToBackendAmount, isValidCurrencyCode} from '@libs/CurrencyUtils'; import Navigation from '@libs/Navigation/Navigation'; -import * as OptionsListUtils from '@libs/OptionsListUtils'; -import * as ReportUtils from '@libs/ReportUtils'; +import {getParticipantsOption, getReportOption} from '@libs/OptionsListUtils'; +import {getBankAccountRoute, getTransactionDetails, isArchivedReport, isPolicyExpenseChat} from '@libs/ReportUtils'; import playSound, {SOUNDS} from '@libs/Sound'; -import * as TransactionUtils from '@libs/TransactionUtils'; -import {getRequestType} from '@libs/TransactionUtils'; +import {calculateTaxAmount, getAmount, getCurrency, getDefaultTaxCode, getRequestType, getTaxValue} from '@libs/TransactionUtils'; import MoneyRequestAmountForm from '@pages/iou/MoneyRequestAmountForm'; -import * as IOU from '@userActions/IOU'; import CONST from '@src/CONST'; import ONYXKEYS from '@src/ONYXKEYS'; import ROUTES from '@src/ROUTES'; import type SCREENS from '@src/SCREENS'; -import type * as OnyxTypes from '@src/types/onyx'; import type {PaymentMethodType} from '@src/types/onyx/OriginalMessage'; +import type Transaction from '@src/types/onyx/Transaction'; import {isEmptyObject} from '@src/types/utils/EmptyObject'; import StepScreenWrapper from './StepScreenWrapper'; import withFullTransactionOrNotFound from './withFullTransactionOrNotFound'; @@ -36,7 +47,7 @@ type AmountParams = { type IOURequestStepAmountProps = WithCurrentUserPersonalDetailsProps & WithWritableReportOrNotFoundProps & { /** The transaction object being modified in Onyx */ - transaction: OnyxEntry; + transaction: OnyxEntry; /** Whether the user input should be kept or not */ shouldKeepUserInput?: boolean; @@ -69,9 +80,9 @@ function IOURequestStepAmount({ const isSplitBill = iouType === CONST.IOU.TYPE.SPLIT; const isEditingSplitBill = isEditing && isSplitBill; const currentTransaction = isEditingSplitBill && !isEmptyObject(splitDraftTransaction) ? splitDraftTransaction : transaction; - const {amount: transactionAmount} = ReportUtils.getTransactionDetails(currentTransaction) ?? {amount: 0}; - const {currency: originalCurrency} = ReportUtils.getTransactionDetails(isEditing && !isEmptyObject(draftTransaction) ? draftTransaction : transaction) ?? {currency: CONST.CURRENCY.USD}; - const currency = CurrencyUtils.isValidCurrencyCode(selectedCurrency) ? selectedCurrency : originalCurrency; + const {amount: transactionAmount} = getTransactionDetails(currentTransaction) ?? {amount: 0}; + const {currency: originalCurrency} = getTransactionDetails(isEditing && !isEmptyObject(draftTransaction) ? draftTransaction : transaction) ?? {currency: CONST.CURRENCY.USD}; + const currency = isValidCurrencyCode(selectedCurrency) ? selectedCurrency : originalCurrency; // For quick button actions, we'll skip the confirmation page unless the report is archived or this is a workspace request, as // the user will have to add a merchant. @@ -80,7 +91,7 @@ function IOURequestStepAmount({ return false; } - return !(ReportUtils.isArchivedReport(report, reportNameValuePairs) || ReportUtils.isPolicyExpenseChat(report)); + return !(isArchivedReport(report, reportNameValuePairs) || isPolicyExpenseChat(report)); }, [report, isSplitBill, skipConfirmation, reportNameValuePairs]); useFocusEffect( @@ -102,13 +113,13 @@ function IOURequestStepAmount({ // A temporary solution to not prevent users from editing the currency // We create a backup transaction and use it to save the currency and remove this transaction backup if we don't save the amount // It should be removed after this issue https://github.com/Expensify/App/issues/34607 is fixed - TransactionEdit.createDraftTransaction(isEditingSplitBill && !isEmptyObject(splitDraftTransaction) ? splitDraftTransaction : transaction); + createDraftTransaction(isEditingSplitBill && !isEmptyObject(splitDraftTransaction) ? splitDraftTransaction : transaction); return () => { if (isSaveButtonPressed.current) { return; } - TransactionEdit.removeDraftTransaction(transaction?.transactionID); + removeDraftTransaction(transaction?.transactionID); }; // eslint-disable-next-line react-compiler/react-compiler, react-hooks/exhaustive-deps }, []); @@ -149,14 +160,14 @@ function IOURequestStepAmount({ const navigateToNextPage = ({amount, paymentMethod}: AmountParams) => { isSaveButtonPressed.current = true; - const amountInSmallestCurrencyUnits = CurrencyUtils.convertToBackendAmount(Number.parseFloat(amount)); + const amountInSmallestCurrencyUnits = convertToBackendAmount(Number.parseFloat(amount)); // eslint-disable-next-line @typescript-eslint/prefer-nullish-coalescing - IOU.setMoneyRequestAmount(transactionID, amountInSmallestCurrencyUnits, currency || CONST.CURRENCY.USD, shouldKeepUserInput); + setMoneyRequestAmount(transactionID, amountInSmallestCurrencyUnits, currency || CONST.CURRENCY.USD, shouldKeepUserInput); // Initially when we're creating money request, we do not know the participant and hence if the request is with workspace with tax tracking enabled // So, we reset the taxAmount here and calculate it in the hook in MoneyRequestConfirmationList component - IOU.setMoneyRequestTaxAmount(transactionID, null); + setMoneyRequestTaxAmount(transactionID, null); if (backTo) { Navigation.goBack(backTo); @@ -169,27 +180,27 @@ function IOURequestStepAmount({ // In this case, the participants can be automatically assigned from the report and the user can skip the participants step and go straight // to the confirm step. // If the user is started this flow using the Create expense option (combined submit/track flow), they should be redirected to the participants page. - if (report?.reportID && !ReportUtils.isArchivedReport(report, reportNameValuePairs) && iouType !== CONST.IOU.TYPE.CREATE) { - const selectedParticipants = IOU.setMoneyRequestParticipantsFromReport(transactionID, report); + if (report?.reportID && !isArchivedReport(report, reportNameValuePairs) && iouType !== CONST.IOU.TYPE.CREATE) { + const selectedParticipants = setMoneyRequestParticipantsFromReport(transactionID, report); const participants = selectedParticipants.map((participant) => { const participantAccountID = participant?.accountID ?? CONST.DEFAULT_NUMBER_ID; - return participantAccountID ? OptionsListUtils.getParticipantsOption(participant, personalDetails) : OptionsListUtils.getReportOption(participant); + return participantAccountID ? getParticipantsOption(participant, personalDetails) : getReportOption(participant); }); - const backendAmount = CurrencyUtils.convertToBackendAmount(Number.parseFloat(amount)); + const backendAmount = convertToBackendAmount(Number.parseFloat(amount)); if (shouldSkipConfirmation) { if (iouType === CONST.IOU.TYPE.PAY || iouType === CONST.IOU.TYPE.SEND) { if (paymentMethod && paymentMethod === CONST.IOU.PAYMENT_TYPE.EXPENSIFY) { - IOU.sendMoneyWithWallet(report, backendAmount, currency, '', currentUserPersonalDetails.accountID, participants.at(0) ?? {}); + sendMoneyWithWallet(report, backendAmount, currency, '', currentUserPersonalDetails.accountID, participants.at(0) ?? {}); return; } - IOU.sendMoneyElsewhere(report, backendAmount, currency, '', currentUserPersonalDetails.accountID, participants.at(0) ?? {}); + sendMoneyElsewhere(report, backendAmount, currency, '', currentUserPersonalDetails.accountID, participants.at(0) ?? {}); return; } if (iouType === CONST.IOU.TYPE.SUBMIT || iouType === CONST.IOU.TYPE.REQUEST) { playSound(SOUNDS.DONE); - IOU.requestMoney({ + requestMoney({ report, participantParams: { participant: participants.at(0) ?? {}, @@ -208,7 +219,7 @@ function IOURequestStepAmount({ } if (iouType === CONST.IOU.TYPE.TRACK) { playSound(SOUNDS.DONE); - IOU.trackExpense({ + trackExpense({ report, isDraftPolicy: false, participantParams: { @@ -227,10 +238,10 @@ function IOURequestStepAmount({ return; } } - IOU.setMoneyRequestParticipantsFromReport(transactionID, report); + setMoneyRequestParticipantsFromReport(transactionID, report); if (isSplitBill && !report.isOwnPolicyExpenseChat && report.participants) { const participantAccountIDs = Object.keys(report.participants).map((accountID) => Number(accountID)); - IOU.setSplitShares(transaction, amountInSmallestCurrencyUnits, currency || CONST.CURRENCY.USD, participantAccountIDs); + setSplitShares(transaction, amountInSmallestCurrencyUnits, currency || CONST.CURRENCY.USD, participantAccountIDs); } navigateToConfirmationPage(); return; @@ -242,11 +253,11 @@ function IOURequestStepAmount({ }; const saveAmountAndCurrency = ({amount, paymentMethod}: AmountParams) => { - const newAmount = CurrencyUtils.convertToBackendAmount(Number.parseFloat(amount)); + const newAmount = convertToBackendAmount(Number.parseFloat(amount)); // Edits to the amount from the splits page should reset the split shares. if (transaction?.splitShares) { - IOU.resetSplitShares(transaction, newAmount, currency); + resetSplitShares(transaction, newAmount, currency); } if (!isEditing) { @@ -255,26 +266,26 @@ function IOURequestStepAmount({ } // If the value hasn't changed, don't request to save changes on the server and just close the modal - const transactionCurrency = TransactionUtils.getCurrency(currentTransaction); - if (newAmount === TransactionUtils.getAmount(currentTransaction) && currency === transactionCurrency) { + const transactionCurrency = getCurrency(currentTransaction); + if (newAmount === getAmount(currentTransaction) && currency === transactionCurrency) { navigateBack(); return; } // If currency has changed, then we get the default tax rate based on currency, otherwise we use the current tax rate selected in transaction, if we have it. - const transactionTaxCode = ReportUtils.getTransactionDetails(currentTransaction)?.taxCode; - const defaultTaxCode = TransactionUtils.getDefaultTaxCode(policy, currentTransaction, currency) ?? ''; + const transactionTaxCode = getTransactionDetails(currentTransaction)?.taxCode; + const defaultTaxCode = getDefaultTaxCode(policy, currentTransaction, currency) ?? ''; const taxCode = (currency !== transactionCurrency ? defaultTaxCode : transactionTaxCode) ?? defaultTaxCode; - const taxPercentage = TransactionUtils.getTaxValue(policy, currentTransaction, taxCode) ?? ''; - const taxAmount = CurrencyUtils.convertToBackendAmount(TransactionUtils.calculateTaxAmount(taxPercentage, newAmount, currency ?? CONST.CURRENCY.USD)); + const taxPercentage = getTaxValue(policy, currentTransaction, taxCode) ?? ''; + const taxAmount = convertToBackendAmount(calculateTaxAmount(taxPercentage, newAmount, currency ?? CONST.CURRENCY.USD)); if (isSplitBill) { - IOU.setDraftSplitTransaction(transactionID, {amount: newAmount, currency, taxCode, taxAmount}); + setDraftSplitTransaction(transactionID, {amount: newAmount, currency, taxCode, taxAmount}); navigateBack(); return; } - IOU.updateMoneyRequestAmountAndCurrency({transactionID, transactionThreadReportID: reportID, currency, amount: newAmount, taxAmount, policy, taxCode}); + updateMoneyRequestAmountAndCurrency({transactionID, transactionThreadReportID: reportID, currency, amount: newAmount, taxAmount, policy, taxCode}); navigateBack(); }; @@ -293,7 +304,7 @@ function IOURequestStepAmount({ skipConfirmation={shouldSkipConfirmation ?? false} iouType={iouType} policyID={policy?.id} - bankAccountRoute={ReportUtils.getBankAccountRoute(report)} + bankAccountRoute={getBankAccountRoute(report)} ref={(e) => (textInput.current = e)} shouldKeepUserInput={transaction?.shouldShowOriginalAmount} onCurrencyButtonPress={navigateToCurrencySelectionPage} diff --git a/src/pages/iou/request/step/IOURequestStepConfirmation.tsx b/src/pages/iou/request/step/IOURequestStepConfirmation.tsx index 189932394ebc..c95647747938 100644 --- a/src/pages/iou/request/step/IOURequestStepConfirmation.tsx +++ b/src/pages/iou/request/step/IOURequestStepConfirmation.tsx @@ -15,18 +15,34 @@ import useLocalize from '@hooks/useLocalize'; import useNetwork from '@hooks/useNetwork'; import useThemeStyles from '@hooks/useThemeStyles'; import useWindowDimensions from '@hooks/useWindowDimensions'; +import { + createDistanceRequest as createDistanceRequestFunc, + getIOURequestPolicyID, + navigateToStartStepIfScanFileCannotBeRead, + requestMoney as requestMoneyFunc, + sendInvoice, + sendMoneyElsewhere, + sendMoneyWithWallet, + setMoneyRequestBillable, + setMoneyRequestCategory, + splitBill, + splitBillAndOpenReport, + startSplitBill, + trackExpense as trackExpenseFunc, + updateLastLocationPermissionPrompt, +} from '@libs/actions/IOU'; +import type {GpsPoint} from '@libs/actions/IOU'; import DateUtils from '@libs/DateUtils'; -import * as DeviceCapabilities from '@libs/DeviceCapabilities'; -import * as FileUtils from '@libs/fileDownload/FileUtils'; +import {canUseTouchScreen} from '@libs/DeviceCapabilities'; +import {isLocalFile as isLocalFileUtil} from '@libs/fileDownload/FileUtils'; import getCurrentPosition from '@libs/getCurrentPosition'; -import * as IOUUtils from '@libs/IOUUtils'; +import {isMovingTransactionFromTrackExpense as isMovingTransactionFromTrackExpenseUtil, navigateToStartMoneyRequestStep, shouldUseTransactionDraft} from '@libs/IOUUtils'; import Log from '@libs/Log'; import Navigation from '@libs/Navigation/Navigation'; -import * as OptionsListUtils from '@libs/OptionsListUtils'; -import * as ReportUtils from '@libs/ReportUtils'; +import {getParticipantsOption, getReportOption} from '@libs/OptionsListUtils'; +import {getBankAccountRoute} from '@libs/ReportUtils'; import playSound, {SOUNDS} from '@libs/Sound'; -import * as TransactionUtils from '@libs/TransactionUtils'; -import * as IOU from '@userActions/IOU'; +import {getDefaultTaxCode, getRateID, getRequestType, getValidWaypoints} from '@libs/TransactionUtils'; import {openDraftWorkspaceRequest} from '@userActions/Policy/Policy'; import CONST from '@src/CONST'; import ONYXKEYS from '@src/ONYXKEYS'; @@ -55,11 +71,11 @@ function IOURequestStepConfirmation({ const currentUserPersonalDetails = useCurrentUserPersonalDetails(); const personalDetails = usePersonalDetails(); - const [policyDraft] = useOnyx(`${ONYXKEYS.COLLECTION.POLICY_DRAFTS}${IOU.getIOURequestPolicyID(transaction, reportDraft)}`); - const [policyReal] = useOnyx(`${ONYXKEYS.COLLECTION.POLICY}${IOU.getIOURequestPolicyID(transaction, reportReal)}`); - const [policyCategoriesReal] = useOnyx(`${ONYXKEYS.COLLECTION.POLICY_CATEGORIES}${IOU.getIOURequestPolicyID(transaction, reportReal)}`); - const [policyCategoriesDraft] = useOnyx(`${ONYXKEYS.COLLECTION.POLICY_CATEGORIES}${IOU.getIOURequestPolicyID(transaction, reportDraft)}`); - const [policyTags] = useOnyx(`${ONYXKEYS.COLLECTION.POLICY_TAGS}${IOU.getIOURequestPolicyID(transaction, reportReal)}`); + const [policyDraft] = useOnyx(`${ONYXKEYS.COLLECTION.POLICY_DRAFTS}${getIOURequestPolicyID(transaction, reportDraft)}`); + const [policyReal] = useOnyx(`${ONYXKEYS.COLLECTION.POLICY}${getIOURequestPolicyID(transaction, reportReal)}`); + const [policyCategoriesReal] = useOnyx(`${ONYXKEYS.COLLECTION.POLICY_CATEGORIES}${getIOURequestPolicyID(transaction, reportReal)}`); + const [policyCategoriesDraft] = useOnyx(`${ONYXKEYS.COLLECTION.POLICY_CATEGORIES}${getIOURequestPolicyID(transaction, reportDraft)}`); + const [policyTags] = useOnyx(`${ONYXKEYS.COLLECTION.POLICY_TAGS}${getIOURequestPolicyID(transaction, reportReal)}`); const report = reportReal ?? reportDraft; const policy = policyReal ?? policyDraft; @@ -74,7 +90,7 @@ function IOURequestStepConfirmation({ const [selectedParticipantList, setSelectedParticipantList] = useState([]); const [receiptFile, setReceiptFile] = useState>(); - const requestType = TransactionUtils.getRequestType(transaction); + const requestType = getRequestType(transaction); const isDistanceRequest = requestType === CONST.IOU.REQUEST_TYPE.DISTANCE; const isPerDiemRequest = requestType === CONST.IOU.REQUEST_TYPE.PER_DIEM; const [lastLocationPermissionPrompt] = useOnyx(ONYXKEYS.NVP_LAST_LOCATION_PERMISSION_PROMPT); @@ -82,13 +98,13 @@ function IOURequestStepConfirmation({ const receiptFilename = transaction?.filename; const receiptPath = transaction?.receipt?.source; const receiptType = transaction?.receipt?.type; - const customUnitRateID = TransactionUtils.getRateID(transaction) ?? ''; - const defaultTaxCode = TransactionUtils.getDefaultTaxCode(policy, transaction); + const customUnitRateID = getRateID(transaction) ?? ''; + const defaultTaxCode = getDefaultTaxCode(policy, transaction); const transactionTaxCode = (transaction?.taxCode ? transaction?.taxCode : defaultTaxCode) ?? ''; const transactionTaxAmount = transaction?.taxAmount ?? 0; const isSharingTrackExpense = action === CONST.IOU.ACTION.SHARE; const isCategorizingTrackExpense = action === CONST.IOU.ACTION.CATEGORIZE; - const isMovingTransactionFromTrackExpense = IOUUtils.isMovingTransactionFromTrackExpense(action); + const isMovingTransactionFromTrackExpense = isMovingTransactionFromTrackExpenseUtil(action); const payeePersonalDetails = useMemo(() => { if (personalDetails?.[transaction?.splitPayerAccountIDs?.at(0) ?? -1]) { return personalDetails?.[transaction?.splitPayerAccountIDs?.at(0) ?? -1]; @@ -127,14 +143,14 @@ function IOURequestStepConfirmation({ if (participant.isSender && iouType === CONST.IOU.TYPE.INVOICE) { return participant; } - return participant.accountID ? OptionsListUtils.getParticipantsOption(participant, personalDetails) : OptionsListUtils.getReportOption(participant); + return participant.accountID ? getParticipantsOption(participant, personalDetails) : getReportOption(participant); }) ?? [], [transaction?.participants, personalDetails, iouType], ); const isPolicyExpenseChat = useMemo(() => participants?.some((participant) => participant.isPolicyExpenseChat), [participants]); const formHasBeenSubmitted = useRef(false); - useFetchRoute(transaction, transaction?.comment?.waypoints, action, IOUUtils.shouldUseTransactionDraft(action) ? CONST.TRANSACTION.STATE.DRAFT : CONST.TRANSACTION.STATE.CURRENT); + useFetchRoute(transaction, transaction?.comment?.waypoints, action, shouldUseTransactionDraft(action) ? CONST.TRANSACTION.STATE.DRAFT : CONST.TRANSACTION.STATE.CURRENT); useEffect(() => { const policyExpenseChat = participants?.find((participant) => participant.isPolicyExpenseChat); @@ -149,7 +165,7 @@ function IOURequestStepConfirmation({ const defaultBillable = !!policy?.defaultBillable; useEffect(() => { - IOU.setMoneyRequestBillable(transactionID, defaultBillable); + setMoneyRequestBillable(transactionID, defaultBillable); }, [transactionID, defaultBillable]); useEffect(() => { @@ -157,7 +173,7 @@ function IOURequestStepConfirmation({ return; } if (policyCategories?.[transaction.category] && !policyCategories[transaction.category].enabled) { - IOU.setMoneyRequestCategory(transactionID, '', policy?.id); + setMoneyRequestCategory(transactionID, '', policy?.id); } }, [policy?.id, policyCategories, transaction?.category, transactionID]); @@ -168,7 +184,7 @@ function IOURequestStepConfirmation({ if (requestType !== CONST.IOU.REQUEST_TYPE.DISTANCE || !!transaction?.category) { return; } - IOU.setMoneyRequestCategory(transactionID, defaultCategory, policy?.id); + setMoneyRequestCategory(transactionID, defaultCategory, policy?.id); // Prevent resetting to default when unselect category // eslint-disable-next-line react-compiler/react-compiler, react-hooks/exhaustive-deps }, [transactionID, requestType, defaultCategory, policy?.id]); @@ -191,7 +207,7 @@ function IOURequestStepConfirmation({ Navigation.goBack(ROUTES.MONEY_REQUEST_STEP_PARTICIPANTS.getRoute(iouType, transactionID, transaction?.reportID || reportID, undefined, action)); return; } - IOUUtils.navigateToStartMoneyRequestStep(requestType, iouType, transactionID, reportID, action); + navigateToStartMoneyRequestStep(requestType, iouType, transactionID, reportID, action); }, [action, isPerDiemRequest, transaction?.participantsAutoAssigned, transaction?.reportID, participantsAutoAssignedFromRoute, requestType, iouType, transactionID, reportID]); const navigateToAddReceipt = useCallback(() => { @@ -204,7 +220,7 @@ function IOURequestStepConfirmation({ // skip this in case user is moving the transaction as the receipt path will be valid in that case useEffect(() => { // eslint-disable-next-line @typescript-eslint/prefer-nullish-coalescing - const isLocalFile = FileUtils.isLocalFile(receiptPath); + const isLocalFile = isLocalFileUtil(receiptPath); if (!isLocalFile) { setReceiptFile(transaction?.receipt); @@ -217,11 +233,11 @@ function IOURequestStepConfirmation({ setReceiptFile(receipt); }; - IOU.navigateToStartStepIfScanFileCannotBeRead(receiptFilename, receiptPath, onSuccess, requestType, iouType, transactionID, reportID, receiptType); + navigateToStartStepIfScanFileCannotBeRead(receiptFilename, receiptPath, onSuccess, requestType, iouType, transactionID, reportID, receiptType); }, [receiptType, receiptPath, receiptFilename, requestType, iouType, transactionID, reportID, action, transaction?.receipt]); const requestMoney = useCallback( - (selectedParticipants: Participant[], trimmedComment: string, receiptObj?: Receipt, gpsPoints?: IOU.GpsPoint) => { + (selectedParticipants: Participant[], trimmedComment: string, receiptObj?: Receipt, gpsPoints?: GpsPoint) => { if (!transaction) { return; } @@ -230,7 +246,7 @@ function IOURequestStepConfirmation({ if (!participant) { return; } - IOU.requestMoney({ + requestMoneyFunc({ report, participantParams: { payeeEmail: currentUserPersonalDetails.login, @@ -267,7 +283,7 @@ function IOURequestStepConfirmation({ ); const trackExpense = useCallback( - (selectedParticipants: Participant[], trimmedComment: string, receiptObj?: OnyxEntry, gpsPoints?: IOU.GpsPoint) => { + (selectedParticipants: Participant[], trimmedComment: string, receiptObj?: OnyxEntry, gpsPoints?: GpsPoint) => { if (!report || !transaction) { return; } @@ -275,7 +291,7 @@ function IOURequestStepConfirmation({ if (!participant) { return; } - IOU.trackExpense({ + trackExpenseFunc({ report, isDraftPolicy, action, @@ -302,7 +318,7 @@ function IOURequestStepConfirmation({ taxAmount: transactionTaxAmount, billable: transaction.billable, gpsPoints, - validWaypoints: Object.keys(transaction?.comment?.waypoints ?? {}).length ? TransactionUtils.getValidWaypoints(transaction.comment?.waypoints, true) : undefined, + validWaypoints: Object.keys(transaction?.comment?.waypoints ?? {}).length ? getValidWaypoints(transaction.comment?.waypoints, true) : undefined, actionableWhisperReportActionID: transaction.actionableWhisperReportActionID, linkedTrackedExpenseReportAction: transaction.linkedTrackedExpenseReportAction, linkedTrackedExpenseReportID: transaction.linkedTrackedExpenseReportID, @@ -331,7 +347,7 @@ function IOURequestStepConfirmation({ if (!transaction) { return; } - IOU.createDistanceRequest({ + createDistanceRequestFunc({ report, participants: selectedParticipants, currentUserLogin: currentUserPersonalDetails.login, @@ -355,7 +371,7 @@ function IOURequestStepConfirmation({ taxAmount: transactionTaxAmount, customUnitRateID, splitShares: transaction.splitShares, - validWaypoints: TransactionUtils.getValidWaypoints(transaction.comment?.waypoints, true), + validWaypoints: getValidWaypoints(transaction.comment?.waypoints, true), billable: transaction.billable, }, }); @@ -400,7 +416,7 @@ function IOURequestStepConfirmation({ // If we have a receipt let's start the split expense by creating only the action, the transaction, and the group DM if needed if (iouType === CONST.IOU.TYPE.SPLIT && receiptFile) { if (currentUserPersonalDetails.login && !!transaction) { - IOU.startSplitBill({ + startSplitBill({ participants: selectedParticipants, currentUserLogin: currentUserPersonalDetails.login, currentUserAccountID: currentUserPersonalDetails.accountID, @@ -422,7 +438,7 @@ function IOURequestStepConfirmation({ // Since the user is already viewing the report, we don't need to navigate them to the report if (iouType === CONST.IOU.TYPE.SPLIT && !transaction?.isFromGlobalCreate) { if (currentUserPersonalDetails.login && !!transaction) { - IOU.splitBill({ + splitBill({ participants: splitParticipants, currentUserLogin: currentUserPersonalDetails.login, currentUserAccountID: currentUserPersonalDetails.accountID, @@ -448,7 +464,7 @@ function IOURequestStepConfirmation({ // If the split expense is created from the global create menu, we also navigate the user to the group report if (iouType === CONST.IOU.TYPE.SPLIT) { if (currentUserPersonalDetails.login && !!transaction) { - IOU.splitBillAndOpenReport({ + splitBillAndOpenReport({ participants: splitParticipants, currentUserLogin: currentUserPersonalDetails.login, currentUserAccountID: currentUserPersonalDetails.accountID, @@ -471,7 +487,7 @@ function IOURequestStepConfirmation({ } if (iouType === CONST.IOU.TYPE.INVOICE) { - IOU.sendInvoice(currentUserPersonalDetails.accountID, transaction, report, receiptFile, policy, policyTags, policyCategories); + sendInvoice(currentUserPersonalDetails.accountID, transaction, report, receiptFile, policy, policyTags, policyCategories); return; } @@ -575,13 +591,13 @@ function IOURequestStepConfirmation({ if (paymentMethod === CONST.IOU.PAYMENT_TYPE.ELSEWHERE) { setIsConfirmed(true); - IOU.sendMoneyElsewhere(report, transaction.amount, currency, trimmedComment, currentUserPersonalDetails.accountID, participant); + sendMoneyElsewhere(report, transaction.amount, currency, trimmedComment, currentUserPersonalDetails.accountID, participant); return; } if (paymentMethod === CONST.IOU.PAYMENT_TYPE.EXPENSIFY) { setIsConfirmed(true); - IOU.sendMoneyWithWallet(report, transaction.amount, currency, trimmedComment, currentUserPersonalDetails.accountID, participant); + sendMoneyWithWallet(report, transaction.amount, currency, trimmedComment, currentUserPersonalDetails.accountID, participant); } }, [transaction?.amount, transaction?.comment, transaction?.currency, participants, currentUserPersonalDetails.accountID, report], @@ -589,7 +605,7 @@ function IOURequestStepConfirmation({ const setBillable = useCallback( (billable: boolean) => { - IOU.setMoneyRequestBillable(transactionID, billable); + setMoneyRequestBillable(transactionID, billable); }, [transactionID], ); @@ -622,7 +638,7 @@ function IOURequestStepConfirmation({ return ( @@ -648,7 +664,7 @@ function IOURequestStepConfirmation({ resetPermissionFlow={() => setStartLocationPermissionFlow(false)} onGrant={() => createTransaction(selectedParticipantList, true)} onDeny={() => { - IOU.updateLastLocationPermissionPrompt(); + updateLastLocationPermissionPrompt(); createTransaction(selectedParticipantList, false); }} /> @@ -670,8 +686,8 @@ function IOURequestStepConfirmation({ iouType={iouType} reportID={reportID} isPolicyExpenseChat={isPolicyExpenseChat} - policyID={IOU.getIOURequestPolicyID(transaction, report)} - bankAccountRoute={ReportUtils.getBankAccountRoute(report)} + policyID={getIOURequestPolicyID(transaction, report)} + bankAccountRoute={getBankAccountRoute(report)} iouMerchant={transaction?.merchant} iouCreated={transaction?.created} isDistanceRequest={isDistanceRequest} diff --git a/src/pages/iou/request/step/IOURequestStepScan/index.native.tsx b/src/pages/iou/request/step/IOURequestStepScan/index.native.tsx index cae8b46af6bb..feed191c86b9 100644 --- a/src/pages/iou/request/step/IOURequestStepScan/index.native.tsx +++ b/src/pages/iou/request/step/IOURequestStepScan/index.native.tsx @@ -28,22 +28,30 @@ import useLocalize from '@hooks/useLocalize'; import usePolicy from '@hooks/usePolicy'; import useTheme from '@hooks/useTheme'; import useThemeStyles from '@hooks/useThemeStyles'; -import * as FileUtils from '@libs/fileDownload/FileUtils'; +import { + replaceReceipt, + requestMoney, + setMoneyRequestParticipantsFromReport, + setMoneyRequestReceipt, + startSplitBill, + trackExpense, + updateLastLocationPermissionPrompt, +} from '@libs/actions/IOU'; +import {readFileAsync, resizeImageIfNeeded, showCameraPermissionsAlert, splitExtensionFromFileName} from '@libs/fileDownload/FileUtils'; import getPhotoSource from '@libs/fileDownload/getPhotoSource'; import getCurrentPosition from '@libs/getCurrentPosition'; import getPlatform from '@libs/getPlatform'; import getReceiptsUploadFolderPath from '@libs/getReceiptsUploadFolderPath'; -import * as IOUUtils from '@libs/IOUUtils'; +import {shouldStartLocationPermissionFlow as shouldStartLocationPermissionFlowFunc} from '@libs/IOUUtils'; import Log from '@libs/Log'; import Navigation from '@libs/Navigation/Navigation'; -import * as OptionsListUtils from '@libs/OptionsListUtils'; -import * as ReportUtils from '@libs/ReportUtils'; +import {getParticipantsOption, getReportOption} from '@libs/OptionsListUtils'; +import {isArchivedReport, isPolicyExpenseChat} from '@libs/ReportUtils'; import playSound, {SOUNDS} from '@libs/Sound'; -import * as TransactionUtils from '@libs/TransactionUtils'; +import {getDefaultTaxCode} from '@libs/TransactionUtils'; import StepScreenWrapper from '@pages/iou/request/step/StepScreenWrapper'; import withFullTransactionOrNotFound from '@pages/iou/request/step/withFullTransactionOrNotFound'; import withWritableReportOrNotFound from '@pages/iou/request/step/withWritableReportOrNotFound'; -import * as IOU from '@userActions/IOU'; import CONST from '@src/CONST'; import ONYXKEYS from '@src/ONYXKEYS'; import ROUTES from '@src/ROUTES'; @@ -87,7 +95,7 @@ function IOURequestStepScan({ const [pdfFile, setPdfFile] = useState(null); - const defaultTaxCode = TransactionUtils.getDefaultTaxCode(policy, transaction); + const defaultTaxCode = getDefaultTaxCode(policy, transaction); const transactionTaxCode = (transaction?.taxCode ? transaction?.taxCode : defaultTaxCode) ?? ''; const transactionTaxAmount = transaction?.taxAmount ?? 0; @@ -98,10 +106,7 @@ function IOURequestStepScan({ return false; } - return ( - !ReportUtils.isArchivedReport(report, reportNameValuePairs) && - !(ReportUtils.isPolicyExpenseChat(report) && ((policy?.requiresCategory ?? false) || (policy?.requiresTag ?? false))) - ); + return !isArchivedReport(report, reportNameValuePairs) && !(isPolicyExpenseChat(report) && ((policy?.requiresCategory ?? false) || (policy?.requiresTag ?? false))); }, [report, skipConfirmation, policy, reportNameValuePairs]); const {translate} = useLocalize(); @@ -114,7 +119,7 @@ function IOURequestStepScan({ setCameraPermissionStatus(status); if (status === RESULTS.BLOCKED) { - FileUtils.showCameraPermissionsAlert(); + showCameraPermissionsAlert(); } }) .catch(() => { @@ -188,7 +193,7 @@ function IOURequestStepScan({ ); const validateReceipt = (file: FileObject) => { - const {fileExtension} = FileUtils.splitExtensionFromFileName(file?.name ?? ''); + const {fileExtension} = splitExtensionFromFileName(file?.name ?? ''); if ( !CONST.API_ATTACHMENT_VALIDATIONS.ALLOWED_RECEIPT_EXTENSIONS.includes( fileExtension.toLowerCase() as TupleToUnion, @@ -246,7 +251,7 @@ function IOURequestStepScan({ const createTransaction = useCallback( (receipt: Receipt, participant: Participant) => { if (iouType === CONST.IOU.TYPE.TRACK && report) { - IOU.trackExpense({ + trackExpense({ report, isDraftPolicy: false, participantParams: { @@ -264,7 +269,7 @@ function IOURequestStepScan({ }, }); } else { - IOU.requestMoney({ + requestMoney({ report, participantParams: { payeeEmail: currentUserPersonalDetails.login, @@ -301,10 +306,10 @@ function IOURequestStepScan({ // If the transaction was created from the + menu from the composer inside of a chat, the participants can automatically // be added to the transaction (taken from the chat report participants) and then the person is taken to the confirmation step. - const selectedParticipants = IOU.setMoneyRequestParticipantsFromReport(transactionID, report); + const selectedParticipants = setMoneyRequestParticipantsFromReport(transactionID, report); const participants = selectedParticipants.map((participant) => { const participantAccountID = participant?.accountID ?? CONST.DEFAULT_NUMBER_ID; - return participantAccountID ? OptionsListUtils.getParticipantsOption(participant, personalDetails) : OptionsListUtils.getReportOption(participant); + return participantAccountID ? getParticipantsOption(participant, personalDetails) : getReportOption(participant); }); if (shouldSkipConfirmation) { @@ -313,7 +318,7 @@ function IOURequestStepScan({ receipt.state = CONST.IOU.RECEIPT_STATE.SCANREADY; if (iouType === CONST.IOU.TYPE.SPLIT) { playSound(SOUNDS.DONE); - IOU.startSplitBill({ + startSplitBill({ participants, currentUserLogin: currentUserPersonalDetails?.login ?? '', currentUserAccountID: currentUserPersonalDetails.accountID, @@ -338,7 +343,7 @@ function IOURequestStepScan({ (successData) => { playSound(SOUNDS.DONE); if (iouType === CONST.IOU.TYPE.TRACK && report) { - IOU.trackExpense({ + trackExpense({ report, isDraftPolicy: false, participantParams: { @@ -364,7 +369,7 @@ function IOURequestStepScan({ }, }); } else { - IOU.requestMoney({ + requestMoney({ report, participantParams: { payeeEmail: currentUserPersonalDetails.login, @@ -435,7 +440,7 @@ function IOURequestStepScan({ const updateScanAndNavigate = useCallback( (file: FileObject, source: string) => { navigateBack(); - IOU.replaceReceipt(transactionID, file as File, source); + replaceReceipt(transactionID, file as File, source); }, [transactionID], ); @@ -459,12 +464,12 @@ function IOURequestStepScan({ if (Str.isImage(originalFile.name ?? '') && (originalFile?.size ?? 0) > CONST.API_ATTACHMENT_VALIDATIONS.MAX_SIZE) { setIsLoadingReceipt(true); } - FileUtils.resizeImageIfNeeded(originalFile).then((file) => { + resizeImageIfNeeded(originalFile).then((file) => { setIsLoadingReceipt(false); // Store the receipt on the transaction object in Onyx // On Android devices, fetching blob for a file with name containing spaces fails to retrieve the type of file. // So, let us also save the file type in receipt for later use during blob fetch - IOU.setMoneyRequestReceipt(transactionID, file?.uri ?? '', file.name ?? '', !isEditing, file.type); + setMoneyRequestReceipt(transactionID, file?.uri ?? '', file.name ?? '', !isEditing, file.type); if (isEditing) { updateScanAndNavigate(file, file?.uri ?? ''); @@ -476,7 +481,7 @@ function IOURequestStepScan({ const gpsRequired = transaction?.amount === 0 && iouType !== CONST.IOU.TYPE.SPLIT && file; if (gpsRequired) { - const shouldStartLocationPermissionFlow = IOUUtils.shouldStartLocationPermissionFlow(); + const shouldStartLocationPermissionFlow = shouldStartLocationPermissionFlowFunc(); if (shouldStartLocationPermissionFlow) { setStartLocationPermissionFlow(true); return; @@ -533,9 +538,9 @@ function IOURequestStepScan({ .then((photo: PhotoFile) => { // Store the receipt on the transaction object in Onyx const source = getPhotoSource(photo.path); - IOU.setMoneyRequestReceipt(transactionID, source, photo.path, !isEditing); + setMoneyRequestReceipt(transactionID, source, photo.path, !isEditing); - FileUtils.readFileAsync( + readFileAsync( source, photo.path, (file) => { @@ -548,7 +553,7 @@ function IOURequestStepScan({ setFileSource(source); const gpsRequired = transaction?.amount === 0 && iouType !== CONST.IOU.TYPE.SPLIT && file; if (gpsRequired) { - const shouldStartLocationPermissionFlow = IOUUtils.shouldStartLocationPermissionFlow(); + const shouldStartLocationPermissionFlow = shouldStartLocationPermissionFlowFunc(); if (shouldStartLocationPermissionFlow) { setStartLocationPermissionFlow(true); return; @@ -725,7 +730,7 @@ function IOURequestStepScan({ resetPermissionFlow={() => setStartLocationPermissionFlow(false)} onGrant={() => navigateToConfirmationStep(fileResize, fileSource, true)} onDeny={() => { - IOU.updateLastLocationPermissionPrompt(); + updateLastLocationPermissionPrompt(); navigateToConfirmationStep(fileResize, fileSource, false); }} /> diff --git a/src/pages/iou/request/step/IOURequestStepScan/index.tsx b/src/pages/iou/request/step/IOURequestStepScan/index.tsx index 692381d3301f..fb05c6e72348 100644 --- a/src/pages/iou/request/step/IOURequestStepScan/index.tsx +++ b/src/pages/iou/request/step/IOURequestStepScan/index.tsx @@ -28,21 +28,29 @@ import usePolicy from '@hooks/usePolicy'; import useResponsiveLayout from '@hooks/useResponsiveLayout'; import useTheme from '@hooks/useTheme'; import useThemeStyles from '@hooks/useThemeStyles'; -import * as Browser from '@libs/Browser'; -import * as FileUtils from '@libs/fileDownload/FileUtils'; +import { + replaceReceipt, + requestMoney, + setMoneyRequestParticipantsFromReport, + setMoneyRequestReceipt, + startSplitBill, + trackExpense, + updateLastLocationPermissionPrompt, +} from '@libs/actions/IOU'; +import {isMobile, isMobileWebKit} from '@libs/Browser'; +import {base64ToFile, resizeImageIfNeeded, splitExtensionFromFileName, validateImageForCorruption} from '@libs/fileDownload/FileUtils'; import getCurrentPosition from '@libs/getCurrentPosition'; -import * as IOUUtils from '@libs/IOUUtils'; +import {shouldStartLocationPermissionFlow as shouldStartLocationPermissionFlowFunc} from '@libs/IOUUtils'; import Log from '@libs/Log'; import Navigation from '@libs/Navigation/Navigation'; -import * as OptionsListUtils from '@libs/OptionsListUtils'; -import * as ReportUtils from '@libs/ReportUtils'; +import {getParticipantsOption, getReportOption} from '@libs/OptionsListUtils'; +import {isArchivedReport, isPolicyExpenseChat} from '@libs/ReportUtils'; import playSound, {SOUNDS} from '@libs/Sound'; -import * as TransactionUtils from '@libs/TransactionUtils'; +import {getDefaultTaxCode} from '@libs/TransactionUtils'; import ReceiptDropUI from '@pages/iou/ReceiptDropUI'; import StepScreenDragAndDropWrapper from '@pages/iou/request/step/StepScreenDragAndDropWrapper'; import withFullTransactionOrNotFound from '@pages/iou/request/step/withFullTransactionOrNotFound'; import withWritableReportOrNotFound from '@pages/iou/request/step/withWritableReportOrNotFound'; -import * as IOU from '@userActions/IOU'; import CONST from '@src/CONST'; import type {TranslationPaths} from '@src/languages/types'; import ONYXKEYS from '@src/ONYXKEYS'; @@ -96,7 +104,7 @@ function IOURequestStepScan({ const isTabActive = useIsFocused(); const isEditing = action === CONST.IOU.ACTION.EDIT; - const defaultTaxCode = TransactionUtils.getDefaultTaxCode(policy, transaction); + const defaultTaxCode = getDefaultTaxCode(policy, transaction); const transactionTaxCode = (transaction?.taxCode ? transaction?.taxCode : defaultTaxCode) ?? ''; const transactionTaxAmount = transaction?.taxAmount ?? 0; @@ -107,10 +115,7 @@ function IOURequestStepScan({ return false; } - return ( - !ReportUtils.isArchivedReport(report, reportNameValuePairs) && - !(ReportUtils.isPolicyExpenseChat(report) && ((policy?.requiresCategory ?? false) || (policy?.requiresTag ?? false))) - ); + return !isArchivedReport(report, reportNameValuePairs) && !(isPolicyExpenseChat(report) && ((policy?.requiresCategory ?? false) || (policy?.requiresTag ?? false))); }, [report, skipConfirmation, policy, reportNameValuePairs]); /** @@ -118,7 +123,7 @@ function IOURequestStepScan({ * The last deviceId is of regular len camera. */ const requestCameraPermission = useCallback(() => { - if (!Browser.isMobile()) { + if (!isMobile()) { return; } @@ -129,7 +134,7 @@ function IOURequestStepScan({ setCameraPermissionState('granted'); stream.getTracks().forEach((track) => track.stop()); // Only Safari 17+ supports zoom constraint - if (Browser.isMobileWebKit() && stream.getTracks().length > 0) { + if (isMobileWebKit() && stream.getTracks().length > 0) { let deviceId; for (const track of stream.getTracks()) { const setting = track.getSettings(); @@ -170,7 +175,7 @@ function IOURequestStepScan({ }, []); useEffect(() => { - if (!Browser.isMobile() || !isTabActive) { + if (!isMobile() || !isTabActive) { setVideoConstraints(undefined); return; } @@ -209,9 +214,9 @@ function IOURequestStepScan({ }; function validateReceipt(file: FileObject) { - return FileUtils.validateImageForCorruption(file) + return validateImageForCorruption(file) .then(() => { - const {fileExtension} = FileUtils.splitExtensionFromFileName(file?.name ?? ''); + const {fileExtension} = splitExtensionFromFileName(file?.name ?? ''); if ( !CONST.API_ATTACHMENT_VALIDATIONS.ALLOWED_RECEIPT_EXTENSIONS.includes( fileExtension.toLowerCase() as TupleToUnion, @@ -271,7 +276,7 @@ function IOURequestStepScan({ const createTransaction = useCallback( (receipt: Receipt, participant: Participant) => { if (iouType === CONST.IOU.TYPE.TRACK && report) { - IOU.trackExpense({ + trackExpense({ report, isDraftPolicy: false, participantParams: { @@ -289,7 +294,7 @@ function IOURequestStepScan({ }, }); } else { - IOU.requestMoney({ + requestMoney({ report, participantParams: { payeeEmail: currentUserPersonalDetails.login, @@ -327,10 +332,10 @@ function IOURequestStepScan({ // If the transaction was created from the + menu from the composer inside of a chat, the participants can automatically // be added to the transaction (taken from the chat report participants) and then the person is taken to the confirmation step. - const selectedParticipants = IOU.setMoneyRequestParticipantsFromReport(transactionID, report); + const selectedParticipants = setMoneyRequestParticipantsFromReport(transactionID, report); const participants = selectedParticipants.map((participant) => { const participantAccountID = participant?.accountID ?? CONST.DEFAULT_NUMBER_ID; - return participantAccountID ? OptionsListUtils.getParticipantsOption(participant, personalDetails) : OptionsListUtils.getReportOption(participant); + return participantAccountID ? getParticipantsOption(participant, personalDetails) : getReportOption(participant); }); if (shouldSkipConfirmation) { @@ -339,7 +344,7 @@ function IOURequestStepScan({ receipt.state = CONST.IOU.RECEIPT_STATE.SCANREADY; if (iouType === CONST.IOU.TYPE.SPLIT) { playSound(SOUNDS.DONE); - IOU.startSplitBill({ + startSplitBill({ participants, currentUserLogin: currentUserPersonalDetails?.login ?? '', currentUserAccountID: currentUserPersonalDetails.accountID, @@ -364,7 +369,7 @@ function IOURequestStepScan({ (successData) => { playSound(SOUNDS.DONE); if (iouType === CONST.IOU.TYPE.TRACK && report) { - IOU.trackExpense({ + trackExpense({ report, isDraftPolicy: false, participantParams: { @@ -390,7 +395,7 @@ function IOURequestStepScan({ }, }); } else { - IOU.requestMoney({ + requestMoney({ report, participantParams: { payeeEmail: currentUserPersonalDetails.login, @@ -460,7 +465,7 @@ function IOURequestStepScan({ const updateScanAndNavigate = useCallback( (file: FileObject, source: string) => { - IOU.replaceReceipt(transactionID, file as File, source); + replaceReceipt(transactionID, file as File, source); navigateBack(); }, [transactionID, navigateBack], @@ -486,12 +491,12 @@ function IOURequestStepScan({ if (Str.isImage(originalFile.name ?? '') && (originalFile?.size ?? 0) > CONST.API_ATTACHMENT_VALIDATIONS.MAX_SIZE) { setIsLoadingReceipt(true); } - FileUtils.resizeImageIfNeeded(originalFile).then((file) => { + resizeImageIfNeeded(originalFile).then((file) => { setIsLoadingReceipt(false); // Store the receipt on the transaction object in Onyx const source = URL.createObjectURL(file as Blob); // eslint-disable-next-line @typescript-eslint/prefer-nullish-coalescing - IOU.setMoneyRequestReceipt(transactionID, source, file.name || '', !isEditing); + setMoneyRequestReceipt(transactionID, source, file.name || '', !isEditing); if (isEditing) { updateScanAndNavigate(file, source); @@ -502,7 +507,7 @@ function IOURequestStepScan({ setFileSource(source); const gpsRequired = transaction?.amount === 0 && iouType !== CONST.IOU.TYPE.SPLIT && file; if (gpsRequired) { - const shouldStartLocationPermissionFlow = IOUUtils.shouldStartLocationPermissionFlow(); + const shouldStartLocationPermissionFlow = shouldStartLocationPermissionFlowFunc(); if (shouldStartLocationPermissionFlow) { setStartLocationPermissionFlow(true); @@ -540,9 +545,9 @@ function IOURequestStepScan({ } const filename = `receipt_${Date.now()}.png`; - const file = FileUtils.base64ToFile(imageBase64 ?? '', filename); + const file = base64ToFile(imageBase64 ?? '', filename); const source = URL.createObjectURL(file); - IOU.setMoneyRequestReceipt(transactionID, source, file.name, !isEditing); + setMoneyRequestReceipt(transactionID, source, file.name, !isEditing); if (isEditing) { updateScanAndNavigate(file, source); @@ -553,7 +558,7 @@ function IOURequestStepScan({ setFileSource(source); const gpsRequired = transaction?.amount === 0 && iouType !== CONST.IOU.TYPE.SPLIT && file; if (gpsRequired) { - const shouldStartLocationPermissionFlow = IOUUtils.shouldStartLocationPermissionFlow(); + const shouldStartLocationPermissionFlow = shouldStartLocationPermissionFlowFunc(); if (shouldStartLocationPermissionFlow) { setStartLocationPermissionFlow(true); return; @@ -792,8 +797,8 @@ function IOURequestStepScan({ {(isDraggingOverWrapper) => ( <> {isLoadingReceipt && } - - {!(isDraggingOver ?? isDraggingOverWrapper) && (Browser.isMobile() ? mobileCameraView() : desktopUploadView())} + + {!(isDraggingOver ?? isDraggingOverWrapper) && (isMobile() ? mobileCameraView() : desktopUploadView())} { const file = e?.dataTransfer?.files[0]; @@ -819,7 +824,7 @@ function IOURequestStepScan({ resetPermissionFlow={() => setStartLocationPermissionFlow(false)} onGrant={() => navigateToConfirmationStep(fileResize, fileSource, true)} onDeny={() => { - IOU.updateLastLocationPermissionPrompt(); + updateLastLocationPermissionPrompt(); navigateToConfirmationStep(fileResize, fileSource, false); }} /> diff --git a/tests/unit/GoogleTagManagerTest.tsx b/tests/unit/GoogleTagManagerTest.tsx index 9a2041634443..327867361081 100644 --- a/tests/unit/GoogleTagManagerTest.tsx +++ b/tests/unit/GoogleTagManagerTest.tsx @@ -1,9 +1,9 @@ import {NavigationContainer} from '@react-navigation/native'; import {render} from '@testing-library/react-native'; import Onyx from 'react-native-onyx'; -import * as IOU from '@libs/actions/IOU'; -import * as PaymentMethods from '@libs/actions/PaymentMethods'; -import * as Policy from '@libs/actions/Policy/Policy'; +import {trackExpense} from '@libs/actions/IOU'; +import {addPaymentCard, addSubscriptionPaymentCard} from '@libs/actions/PaymentMethods'; +import {createWorkspace} from '@libs/actions/Policy/Policy'; import GoogleTagManager from '@libs/GoogleTagManager'; import OnboardingModalNavigator from '@libs/Navigation/AppNavigator/Navigators/OnboardingModalNavigator'; import CONST from '@src/CONST'; @@ -55,11 +55,11 @@ describe('GoogleTagManagerTest', () => { test('workspace_created', async () => { // When we run the createWorkspace action a few times - Policy.createWorkspace(); + createWorkspace(); await waitForBatchedUpdates(); - Policy.createWorkspace(); + createWorkspace(); await waitForBatchedUpdates(); - Policy.createWorkspace(); + createWorkspace(); // Then we publish a workspace_created event only once expect(GoogleTagManager.publishEvent).toBeCalledTimes(1); @@ -67,7 +67,7 @@ describe('GoogleTagManagerTest', () => { }); test('workspace_created - categorizeTrackedExpense', () => { - IOU.trackExpense({ + trackExpense({ report: {reportID: '123'}, isDraftPolicy: true, action: CONST.IOU.ACTION.CATEGORIZE, @@ -98,7 +98,7 @@ describe('GoogleTagManagerTest', () => { test('paid_adoption - addPaymentCard', () => { // When we add a payment card - PaymentMethods.addPaymentCard(accountID, { + addPaymentCard(accountID, { expirationDate: '2077-10-30', addressZipCode: 'addressZipCode', cardNumber: 'cardNumber', @@ -113,7 +113,7 @@ describe('GoogleTagManagerTest', () => { test('paid_adoption - addSubscriptionPaymentCard', () => { // When we add a payment card - PaymentMethods.addSubscriptionPaymentCard(accountID, { + addSubscriptionPaymentCard(accountID, { cardNumber: 'cardNumber', cardYear: 'cardYear', cardMonth: 'cardMonth', From fb818ef3c99ac8f93a8acfdde19a83101bd59fcd Mon Sep 17 00:00:00 2001 From: mkzie2 Date: Wed, 5 Feb 2025 22:33:42 +0700 Subject: [PATCH 4/4] make merchant and comment as optional --- src/libs/actions/IOU.ts | 8 ++++---- src/pages/iou/request/step/IOURequestStepAmount.tsx | 1 - src/pages/iou/request/step/IOURequestStepDistance.tsx | 1 - .../iou/request/step/IOURequestStepScan/index.native.tsx | 4 ---- src/pages/iou/request/step/IOURequestStepScan/index.tsx | 4 ---- tests/actions/IOUTest.ts | 3 --- 6 files changed, 4 insertions(+), 17 deletions(-) diff --git a/src/libs/actions/IOU.ts b/src/libs/actions/IOU.ts index d468a965c0b1..3da686fb33cc 100644 --- a/src/libs/actions/IOU.ts +++ b/src/libs/actions/IOU.ts @@ -452,8 +452,8 @@ type TrackExpenseTransactionParams = { amount: number; currency: string; created: string | undefined; - merchant: string; - comment: string; + merchant?: string; + comment?: string; receipt?: Receipt; category?: string; tag?: string; @@ -4688,8 +4688,8 @@ function trackExpense(params: CreateTrackExpenseParams) { amount, currency, created = '', - merchant, - comment, + merchant = '', + comment = '', receipt, category, tag, diff --git a/src/pages/iou/request/step/IOURequestStepAmount.tsx b/src/pages/iou/request/step/IOURequestStepAmount.tsx index d72bc8f4512d..0289d5cb70f5 100644 --- a/src/pages/iou/request/step/IOURequestStepAmount.tsx +++ b/src/pages/iou/request/step/IOURequestStepAmount.tsx @@ -232,7 +232,6 @@ function IOURequestStepAmount({ currency: currency ?? 'USD', created: transaction?.created, merchant: CONST.TRANSACTION.PARTIAL_TRANSACTION_MERCHANT, - comment: '', }, }); return; diff --git a/src/pages/iou/request/step/IOURequestStepDistance.tsx b/src/pages/iou/request/step/IOURequestStepDistance.tsx index 11512217f458..22870365fdc1 100644 --- a/src/pages/iou/request/step/IOURequestStepDistance.tsx +++ b/src/pages/iou/request/step/IOURequestStepDistance.tsx @@ -336,7 +336,6 @@ function IOURequestStepDistance({ currency: transaction?.currency ?? 'USD', created: transaction?.created ?? '', merchant: translate('iou.fieldPending'), - comment: '', receipt: {}, billable: false, validWaypoints: getValidWaypoints(waypoints, true), diff --git a/src/pages/iou/request/step/IOURequestStepScan/index.native.tsx b/src/pages/iou/request/step/IOURequestStepScan/index.native.tsx index df819a9134b5..d99807bc9759 100644 --- a/src/pages/iou/request/step/IOURequestStepScan/index.native.tsx +++ b/src/pages/iou/request/step/IOURequestStepScan/index.native.tsx @@ -263,8 +263,6 @@ function IOURequestStepScan({ amount: 0, currency: transaction?.currency ?? 'USD', created: transaction?.created, - merchant: '', - comment: '', receipt, }, }); @@ -358,8 +356,6 @@ function IOURequestStepScan({ amount: 0, currency: transaction?.currency ?? 'USD', created: transaction?.created, - merchant: '', - comment: '', receipt, billable: false, gpsPoints: { diff --git a/src/pages/iou/request/step/IOURequestStepScan/index.tsx b/src/pages/iou/request/step/IOURequestStepScan/index.tsx index 578b2fb75eff..c2f51c6001b6 100644 --- a/src/pages/iou/request/step/IOURequestStepScan/index.tsx +++ b/src/pages/iou/request/step/IOURequestStepScan/index.tsx @@ -288,8 +288,6 @@ function IOURequestStepScan({ amount: 0, currency: transaction?.currency ?? 'USD', created: transaction?.created, - merchant: '', - comment: '', receipt, }, }); @@ -384,8 +382,6 @@ function IOURequestStepScan({ amount: 0, currency: transaction?.currency ?? 'USD', created: transaction?.created, - merchant: '', - comment: '', receipt, billable: false, gpsPoints: { diff --git a/tests/actions/IOUTest.ts b/tests/actions/IOUTest.ts index 610dc0a972d0..7f75d31baec2 100644 --- a/tests/actions/IOUTest.ts +++ b/tests/actions/IOUTest.ts @@ -204,7 +204,6 @@ describe('actions/IOU', () => { currency: fakeTransaction.currency, created: format(new Date(), CONST.DATE.FNS_FORMAT_STRING), merchant: fakeTransaction.merchant, - comment: '', billable: false, validWaypoints: fakeWayPoints, actionableWhisperReportActionID: fakeTransaction?.actionableWhisperReportActionID, @@ -296,7 +295,6 @@ describe('actions/IOU', () => { currency: transactionDraft?.currency ?? fakeTransaction.currency, created: format(new Date(), CONST.DATE.FNS_FORMAT_STRING), merchant: transactionDraft?.merchant ?? fakeTransaction.merchant, - comment: '', category: Object.keys(fakeCategories).at(0) ?? '', validWaypoints: Object.keys(transactionDraft?.comment?.waypoints ?? {}).length ? getValidWaypoints(transactionDraft?.comment?.waypoints, true) : undefined, actionableWhisperReportActionID: transactionDraft?.actionableWhisperReportActionID, @@ -4449,7 +4447,6 @@ describe('actions/IOU', () => { currency: CONST.CURRENCY.USD, created: '2024-10-30', merchant: 'KFC', - comment: '', receipt: {}, actionableWhisperReportActionID: '1', linkedTrackedExpenseReportAction: {