Skip to content

Commit 25d1c95

Browse files
Revert "Merge pull request #55297 from callstack-internal/perf/create-map-transactions"
This reverts commit 523edfe, reversing changes made to 4a0d4e6.
1 parent 9aaed6d commit 25d1c95

File tree

10 files changed

+171
-249
lines changed

10 files changed

+171
-249
lines changed

src/components/MoneyReportHeader.tsx

Lines changed: 9 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -30,10 +30,10 @@ import {
3030
isCurrentUserSubmitter,
3131
isInvoiceReport,
3232
navigateBackOnDeleteTransaction,
33-
reportTransactionsSelector,
3433
} from '@libs/ReportUtils';
3534
import {
3635
allHavePendingRTERViolation,
36+
getAllReportTransactions,
3737
isDuplicate as isDuplicateTransactionUtils,
3838
isExpensifyCardTransaction,
3939
isOnHold as isOnHoldTransactionUtils,
@@ -115,13 +115,12 @@ function MoneyReportHeader({policy, report: moneyRequestReport, transactionThrea
115115
}
116116
return reportActions.find((action): action is OnyxTypes.ReportAction<typeof CONST.REPORT.ACTIONS.TYPE.IOU> => action.reportActionID === transactionThreadReport.parentReportActionID);
117117
}, [reportActions, transactionThreadReport?.parentReportActionID]);
118-
const [transactions] = useOnyx(ONYXKEYS.COLLECTION.TRANSACTION, {
119-
selector: (_transactions) => reportTransactionsSelector(_transactions, moneyRequestReport?.reportID),
120-
initialValue: [],
121-
});
122-
const [transaction] = useOnyx(`${ONYXKEYS.COLLECTION.TRANSACTION}${isMoneyRequestAction(requestParentReportAction) && getOriginalMessage(requestParentReportAction)?.IOUTransactionID}`);
118+
const [transactions] = useOnyx(ONYXKEYS.COLLECTION.TRANSACTION);
123119
const [dismissedHoldUseExplanation, dismissedHoldUseExplanationResult] = useOnyx(ONYXKEYS.NVP_DISMISSED_HOLD_USE_EXPLANATION, {initialValue: true});
124120
const isLoadingHoldUseExplained = isLoadingOnyxValue(dismissedHoldUseExplanationResult);
121+
const transaction =
122+
transactions?.[`${ONYXKEYS.COLLECTION.TRANSACTION}${isMoneyRequestAction(requestParentReportAction) && getOriginalMessage(requestParentReportAction)?.IOUTransactionID}`] ??
123+
undefined;
125124

126125
const styles = useThemeStyles();
127126
const theme = useTheme();
@@ -140,16 +139,15 @@ function MoneyReportHeader({policy, report: moneyRequestReport, transactionThrea
140139
const [isHoldMenuVisible, setIsHoldMenuVisible] = useState(false);
141140
const [paymentType, setPaymentType] = useState<PaymentMethodType>();
142141
const [requestType, setRequestType] = useState<ActionHandledType>();
142+
const allTransactions = useMemo(() => getAllReportTransactions(moneyRequestReport?.reportID, transactions), [moneyRequestReport?.reportID, transactions]);
143143
const canAllowSettlement = hasUpdatedTotal(moneyRequestReport, policy);
144144
const policyType = policy?.type;
145145
const connectedIntegration = getConnectedIntegration(policy);
146146
const navigateBackToAfterDelete = useRef<Route>();
147147
const hasHeldExpenses = hasHeldExpensesReportUtils(moneyRequestReport?.reportID);
148148
const hasScanningReceipt = getTransactionsWithReceipts(moneyRequestReport?.reportID).some((t) => isReceiptBeingScanned(t));
149-
const hasOnlyPendingTransactions = useMemo(() => {
150-
return !!transactions && transactions.length > 0 && transactions.every((t) => isExpensifyCardTransaction(t) && isPending(t));
151-
}, [transactions]);
152-
const transactionIDs = transactions?.map((t) => t.transactionID) ?? [];
149+
const hasOnlyPendingTransactions = allTransactions.length > 0 && allTransactions.every((t) => isExpensifyCardTransaction(t) && isPending(t));
150+
const transactionIDs = allTransactions.map((t) => t.transactionID) ?? [];
153151
const hasAllPendingRTERViolations = allHavePendingRTERViolation(transactionIDs);
154152
const shouldShowBrokenConnectionViolation = shouldShowBrokenConnectionViolationTransactionUtils(transactionIDs, moneyRequestReport, policy);
155153
const hasOnlyHeldExpenses = hasOnlyHeldExpensesReportUtils(moneyRequestReport?.reportID);
@@ -504,7 +502,7 @@ function MoneyReportHeader({policy, report: moneyRequestReport, transactionThrea
504502
paymentType={paymentType}
505503
chatReport={chatReport}
506504
moneyRequestReport={moneyRequestReport}
507-
transactionCount={transactionIDs?.length ?? 0}
505+
transactionCount={transactionIDs.length}
508506
/>
509507
)}
510508
<DelegateNoAccessModal

src/components/ReportActionItem/ReportPreview.tsx

Lines changed: 13 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -64,10 +64,10 @@ import {
6464
isReportApproved,
6565
isReportOwner,
6666
isSettled,
67-
reportTransactionsSelector,
6867
} from '@libs/ReportUtils';
6968
import StringUtils from '@libs/StringUtils';
7069
import {
70+
getAllReportTransactions,
7171
getDescription,
7272
getMerchant,
7373
getTransactionViolations,
@@ -143,10 +143,7 @@ function ReportPreview({
143143
const policy = usePolicy(policyID);
144144
const [chatReport] = useOnyx(`${ONYXKEYS.COLLECTION.REPORT}${chatReportID}`);
145145
const [iouReport] = useOnyx(`${ONYXKEYS.COLLECTION.REPORT}${iouReportID}`);
146-
const [transactions] = useOnyx(ONYXKEYS.COLLECTION.TRANSACTION, {
147-
selector: (_transactions) => reportTransactionsSelector(_transactions, iouReportID),
148-
initialValue: [],
149-
});
146+
const [transactions] = useOnyx(ONYXKEYS.COLLECTION.TRANSACTION);
150147
const [transactionViolations] = useOnyx(ONYXKEYS.COLLECTION.TRANSACTION_VIOLATIONS);
151148
const [userWallet] = useOnyx(ONYXKEYS.USER_WALLET);
152149
const [invoiceReceiverPolicy] = useOnyx(
@@ -160,6 +157,7 @@ function ReportPreview({
160157
const styles = useThemeStyles();
161158
const {translate} = useLocalize();
162159
const {isOffline} = useNetwork();
160+
const allTransactions = useMemo(() => getAllReportTransactions(iouReportID, transactions), [iouReportID, transactions]);
163161

164162
const {hasMissingSmartscanFields, areAllRequestsBeingSmartScanned, hasOnlyTransactionsWithPendingRoutes, hasNonReimbursableTransactions} = useMemo(
165163
() => ({
@@ -181,8 +179,8 @@ function ReportPreview({
181179

182180
const getCanIOUBePaid = useCallback(
183181
(onlyShowPayElsewhere = false, shouldCheckApprovedState = true) =>
184-
canIOUBePaidIOUActions(iouReport, chatReport, policy, transactions, onlyShowPayElsewhere, undefined, undefined, shouldCheckApprovedState),
185-
[iouReport, chatReport, policy, transactions],
182+
canIOUBePaidIOUActions(iouReport, chatReport, policy, allTransactions, onlyShowPayElsewhere, undefined, undefined, shouldCheckApprovedState),
183+
[iouReport, chatReport, policy, allTransactions],
186184
);
187185

188186
const canIOUBePaid = useMemo(() => getCanIOUBePaid(), [getCanIOUBePaid]);
@@ -219,7 +217,7 @@ function ReportPreview({
219217
const isInvoiceRoom = isInvoiceRoomReportUtils(chatReport);
220218

221219
const canAllowSettlement = hasUpdatedTotal(iouReport, policy);
222-
const numberOfRequests = transactions?.length ?? 0;
220+
const numberOfRequests = allTransactions.length;
223221
const transactionsWithReceipts = getTransactionsWithReceipts(iouReportID);
224222
const numberOfScanningReceipts = transactionsWithReceipts.filter((transaction) => isReceiptBeingScanned(transaction)).length;
225223
const numberOfPendingRequests = transactionsWithReceipts.filter((transaction) => isPending(transaction) && isCardTransaction(transaction)).length;
@@ -234,14 +232,13 @@ function ReportPreview({
234232
hasWarningTypeViolations(iouReportID, transactionViolations, true) ||
235233
(isReportOwner(iouReport) && hasReportViolations(iouReportID)) ||
236234
hasActionsWithErrors(iouReportID);
237-
const lastThreeTransactions = transactions?.slice(-3) ?? [];
238-
const lastTransaction = transactions?.at(0);
235+
const lastThreeTransactions = allTransactions.slice(-3);
239236
const lastThreeReceipts = lastThreeTransactions.map((transaction) => ({...getThumbnailAndImageURIs(transaction), transaction}));
240-
const showRTERViolationMessage = numberOfRequests === 1 && hasPendingUI(lastTransaction, getTransactionViolations(lastTransaction?.transactionID, transactionViolations));
241-
const transactionIDList = [lastTransaction?.transactionID].filter((transactionID): transactionID is string => transactionID !== undefined);
237+
const showRTERViolationMessage = numberOfRequests === 1 && hasPendingUI(allTransactions.at(0), getTransactionViolations(allTransactions.at(0)?.transactionID, transactionViolations));
238+
const transactionIDList = [allTransactions.at(0)?.transactionID].filter((transactionID): transactionID is string => transactionID !== undefined);
242239
const shouldShowBrokenConnectionViolation = numberOfRequests === 1 && shouldShowBrokenConnectionViolationTransactionUtils(transactionIDList, iouReport, policy);
243-
let formattedMerchant = numberOfRequests === 1 ? getMerchant(lastTransaction) : null;
244-
const formattedDescription = numberOfRequests === 1 ? getDescription(lastTransaction) : null;
240+
let formattedMerchant = numberOfRequests === 1 ? getMerchant(allTransactions.at(0)) : null;
241+
const formattedDescription = numberOfRequests === 1 ? getDescription(allTransactions.at(0)) : null;
245242

246243
if (isPartialMerchant(formattedMerchant ?? '')) {
247244
formattedMerchant = null;
@@ -426,7 +423,7 @@ function ReportPreview({
426423
const shouldShowScanningSubtitle = (numberOfScanningReceipts === 1 && numberOfRequests === 1) || (numberOfScanningReceipts >= 1 && Number(nonHeldAmount) === 0);
427424
const shouldShowPendingSubtitle = numberOfPendingRequests === 1 && numberOfRequests === 1;
428425

429-
const isPayAtEndExpense = isPayAtEndExpenseReport(iouReportID, transactions);
426+
const isPayAtEndExpense = isPayAtEndExpenseReport(iouReportID, allTransactions);
430427
const [archiveReason] = useOnyx(`${ONYXKEYS.COLLECTION.REPORT_ACTIONS}${iouReportID}`, {selector: getArchiveReason});
431428

432429
const getPendingMessageProps: () => PendingMessageProps = () => {
@@ -548,7 +545,7 @@ function ReportPreview({
548545
{lastThreeReceipts.length > 0 && (
549546
<ReportActionItemImages
550547
images={lastThreeReceipts}
551-
total={numberOfRequests}
548+
total={allTransactions.length}
552549
size={CONST.RECEIPT.MAX_REPORT_PREVIEW_RECEIPTS}
553550
/>
554551
)}

src/libs/IOUUtils.ts

Lines changed: 7 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -3,14 +3,13 @@ import type {IOUAction, IOUType} from '@src/CONST';
33
import CONST from '@src/CONST';
44
import ONYXKEYS from '@src/ONYXKEYS';
55
import ROUTES from '@src/ROUTES';
6-
import type {OnyxInputOrEntry, PersonalDetails, Report} from '@src/types/onyx';
6+
import type {OnyxInputOrEntry, PersonalDetails, Report, Transaction} from '@src/types/onyx';
77
import type {Attendee} from '@src/types/onyx/IOU';
88
import type {IOURequestType} from './actions/IOU';
9-
import {getCurrencyUnit} from './CurrencyUtils';
9+
import * as CurrencyUtils from './CurrencyUtils';
1010
import DateUtils from './DateUtils';
1111
import Navigation from './Navigation/Navigation';
12-
import {getReportTransactions} from './ReportUtils';
13-
import {getCurrency, getTagArrayFromName} from './TransactionUtils';
12+
import * as TransactionUtils from './TransactionUtils';
1413

1514
let lastLocationPermissionPrompt: string;
1615
Onyx.connect({
@@ -48,7 +47,7 @@ function navigateToStartMoneyRequestStep(requestType: IOURequestType, iouType: I
4847
function calculateAmount(numberOfParticipants: number, total: number, currency: string, isDefaultUser = false): number {
4948
// Since the backend can maximum store 2 decimal places, any currency with more than 2 decimals
5049
// has to be capped to 2 decimal places
51-
const currencyUnit = Math.min(100, getCurrencyUnit(currency));
50+
const currencyUnit = Math.min(100, CurrencyUtils.getCurrencyUnit(currency));
5251
const totalInCurrencySubunit = (total / 100) * currencyUnit;
5352
const totalParticipants = numberOfParticipants + 1;
5453
const amountPerPerson = Math.round(totalInCurrencySubunit / totalParticipants);
@@ -119,8 +118,8 @@ function updateIOUOwnerAndTotal<TReport extends OnyxInputOrEntry<Report>>(
119118
* that are either created or cancelled offline, and thus haven't been converted to the report's currency yet
120119
*/
121120
function isIOUReportPendingCurrencyConversion(iouReport: Report): boolean {
122-
const reportTransactions = getReportTransactions(iouReport.reportID);
123-
const pendingRequestsInDifferentCurrency = reportTransactions.filter((transaction) => transaction.pendingAction && getCurrency(transaction) !== iouReport.currency);
121+
const reportTransactions: Transaction[] = TransactionUtils.getAllReportTransactions(iouReport.reportID);
122+
const pendingRequestsInDifferentCurrency = reportTransactions.filter((transaction) => transaction.pendingAction && TransactionUtils.getCurrency(transaction) !== iouReport.currency);
124123
return pendingRequestsInDifferentCurrency.length > 0;
125124
}
126125

@@ -151,7 +150,7 @@ function isValidMoneyRequestType(iouType: string): boolean {
151150
* @returns
152151
*/
153152
function insertTagIntoTransactionTagsString(transactionTags: string, tag: string, tagIndex: number): string {
154-
const tagArray = getTagArrayFromName(transactionTags);
153+
const tagArray = TransactionUtils.getTagArrayFromName(transactionTags);
155154
tagArray[tagIndex] = tag;
156155

157156
while (tagArray.length > 0 && !tagArray.at(-1)) {

src/libs/ReportUtils.ts

Lines changed: 4 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -157,6 +157,7 @@ import {
157157
wasActionTakenByCurrentUser,
158158
} from './ReportActionsUtils';
159159
import {
160+
getAllReportTransactions,
160161
getAttendees,
161162
getBillable,
162163
getCardID,
@@ -900,14 +901,6 @@ function getReportOrDraftReport(reportID: string | undefined): OnyxEntry<Report>
900901
return allReports?.[`${ONYXKEYS.COLLECTION.REPORT}${reportID}`] ?? allReportsDraft?.[`${ONYXKEYS.COLLECTION.REPORT_DRAFT}${reportID}`];
901902
}
902903

903-
function reportTransactionsSelector(transactions: OnyxCollection<Transaction>, reportID: string | undefined): Transaction[] {
904-
if (!transactions || !reportID) {
905-
return [];
906-
}
907-
908-
return Object.values(transactions).filter((transaction): transaction is Transaction => !!transaction && transaction.reportID === reportID);
909-
}
910-
911904
function getReportTransactions(reportID: string | undefined): Transaction[] {
912905
if (!reportID) {
913906
return [];
@@ -1915,7 +1908,7 @@ function isPayAtEndExpenseReport(reportID: string | undefined, transactions: Tra
19151908
return false;
19161909
}
19171910

1918-
return isPayAtEndExpense(transactions?.[0] ?? getReportTransactions(reportID).at(0));
1911+
return isPayAtEndExpense(transactions?.[0] ?? getAllReportTransactions(reportID).at(0));
19191912
}
19201913

19211914
/**
@@ -3009,7 +3002,7 @@ function getReasonAndReportActionThatRequiresAttention(
30093002

30103003
const iouReportActionToApproveOrPay = getIOUReportActionToApproveOrPay(optionOrReport, optionOrReport.reportID);
30113004
const iouReportID = getIOUReportIDFromReportActionPreview(iouReportActionToApproveOrPay);
3012-
const transactions = getReportTransactions(iouReportID);
3005+
const transactions = getAllReportTransactions(iouReportID);
30133006
const hasOnlyPendingTransactions = transactions.length > 0 && transactions.every((t) => isExpensifyCardTransaction(t) && isPending(t));
30143007

30153008
// Has a child report that is awaiting action (e.g. approve, pay, add bank account) from current user
@@ -3753,7 +3746,7 @@ function getReportPreviewMessage(
37533746
return reportActionMessage;
37543747
}
37553748

3756-
const allReportTransactions = getReportTransactions(report.reportID);
3749+
const allReportTransactions = getAllReportTransactions(report.reportID);
37573750
const transactionsWithReceipts = allReportTransactions.filter(hasReceiptTransactionUtils);
37583751
const numberOfScanningReceipts = transactionsWithReceipts.filter(isReceiptBeingScanned).length;
37593752

@@ -8987,8 +8980,6 @@ export {
89878980
getReportFieldKey,
89888981
getReportIDFromLink,
89898982
getReportName,
8990-
getReportTransactions,
8991-
reportTransactionsSelector,
89928983
getReportNotificationPreference,
89938984
getReportOfflinePendingActionAndErrors,
89948985
getReportParticipantsTitle,

src/libs/TransactionUtils/index.ts

Lines changed: 10 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -26,7 +26,7 @@ import {
2626
isPolicyAdmin,
2727
} from '@libs/PolicyUtils';
2828
import {getOriginalMessage, getReportAction, isMoneyRequestAction} from '@libs/ReportActionsUtils';
29-
import {getReportTransactions, isOpenExpenseReport, isProcessingReport, isReportApproved, isSettled, isThread} from '@libs/ReportUtils';
29+
import {isOpenExpenseReport, isProcessingReport, isReportApproved, isSettled, isThread} from '@libs/ReportUtils';
3030
import type {IOURequestType} from '@userActions/IOU';
3131
import CONST from '@src/CONST';
3232
import type {IOUType} from '@src/CONST';
@@ -69,7 +69,6 @@ type BuildOptimisticTransactionParams = {
6969
};
7070

7171
let allTransactions: OnyxCollection<Transaction> = {};
72-
7372
Onyx.connect({
7473
key: ONYXKEYS.COLLECTION.TRANSACTION,
7574
waitForCollectionCallback: true,
@@ -837,6 +836,13 @@ function hasRoute(transaction: OnyxEntry<Transaction>, isDistanceRequestType?: b
837836
return !!transaction?.routes?.route0?.geometry?.coordinates || (!!isDistanceRequestType && !!transaction?.comment?.customUnit?.quantity);
838837
}
839838

839+
function getAllReportTransactions(reportID?: string, transactions?: OnyxCollection<Transaction>): Transaction[] {
840+
const reportTransactions: Transaction[] = Object.values(transactions ?? allTransactions ?? {}).filter(
841+
(transaction): transaction is Transaction => !!transaction && transaction.reportID === reportID,
842+
);
843+
return reportTransactions;
844+
}
845+
840846
function waypointHasValidAddress(waypoint: RecentWaypoint | Waypoint): boolean {
841847
return !!waypoint?.address?.trim();
842848
}
@@ -1353,7 +1359,7 @@ function getCategoryTaxCodeAndAmount(category: string, transaction: OnyxEntry<Tr
13531359
* Return the sorted list transactions of an iou report
13541360
*/
13551361
function getAllSortedTransactions(iouReportID?: string): Array<OnyxEntry<Transaction>> {
1356-
return getReportTransactions(iouReportID).sort((transA, transB) => {
1362+
return getAllReportTransactions(iouReportID).sort((transA, transB) => {
13571363
if (transA.created < transB.created) {
13581364
return -1;
13591365
}
@@ -1401,6 +1407,7 @@ export {
14011407
getTagArrayFromName,
14021408
getTagForDisplay,
14031409
getTransactionViolations,
1410+
getAllReportTransactions,
14041411
hasReceipt,
14051412
hasEReceipt,
14061413
hasRoute,

src/libs/actions/IOU.ts

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -107,7 +107,6 @@ import {
107107
getPersonalDetailsForAccountID,
108108
getReportNameValuePairs,
109109
getReportOrDraftReport,
110-
getReportTransactions,
111110
getTransactionDetails,
112111
hasHeldExpenses as hasHeldExpensesReportUtils,
113112
hasNonReimbursableTransactions as hasNonReimbursableTransactionsReportUtils,
@@ -137,6 +136,7 @@ import {shouldRestrictUserBillableActions} from '@libs/SubscriptionUtils';
137136
import {
138137
allHavePendingRTERViolation,
139138
buildOptimisticTransaction,
139+
getAllReportTransactions,
140140
getAmount,
141141
getCategoryTaxCodeAndAmount,
142142
getCurrency,
@@ -7635,7 +7635,7 @@ function getPayMoneyRequestParams(
76357635

76367636
// Optimistically unhold all transactions if we pay all requests
76377637
if (full) {
7638-
const reportTransactions = getReportTransactions(iouReport?.reportID);
7638+
const reportTransactions = getAllReportTransactions(iouReport?.reportID);
76397639
for (const transaction of reportTransactions) {
76407640
optimisticData.push({
76417641
onyxMethod: Onyx.METHOD.MERGE,
@@ -7759,7 +7759,7 @@ function canApproveIOU(
77597759
const reportNameValuePairs = chatReportRNVP ?? getReportNameValuePairs(iouReport?.reportID);
77607760
const isArchivedExpenseReport = isArchivedReport(reportNameValuePairs);
77617761
let isTransactionBeingScanned = false;
7762-
const reportTransactions = getReportTransactions(iouReport?.reportID);
7762+
const reportTransactions = getAllReportTransactions(iouReport?.reportID);
77637763
for (const transaction of reportTransactions) {
77647764
const hasReceipt = hasReceiptTransactionUtils(transaction);
77657765
const isReceiptBeingScanned = isReceiptBeingScannedTransactionUtils(transaction);

src/libs/actions/Policy/Policy.ts

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -75,6 +75,7 @@ import * as PhoneNumber from '@libs/PhoneNumber';
7575
import * as PolicyUtils from '@libs/PolicyUtils';
7676
import {navigateWhenEnableFeature} from '@libs/PolicyUtils';
7777
import * as ReportUtils from '@libs/ReportUtils';
78+
import {getAllReportTransactions} from '@libs/TransactionUtils';
7879
import type {PolicySelector} from '@pages/home/sidebar/SidebarScreen/FloatingActionButtonAndPopover';
7980
import * as PaymentMethods from '@userActions/PaymentMethods';
8081
import * as PersistedRequests from '@userActions/PersistedRequests';
@@ -2598,7 +2599,7 @@ function createWorkspaceFromIOUPayment(iouReport: OnyxEntry<Report>): WorkspaceF
25982599
});
25992600

26002601
// The expense report transactions need to have the amount reversed to negative values
2601-
const reportTransactions = ReportUtils.getReportTransactions(iouReportID);
2602+
const reportTransactions = getAllReportTransactions(iouReportID);
26022603

26032604
// For performance reasons, we are going to compose a merge collection data for transactions
26042605
const transactionsOptimisticData: Record<string, Transaction> = {};

0 commit comments

Comments
 (0)