Skip to content

Commit ebd6a6a

Browse files
authored
Merge pull request #68557 from Expensify/amy-revert-67065
[CP Staging] Revert: Perf/reduce useonyx calls in list item level
2 parents b72e7bb + a083eb6 commit ebd6a6a

7 files changed

Lines changed: 35 additions & 62 deletions

File tree

src/components/MoneyRequestHeader.tsx

Lines changed: 4 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,7 @@ import useOnyx from '@hooks/useOnyx';
1111
import useResponsiveLayout from '@hooks/useResponsiveLayout';
1212
import useTheme from '@hooks/useTheme';
1313
import useThemeStyles from '@hooks/useThemeStyles';
14+
import useTransactionViolations from '@hooks/useTransactionViolations';
1415
import {deleteMoneyRequest, deleteTrackExpense, initSplitExpense} from '@libs/actions/IOU';
1516
import {setupMergeTransactionData} from '@libs/actions/MergeTransaction';
1617
import Navigation from '@libs/Navigation/Navigation';
@@ -33,7 +34,7 @@ import CONST from '@src/CONST';
3334
import ONYXKEYS from '@src/ONYXKEYS';
3435
import ROUTES from '@src/ROUTES';
3536
import SCREENS from '@src/SCREENS';
36-
import type {Policy, Report, ReportAction, TransactionViolation} from '@src/types/onyx';
37+
import type {Policy, Report, ReportAction} from '@src/types/onyx';
3738
import type IconAsset from '@src/types/utils/IconAsset';
3839
import isLoadingOnyxValue from '@src/types/utils/isLoadingOnyxValue';
3940
import BrokenConnectionDescription from './BrokenConnectionDescription';
@@ -64,12 +65,9 @@ type MoneyRequestHeaderProps = {
6465

6566
/** Method to trigger when pressing close button of the header */
6667
onBackButtonPress: () => void;
67-
68-
/** Precomputed violations for the transaction */
69-
transactionViolations?: TransactionViolation[];
7068
};
7169

72-
function MoneyRequestHeader({report, parentReportAction, policy, onBackButtonPress, transactionViolations = []}: MoneyRequestHeaderProps) {
70+
function MoneyRequestHeader({report, parentReportAction, policy, onBackButtonPress}: MoneyRequestHeaderProps) {
7371
// We need to use isSmallScreenWidth instead of shouldUseNarrowLayout to use a correct layout for the hold expense modal https://github.com/Expensify/App/pull/47990#issuecomment-2362382026
7472
// eslint-disable-next-line rulesdir/prefer-shouldUseNarrowLayout-instead-of-isSmallScreenWidth
7573
const {shouldUseNarrowLayout, isSmallScreenWidth} = useResponsiveLayout();
@@ -83,6 +81,7 @@ function MoneyRequestHeader({report, parentReportAction, policy, onBackButtonPre
8381
}`,
8482
{canBeMissing: true},
8583
);
84+
const transactionViolations = useTransactionViolations(transaction?.transactionID);
8685
const {duplicateTransactions, duplicateTransactionViolations} = useDuplicateTransactionsAndViolations(transaction?.transactionID ? [transaction.transactionID] : []);
8786
const [isDeleteModalVisible, setIsDeleteModalVisible] = useState(false);
8887
const [downloadErrorModalVisible, setDownloadErrorModalVisible] = useState(false);

src/components/MoneyRequestReportView/MoneyRequestReportTransactionList.tsx

Lines changed: 1 addition & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -13,7 +13,6 @@ import Text from '@components/Text';
1313
import useCopySelectionHelper from '@hooks/useCopySelectionHelper';
1414
import useLocalize from '@hooks/useLocalize';
1515
import useMobileSelectionMode from '@hooks/useMobileSelectionMode';
16-
import useReportWithTransactionsAndViolations from '@hooks/useReportWithTransactionsAndViolations';
1716
import useResponsiveLayout from '@hooks/useResponsiveLayout';
1817
import useStyleUtils from '@hooks/useStyleUtils';
1918
import useThemeStyles from '@hooks/useThemeStyles';
@@ -101,7 +100,6 @@ function MoneyRequestReportTransactionList({
101100
const styles = useThemeStyles();
102101
const StyleUtils = useStyleUtils();
103102
const {translate, localeCompare} = useLocalize();
104-
const [, , violations] = useReportWithTransactionsAndViolations(report.reportID);
105103
// eslint-disable-next-line rulesdir/prefer-shouldUseNarrowLayout-instead-of-isSmallScreenWidth
106104
const {shouldUseNarrowLayout, isSmallScreenWidth, isMediumScreenWidth} = useResponsiveLayout();
107105
const [isModalVisible, setIsModalVisible] = useState(false);
@@ -159,9 +157,8 @@ function MoneyRequestReportTransactionList({
159157
.map((transaction) => ({
160158
...transaction,
161159
shouldBeHighlighted: newTransactions?.includes(transaction),
162-
violations: violations?.[transaction.transactionID] ?? [],
163160
}));
164-
}, [newTransactions, sortBy, sortOrder, transactions, localeCompare, violations]);
161+
}, [newTransactions, sortBy, sortOrder, transactions, localeCompare]);
165162

166163
const navigateToTransaction = useCallback(
167164
(activeTransactionID: string) => {

src/components/MoneyRequestReportView/MoneyRequestReportView.tsx

Lines changed: 24 additions & 31 deletions
Original file line numberDiff line numberDiff line change
@@ -19,7 +19,7 @@ import getNonEmptyStringOnyxID from '@libs/getNonEmptyStringOnyxID';
1919
import Log from '@libs/Log';
2020
import {getAllNonDeletedTransactions, shouldDisplayReportTableView, shouldWaitForTransactions as shouldWaitForTransactionsUtil} from '@libs/MoneyRequestReportUtils';
2121
import navigationRef from '@libs/Navigation/navigationRef';
22-
import {getFilteredReportActionsForReportView, getOneTransactionThreadReportID, getTransactionIDFromReportAction, isMoneyRequestAction} from '@libs/ReportActionsUtils';
22+
import {getFilteredReportActionsForReportView, getOneTransactionThreadReportID, isMoneyRequestAction} from '@libs/ReportActionsUtils';
2323
import {canEditReportAction, getReportOfflinePendingActionAndErrors, isReportTransactionThread} from '@libs/ReportUtils';
2424
import {buildCannedSearchQuery} from '@libs/SearchQueryUtils';
2525
import Navigation from '@navigation/Navigation';
@@ -99,7 +99,7 @@ function MoneyRequestReportView({report, policy, reportMetadata, shouldDisplayRe
9999
const {reportActions: unfilteredReportActions, hasNewerActions, hasOlderActions} = usePaginatedReportActions(reportID);
100100
const reportActions = getFilteredReportActionsForReportView(unfilteredReportActions);
101101

102-
const {transactions: reportTransactions, violations: reportViolations} = useTransactionsAndViolationsForReport(reportID);
102+
const {transactions: reportTransactions} = useTransactionsAndViolationsForReport(reportID);
103103
const transactions = useMemo(() => getAllNonDeletedTransactions(reportTransactions, reportActions), [reportTransactions, reportActions]);
104104

105105
const visibleTransactions = transactions?.filter((transaction) => isOffline || transaction.pendingAction !== CONST.RED_BRICK_ROAD_PENDING_ACTION.DELETE);
@@ -133,18 +133,13 @@ function MoneyRequestReportView({report, policy, reportMetadata, shouldDisplayRe
133133
const isEmptyTransactionReport = visibleTransactions && visibleTransactions.length === 0 && transactionThreadReportID === undefined;
134134
const shouldDisplayMoneyRequestActionsList = !!isEmptyTransactionReport || shouldDisplayReportTableView(report, visibleTransactions ?? []);
135135

136-
const reportHeaderView = useMemo(() => {
137-
if (isTransactionThreadView) {
138-
// Extract transaction ID from parent report action to get specific violations
139-
const transactionID = getTransactionIDFromReportAction(parentReportAction);
140-
const transactionViolations = transactionID && reportViolations ? reportViolations[transactionID] : undefined;
141-
142-
return (
136+
const reportHeaderView = useMemo(
137+
() =>
138+
isTransactionThreadView ? (
143139
<MoneyRequestHeader
144140
report={report}
145141
policy={policy}
146142
parentReportAction={parentReportAction}
147-
transactionViolations={transactionViolations}
148143
onBackButtonPress={() => {
149144
if (!backToRoute) {
150145
goBackFromSearchMoneyRequest();
@@ -153,27 +148,25 @@ function MoneyRequestReportView({report, policy, reportMetadata, shouldDisplayRe
153148
Navigation.goBack(backToRoute);
154149
}}
155150
/>
156-
);
157-
}
158-
159-
return (
160-
<MoneyReportHeader
161-
report={report}
162-
policy={policy}
163-
reportActions={reportActions}
164-
transactionThreadReportID={transactionThreadReportID}
165-
isLoadingInitialReportActions={isLoadingInitialReportActions}
166-
shouldDisplayBackButton
167-
onBackButtonPress={() => {
168-
if (!backToRoute) {
169-
goBackFromSearchMoneyRequest();
170-
return;
171-
}
172-
Navigation.goBack(backToRoute);
173-
}}
174-
/>
175-
);
176-
}, [backToRoute, isLoadingInitialReportActions, isTransactionThreadView, parentReportAction, policy, report, reportActions, reportViolations, transactionThreadReportID]);
151+
) : (
152+
<MoneyReportHeader
153+
report={report}
154+
policy={policy}
155+
reportActions={reportActions}
156+
transactionThreadReportID={transactionThreadReportID}
157+
isLoadingInitialReportActions={isLoadingInitialReportActions}
158+
shouldDisplayBackButton
159+
onBackButtonPress={() => {
160+
if (!backToRoute) {
161+
goBackFromSearchMoneyRequest();
162+
return;
163+
}
164+
Navigation.goBack(backToRoute);
165+
}}
166+
/>
167+
),
168+
[backToRoute, isLoadingInitialReportActions, isTransactionThreadView, parentReportAction, policy, report, reportActions, transactionThreadReportID],
169+
);
177170

178171
if (!!(isLoadingInitialReportActions && reportActions.length === 0 && !isOffline) || shouldWaitForTransactions) {
179172
return <InitialLoadingSkeleton styles={styles} />;

src/components/TransactionItemRow/TransactionItemRowRBRWithOnyx.tsx

Lines changed: 5 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -8,11 +8,12 @@ import useLocalize from '@hooks/useLocalize';
88
import useOnyx from '@hooks/useOnyx';
99
import useTheme from '@hooks/useTheme';
1010
import useThemeStyles from '@hooks/useThemeStyles';
11+
import useTransactionViolations from '@hooks/useTransactionViolations';
1112
import {getIOUActionForTransactionID} from '@libs/ReportActionsUtils';
1213
import ViolationsUtils from '@libs/Violations/ViolationsUtils';
1314
import variables from '@styles/variables';
1415
import ONYXKEYS from '@src/ONYXKEYS';
15-
import type {Report, TransactionViolation} from '@src/types/onyx';
16+
import type {Report} from '@src/types/onyx';
1617
import type Transaction from '@src/types/onyx/Transaction';
1718

1819
type TransactionItemRowRBRProps = {
@@ -27,13 +28,11 @@ type TransactionItemRowRBRProps = {
2728

2829
/** Error message for missing required fields in the transaction */
2930
missingFieldError?: string;
30-
31-
/** Precomputed violations for the transaction */
32-
violations?: TransactionViolation[];
3331
};
3432

35-
function TransactionItemRowRBRWithOnyx({transaction, report, containerStyles, missingFieldError, violations = []}: TransactionItemRowRBRProps) {
33+
function TransactionItemRowRBRWithOnyx({transaction, report, containerStyles, missingFieldError}: TransactionItemRowRBRProps) {
3634
const styles = useThemeStyles();
35+
const transactionViolations = useTransactionViolations(transaction?.transactionID, false);
3736
const {translate} = useLocalize();
3837
const theme = useTheme();
3938
const [reportActions] = useOnyx(`${ONYXKEYS.COLLECTION.REPORT_ACTIONS}${transaction.reportID}`, {
@@ -45,7 +44,7 @@ function TransactionItemRowRBRWithOnyx({transaction, report, containerStyles, mi
4544
canBeMissing: true,
4645
});
4746

48-
const RBRMessages = ViolationsUtils.getRBRMessages(transaction, violations, translate, missingFieldError, Object.values(transactionThreadActions ?? {}), policyTags);
47+
const RBRMessages = ViolationsUtils.getRBRMessages(transaction, transactionViolations, translate, missingFieldError, Object.values(transactionThreadActions ?? {}), policyTags);
4948

5049
return (
5150
RBRMessages.length > 0 && (

src/components/TransactionItemRow/index.tsx

Lines changed: 0 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -453,7 +453,6 @@ function TransactionItemRow({
453453
report={report}
454454
containerStyles={[styles.mt2, styles.minHeight4]}
455455
missingFieldError={missingFieldError}
456-
violations={transactionItem.violations}
457456
/>
458457
)}
459458
</View>
@@ -502,7 +501,6 @@ function TransactionItemRow({
502501
transaction={transactionItem}
503502
report={report}
504503
missingFieldError={missingFieldError}
505-
violations={transactionItem.violations}
506504
/>
507505
)}
508506
</View>

src/libs/ReportActionsUtils.ts

Lines changed: 0 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -267,13 +267,6 @@ function getOriginalMessage<T extends ReportActionName>(reportAction: OnyxInputO
267267
return reportAction.originalMessage;
268268
}
269269

270-
/**
271-
* Get the transaction ID from a money request report action
272-
*/
273-
function getTransactionIDFromReportAction(reportAction: OnyxInputOrEntry<ReportAction>): string | undefined {
274-
return isMoneyRequestAction(reportAction) ? getOriginalMessage(reportAction)?.IOUTransactionID : undefined;
275-
}
276-
277270
function isExportIntegrationAction(reportAction: OnyxInputOrEntry<ReportAction>): reportAction is ReportAction<typeof CONST.REPORT.ACTIONS.TYPE.EXPORTED_TO_INTEGRATION> {
278271
return reportAction?.actionName === CONST.REPORT.ACTIONS.TYPE.EXPORTED_TO_INTEGRATION;
279272
}
@@ -3013,7 +3006,6 @@ export {
30133006
getSortedReportActionsForDisplay,
30143007
getTextFromHtml,
30153008
getTrackExpenseActionableWhisper,
3016-
getTransactionIDFromReportAction,
30173009
getWhisperedTo,
30183010
hasRequestFromCurrentAccount,
30193011
isActionOfType,

src/pages/home/ReportScreen.tsx

Lines changed: 1 addition & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -43,7 +43,6 @@ import {
4343
getCombinedReportActions,
4444
getFilteredReportActionsForReportView,
4545
getOneTransactionThreadReportID,
46-
getTransactionIDFromReportAction,
4746
isCreatedAction,
4847
isDeletedParentAction,
4948
isMoneyRequestAction,
@@ -296,7 +295,7 @@ function ReportScreen({route, navigation}: ReportScreenProps) {
296295
// If the count is too high (equal to or exceeds the web pagination size / 50) and there are no cached messages in the report,
297296
// OpenReport will be called each time the user scrolls up the report a bit, clicks on report preview, and then goes back.
298297
const isLinkedMessagePageReady = isLinkedMessageAvailable && (reportActions.length - indexOfLinkedMessage >= CONST.REPORT.MIN_INITIAL_REPORT_ACTION_COUNT || doesCreatedActionExists());
299-
const {transactions: allReportTransactions, violations: allReportViolations} = useTransactionsAndViolationsForReport(reportIDFromRoute);
298+
const {transactions: allReportTransactions} = useTransactionsAndViolationsForReport(reportIDFromRoute);
300299

301300
const reportTransactions = useMemo(() => getAllNonDeletedTransactions(allReportTransactions, reportActions), [allReportTransactions, reportActions]);
302301
// wrapping in useMemo because this is array operation and can cause performance issues
@@ -371,16 +370,12 @@ function ReportScreen({route, navigation}: ReportScreenProps) {
371370
);
372371

373372
if (isTransactionThreadView) {
374-
const transactionID = getTransactionIDFromReportAction(parentReportAction);
375-
const transactionViolations = transactionID && allReportViolations ? allReportViolations[transactionID] : undefined;
376-
377373
headerView = (
378374
<MoneyRequestHeader
379375
report={report}
380376
policy={policy}
381377
parentReportAction={parentReportAction}
382378
onBackButtonPress={onBackButtonPress}
383-
transactionViolations={transactionViolations}
384379
/>
385380
);
386381
}

0 commit comments

Comments
 (0)