Skip to content
Draft
4 changes: 2 additions & 2 deletions __mocks__/reportData/transactions.ts
Original file line number Diff line number Diff line change
Expand Up @@ -30,7 +30,7 @@ const transactionR14932: Transaction = {
reimbursable: true,
hasEReceipt: true,
cardID: 0,
modifiedAmount: 0,
modifiedAmount: undefined,
originalAmount: 0,
comment: {},
bank: '',
Expand Down Expand Up @@ -59,7 +59,7 @@ const transactionR98765: Transaction = {
hasEReceipt: true,
managedCard: false,
billable: false,
modifiedAmount: 0,
modifiedAmount: undefined,
cardID: 0,
originalAmount: 0,
comment: {},
Expand Down
Original file line number Diff line number Diff line change
@@ -1,3 +1,4 @@
import isNumber from 'lodash/isNumber';
import React, {useCallback, useMemo, useRef, useState} from 'react';
import type {LayoutChangeEvent, ListRenderItem} from 'react-native';
import {usePersonalDetails} from '@components/OnyxListItemProvider';
Expand Down Expand Up @@ -97,8 +98,7 @@ function MoneyRequestReportPreview({
return false;
}

// eslint-disable-next-line @typescript-eslint/prefer-nullish-coalescing
return transactions.some((transaction) => (transaction?.modifiedAmount || transaction?.amount) < 0);
return transactions.some((transaction) => (isNumber(transaction?.modifiedAmount) ? transaction.modifiedAmount : transaction?.amount) < 0);
}, [transactions, action.childType, iouReport]);

const openReportFromPreview = useCallback(() => {
Expand Down
5 changes: 3 additions & 2 deletions src/components/ReportActionItem/MoneyRequestView.tsx
Original file line number Diff line number Diff line change
@@ -1,4 +1,5 @@
import {Str} from 'expensify-common';
import isNumber from 'lodash/isNumber';
import React, {useCallback, useContext, useEffect, useMemo, useState} from 'react';
import {View} from 'react-native';
import type {OnyxCollection, OnyxEntry} from 'react-native-onyx';
Expand Down Expand Up @@ -270,9 +271,9 @@ function MoneyRequestView({
// Use the updated transaction amount in merge flow to have correct positive/negative sign
const actualAmount = isFromMergeTransaction && updatedTransaction ? updatedTransaction.amount : transactionAmount;
const actualCurrency = updatedTransaction ? getCurrency(updatedTransaction) : transactionCurrency;
const shouldDisplayTransactionAmount = ((isDistanceRequest && hasRoute) || !!actualAmount) && actualAmount !== undefined;
const shouldDisplayTransactionAmount = (isDistanceRequest && hasRoute) || isNumber(actualAmount);
const formattedTransactionAmount = shouldDisplayTransactionAmount ? convertToDisplayString(actualAmount, actualCurrency) : '';
const formattedPerAttendeeAmount = shouldDisplayTransactionAmount ? convertToDisplayString(actualAmount / (actualAttendees?.length ?? 1), actualCurrency) : '';
const formattedPerAttendeeAmount = shouldDisplayTransactionAmount && isNumber(actualAmount) ? convertToDisplayString(actualAmount / (actualAttendees?.length ?? 1), actualCurrency) : '';

const formattedOriginalAmount = transactionOriginalAmount && transactionOriginalCurrency && convertToDisplayString(transactionOriginalAmount, transactionOriginalCurrency);
const isCardTransaction = isCardTransactionTransactionUtils(transaction);
Expand Down
Original file line number Diff line number Diff line change
@@ -1,4 +1,5 @@
import {useRoute} from '@react-navigation/native';
import isNumber from 'lodash/isNumber';
import React, {useCallback, useMemo} from 'react';
import type {GestureResponderEvent} from 'react-native';
import {usePersonalDetails, useSession} from '@components/OnyxListItemProvider';
Expand Down Expand Up @@ -93,8 +94,7 @@ function TransactionPreview(props: TransactionPreviewProps) {
const iouAction = action;

// See description of `transactionRawAmount` prop for more context
// eslint-disable-next-line @typescript-eslint/prefer-nullish-coalescing
const transactionRawAmount = (transaction?.modifiedAmount || transaction?.amount) ?? 0;
const transactionRawAmount = (isNumber(transaction?.modifiedAmount) ? transaction.modifiedAmount : transaction?.amount) ?? 0;

const shouldDisableOnPress = isBillSplit && isEmptyObject(transaction);
const isTransactionMadeWithCard = isManagedCardTransaction(transaction);
Expand Down
3 changes: 2 additions & 1 deletion src/components/Search/index.tsx
Original file line number Diff line number Diff line change
@@ -1,5 +1,6 @@
import {findFocusedRoute, useFocusEffect, useIsFocused, useNavigation} from '@react-navigation/native';
import * as Sentry from '@sentry/react-native';
import isNumber from 'lodash/isNumber';
import React, {useCallback, useContext, useEffect, useMemo, useRef, useState} from 'react';
import type {NativeScrollEvent, NativeSyntheticEvent, StyleProp, ViewStyle} from 'react-native';
import {View} from 'react-native';
Expand Down Expand Up @@ -219,7 +220,7 @@ function prepareTransactionsList(
action: item.action,
reportID: item.reportID,
policyID: item.policyID,
amount: Math.abs(item.modifiedAmount || item.amount),
amount: Math.abs(isNumber(item.modifiedAmount) ? item.modifiedAmount : item.amount),
groupAmount: item.groupAmount,
groupCurrency: item.groupCurrency,
groupExchangeRate: item.groupExchangeRate,
Expand Down
3 changes: 1 addition & 2 deletions src/libs/ReportUtils.ts
Original file line number Diff line number Diff line change
Expand Up @@ -12468,8 +12468,7 @@ function hasExportError(reportActions: OnyxEntry<ReportActions> | ReportAction[]

function doesReportContainRequestsFromMultipleUsers(iouReport: OnyxEntry<Report>): boolean {
const transactions = getReportTransactions(iouReport?.reportID);
// eslint-disable-next-line @typescript-eslint/prefer-nullish-coalescing
return isIOUReport(iouReport) && transactions.some((transaction) => (transaction?.modifiedAmount || transaction?.amount) < 0);
return isIOUReport(iouReport) && transactions.some((transaction) => (isNumber(transaction?.modifiedAmount) ? transaction.modifiedAmount : transaction?.amount) < 0);
}

/**
Expand Down
4 changes: 2 additions & 2 deletions src/libs/SearchUIUtils.ts
Original file line number Diff line number Diff line change
@@ -1,3 +1,4 @@
import isNumber from 'lodash/isNumber';
import type {TextStyle, ViewStyle} from 'react-native';
import type {OnyxCollection, OnyxEntry} from 'react-native-onyx';
import type {ValueOf} from 'type-fest';
Expand Down Expand Up @@ -845,8 +846,7 @@ function isAmountTooLong(amount: number, maxLength = 8): boolean {

// eslint-disable-next-line @typescript-eslint/no-deprecated
function isTransactionAmountTooLong(transactionItem: TransactionListItemType | SearchTransaction | OnyxTypes.Transaction) {
// eslint-disable-next-line @typescript-eslint/prefer-nullish-coalescing
const amount = Math.abs(transactionItem.modifiedAmount || transactionItem.amount);
const amount = Math.abs(isNumber(transactionItem.modifiedAmount) ? transactionItem.modifiedAmount : transactionItem.amount);
return isAmountTooLong(amount);
}

Expand Down
13 changes: 6 additions & 7 deletions src/libs/TransactionUtils/index.ts
Original file line number Diff line number Diff line change
Expand Up @@ -2,6 +2,7 @@
import {deepEqual} from 'fast-equals';
import lodashDeepClone from 'lodash/cloneDeep';
import lodashHas from 'lodash/has';
import isNumber from 'lodash/isNumber';
import lodashSet from 'lodash/set';
import type {OnyxCollection, OnyxEntry} from 'react-native-onyx';
import Onyx from 'react-native-onyx';
Expand Down Expand Up @@ -126,7 +127,7 @@
};

let deprecatedAllReports: OnyxCollection<Report> = {};
Onyx.connect({

Check warning on line 130 in src/libs/TransactionUtils/index.ts

View workflow job for this annotation

GitHub Actions / Changed files ESLint check

Onyx.connect() is deprecated. Use useOnyx() hook instead and pass the data as parameters to a pure function
key: ONYXKEYS.COLLECTION.REPORT,
waitForCollectionCallback: true,
callback: (value) => {
Expand All @@ -135,7 +136,7 @@
});

let deprecatedAllTransactionViolations: OnyxCollection<TransactionViolations> = {};
Onyx.connect({

Check warning on line 139 in src/libs/TransactionUtils/index.ts

View workflow job for this annotation

GitHub Actions / Changed files ESLint check

Onyx.connect() is deprecated. Use useOnyx() hook instead and pass the data as parameters to a pure function
key: ONYXKEYS.COLLECTION.TRANSACTION_VIOLATIONS,
waitForCollectionCallback: true,
callback: (value) => (deprecatedAllTransactionViolations = value),
Expand Down Expand Up @@ -752,9 +753,8 @@
function getAmount(transaction: OnyxInputOrEntry<Transaction>, isFromExpenseReport = false, isFromTrackedExpense = false, allowNegative = false, disableOppositeConversion = false): number {
// IOU requests cannot have negative values, but they can be stored as negative values, let's return absolute value
if (!isFromExpenseReport && !isFromTrackedExpense && !allowNegative) {
const amount = transaction?.modifiedAmount ?? 0;
if (amount) {
return Math.abs(amount);
if (isNumber(transaction?.modifiedAmount)) {
return Math.abs(transaction.modifiedAmount);
}
return Math.abs(transaction?.amount ?? 0);
}
Expand All @@ -766,12 +766,11 @@
// Expense report case:
// The amounts are stored using an opposite sign and negative values can be set,
// we need to return an opposite sign than is saved in the transaction object
let amount = transaction?.modifiedAmount ?? 0;
if (amount) {
return -amount;
if (isNumber(transaction?.modifiedAmount)) {
return -transaction.modifiedAmount;
}

amount = transaction?.amount ?? 0;
const amount = transaction?.amount ?? 0;

// To avoid -0 being shown, lets only change the sign if the value is other than 0.
return amount ? -amount : 0;
Expand Down
4 changes: 2 additions & 2 deletions src/libs/Violations/ViolationsUtils.ts
Original file line number Diff line number Diff line change
@@ -1,4 +1,5 @@
import isEmpty from 'lodash/isEmpty';
import isNumber from 'lodash/isNumber';
import keyBy from 'lodash/keyBy';
import reject from 'lodash/reject';
import type {OnyxCollection, OnyxEntry, OnyxUpdate} from 'react-native-onyx';
Expand Down Expand Up @@ -341,8 +342,7 @@ const ViolationsUtils = {
const isPolicyTrackTaxEnabled = isTaxTrackingEnabled(true, policy, isDistanceRequest, isPerDiemRequest);
const isTaxInPolicy = Object.keys(policy.taxRates?.taxes ?? {}).some((key) => key === updatedTransaction.taxCode);

// eslint-disable-next-line @typescript-eslint/prefer-nullish-coalescing
const amount = updatedTransaction.modifiedAmount || updatedTransaction.amount;
const amount = isNumber(updatedTransaction.modifiedAmount) ? updatedTransaction.modifiedAmount : updatedTransaction.amount;
// eslint-disable-next-line @typescript-eslint/prefer-nullish-coalescing
const currency = updatedTransaction.modifiedCurrency || updatedTransaction.currency;
const canCalculateAmountViolations = policy.outputCurrency === currency;
Expand Down
2 changes: 1 addition & 1 deletion src/stories/objects/Transaction.ts
Original file line number Diff line number Diff line change
Expand Up @@ -20,7 +20,7 @@ const transaction: Transaction & {mcc: string; modifiedMCC: string} = {
managedCard: false,
mcc: '',
merchant: "Mario's",
modifiedAmount: 0,
modifiedAmount: undefined,
modifiedCreated: '',
modifiedCurrency: '',
modifiedMCC: '',
Expand Down
2 changes: 1 addition & 1 deletion src/types/onyx/SearchResults.ts
Original file line number Diff line number Diff line change
Expand Up @@ -90,7 +90,7 @@ type SearchTransaction = {
canDelete: boolean;

/** The edited transaction amount */
modifiedAmount: number;
modifiedAmount?: number;

/** The transaction currency */
currency: string;
Expand Down
7 changes: 4 additions & 3 deletions tests/actions/IOUTest.ts
Original file line number Diff line number Diff line change
Expand Up @@ -6874,7 +6874,7 @@ describe('actions/IOU', () => {
...createRandomTransaction(0),
reportID,
amount: 0,
modifiedAmount: 0,
modifiedAmount: undefined,
receipt: {
source: 'test',
state: CONST.IOU.RECEIPT_STATE.SCANNING,
Expand All @@ -6886,7 +6886,7 @@ describe('actions/IOU', () => {
...createRandomTransaction(1),
reportID,
amount: 0,
modifiedAmount: 0,
modifiedAmount: undefined,
receipt: {
source: 'test',
state: CONST.IOU.RECEIPT_STATE.SCANNING,
Expand Down Expand Up @@ -6936,7 +6936,7 @@ describe('actions/IOU', () => {
...createRandomTransaction(1),
reportID,
amount: 0,
modifiedAmount: 0,
modifiedAmount: undefined,
receipt: {
source: 'test',
state: CONST.IOU.RECEIPT_STATE.SCANNING,
Expand Down Expand Up @@ -7386,6 +7386,7 @@ describe('actions/IOU', () => {
...createRandomTransaction(1),
reportID: fakeReport.reportID,
amount: 100,
modifiedAmount: 0,
currency: 'USD',
};

Expand Down
6 changes: 3 additions & 3 deletions tests/unit/DebugUtilsTest.ts
Original file line number Diff line number Diff line change
Expand Up @@ -1234,7 +1234,7 @@ describe('DebugUtils', () => {
},
[`${ONYXKEYS.COLLECTION.TRANSACTION}1` as const]: {
amount: 0,
modifiedAmount: 0,
modifiedAmount: undefined,
},
});
const {reportAction} =
Expand Down Expand Up @@ -1294,7 +1294,7 @@ describe('DebugUtils', () => {
await Onyx.multiSet({
[`${ONYXKEYS.COLLECTION.TRANSACTION}1` as const]: {
amount: 0,
modifiedAmount: 0,
modifiedAmount: undefined,
},
[`${ONYXKEYS.COLLECTION.REPORT}1` as const]: MOCK_CHAT_REPORT,
[`${ONYXKEYS.COLLECTION.REPORT}2` as const]: MOCK_IOU_REPORT,
Expand Down Expand Up @@ -1359,7 +1359,7 @@ describe('DebugUtils', () => {
await Onyx.multiSet({
[`${ONYXKEYS.COLLECTION.TRANSACTION}1` as const]: {
amount: 0,
modifiedAmount: 0,
modifiedAmount: undefined,
},
[`${ONYXKEYS.COLLECTION.REPORT}1` as const]: MOCK_CHAT_REPORT,
[`${ONYXKEYS.COLLECTION.REPORT}2` as const]: MOCK_IOU_REPORT,
Expand Down
2 changes: 1 addition & 1 deletion tests/unit/MoneyRequestReportUtilsTest.ts
Original file line number Diff line number Diff line change
Expand Up @@ -82,7 +82,7 @@ const transactionItemBaseMock: TransactionListItemType = {
hasEReceipt: false,
keyForList: '1',
merchant: 'Expense',
modifiedAmount: 0,
modifiedAmount: undefined,
modifiedCreated: '',
modifiedCurrency: '',
modifiedMerchant: 'Expense',
Expand Down
24 changes: 12 additions & 12 deletions tests/unit/Search/SearchUIUtilsTest.ts
Original file line number Diff line number Diff line change
Expand Up @@ -399,7 +399,7 @@ const searchResults: OnyxTypes.SearchResults = {
currency: 'USD',
hasEReceipt: false,
merchant: 'Expense',
modifiedAmount: 0,
modifiedAmount: undefined,
modifiedCreated: '',
modifiedCurrency: '',
modifiedMerchant: 'Expense',
Expand Down Expand Up @@ -429,7 +429,7 @@ const searchResults: OnyxTypes.SearchResults = {
currency: 'USD',
hasEReceipt: false,
merchant: 'Expense',
modifiedAmount: 0,
modifiedAmount: undefined,
modifiedCreated: '',
modifiedCurrency: '',
modifiedMerchant: 'Expense',
Expand Down Expand Up @@ -460,7 +460,7 @@ const searchResults: OnyxTypes.SearchResults = {
currency: 'VND',
hasEReceipt: false,
merchant: '(none)',
modifiedAmount: 0,
modifiedAmount: undefined,
modifiedCreated: '',
modifiedCurrency: '',
modifiedMerchant: '',
Expand Down Expand Up @@ -490,7 +490,7 @@ const searchResults: OnyxTypes.SearchResults = {
currency: 'VND',
hasEReceipt: false,
merchant: '(none)',
modifiedAmount: 0,
modifiedAmount: undefined,
modifiedCreated: '',
modifiedCurrency: '',
modifiedMerchant: '',
Expand Down Expand Up @@ -790,7 +790,7 @@ const transactionsListItems = [
hasEReceipt: false,
keyForList: '1',
merchant: 'Expense',
modifiedAmount: 0,
modifiedAmount: undefined,
modifiedCreated: '',
modifiedCurrency: '',
modifiedMerchant: 'Expense',
Expand Down Expand Up @@ -850,7 +850,7 @@ const transactionsListItems = [
hasEReceipt: false,
keyForList: '2',
merchant: 'Expense',
modifiedAmount: 0,
modifiedAmount: undefined,
modifiedCreated: '',
modifiedCurrency: '',
modifiedMerchant: 'Expense',
Expand Down Expand Up @@ -908,7 +908,7 @@ const transactionsListItems = [
currency: 'VND',
hasEReceipt: false,
merchant: '(none)',
modifiedAmount: 0,
modifiedAmount: undefined,
modifiedCreated: '',
modifiedCurrency: '',
modifiedMerchant: '',
Expand Down Expand Up @@ -973,7 +973,7 @@ const transactionsListItems = [
currency: 'VND',
hasEReceipt: false,
merchant: '(none)',
modifiedAmount: 0,
modifiedAmount: undefined,
modifiedCreated: '',
modifiedCurrency: '',
modifiedMerchant: '',
Expand Down Expand Up @@ -1088,7 +1088,7 @@ const transactionReportGroupListItems = [
hasEReceipt: false,
keyForList: '1',
merchant: 'Expense',
modifiedAmount: 0,
modifiedAmount: undefined,
modifiedCreated: '',
modifiedCurrency: '',
modifiedMerchant: 'Expense',
Expand Down Expand Up @@ -1200,7 +1200,7 @@ const transactionReportGroupListItems = [
],
keyForList: '2',
merchant: 'Expense',
modifiedAmount: 0,
modifiedAmount: undefined,
modifiedCreated: '',
modifiedCurrency: '',
modifiedMerchant: 'Expense',
Expand Down Expand Up @@ -1304,7 +1304,7 @@ const transactionReportGroupListItems = [
currency: 'VND',
hasEReceipt: false,
merchant: '(none)',
modifiedAmount: 0,
modifiedAmount: undefined,
modifiedCreated: '',
modifiedCurrency: '',
modifiedMerchant: '',
Expand Down Expand Up @@ -1366,7 +1366,7 @@ const transactionReportGroupListItems = [
currency: 'VND',
hasEReceipt: false,
merchant: '(none)',
modifiedAmount: 0,
modifiedAmount: undefined,
modifiedCreated: '',
modifiedCurrency: '',
modifiedMerchant: '',
Expand Down
4 changes: 2 additions & 2 deletions tests/unit/Search/handleActionButtonPressTest.ts
Original file line number Diff line number Diff line change
Expand Up @@ -111,7 +111,7 @@ const mockReportItemWithHold = {
hasEReceipt: false,
managerID: 1206,
merchant: 'Qatar',
modifiedAmount: 0,
modifiedAmount: undefined,
modifiedCreated: '',
modifiedCurrency: '',
modifiedMerchant: '',
Expand Down Expand Up @@ -210,7 +210,7 @@ const mockReportItemWithHold = {
currency: 'USD',
hasEReceipt: false,
merchant: 'Forbes',
modifiedAmount: 0,
modifiedAmount: undefined,
modifiedCreated: '',
modifiedCurrency: '',
modifiedMerchant: '',
Expand Down
2 changes: 1 addition & 1 deletion tests/unit/useTodosTest.ts
Original file line number Diff line number Diff line change
Expand Up @@ -44,7 +44,7 @@ const createMockTransaction = (transactionID: string, reportID: string, override
transactionID,
reportID,
amount: 100,
modifiedAmount: 0,
modifiedAmount: undefined,
reimbursable: true,
...overrides,
}) as Transaction;
Expand Down
1 change: 0 additions & 1 deletion tests/utils/collections/transaction.ts
Original file line number Diff line number Diff line change
Expand Up @@ -41,7 +41,6 @@ export default function createRandomTransaction(index: number): Transaction {
receipt: {filename: randWord()},
reimbursable: randBoolean(),
hasEReceipt: randBoolean(),
modifiedAmount: 0,
};
}

Expand Down
Loading