Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
46 commits
Select commit Hold shift + click to select a range
c376da1
create derived value for transactions by report
TMisiukiewicz May 30, 2025
e5ba3bf
wip: report transactions derived value
TMisiukiewicz Jun 3, 2025
80be218
Merge remote-tracking branch 'upstream/main' into perf/create-report-…
TMisiukiewicz Jun 4, 2025
bc5c2f6
wip: update components to use derived value
TMisiukiewicz Jun 4, 2025
1d19487
replace selectAllTransactionsForReport
TMisiukiewicz Jun 4, 2025
131b89b
use derived value in report utils
TMisiukiewicz Jun 4, 2025
d55f2ea
Merge remote-tracking branch 'upstream/main' into perf/create-report-…
TMisiukiewicz Jun 5, 2025
831d437
remove selectAllTransactionsForReport from ReportActionsView
TMisiukiewicz Jun 5, 2025
e4aa0d3
cleanup transaction calls
TMisiukiewicz Jun 5, 2025
ab3d3e5
pass entire reportTransactions down in the tree
TMisiukiewicz Jun 5, 2025
4e45d88
fix passing transactions down in report screen
TMisiukiewicz Jun 5, 2025
be3ca61
pass empty object as default
TMisiukiewicz Jun 5, 2025
341636b
reduce diff
TMisiukiewicz Jun 5, 2025
828838b
Merge remote-tracking branch 'upstream/main' into perf/create-report-…
TMisiukiewicz Jun 5, 2025
7eac09a
use getAllNonDeletedTransactions
TMisiukiewicz Jun 5, 2025
cf1b396
Merge branch 'main' into perf/create-report-transactions-derived-value
TMisiukiewicz Jun 6, 2025
0ed4520
pass violations through derived value
TMisiukiewicz Jun 6, 2025
50bb61d
rename derived value
TMisiukiewicz Jun 6, 2025
2388d48
unify format of holding transactions and transactions violations
TMisiukiewicz Jun 6, 2025
ed435b4
atomic updates on derived value
TMisiukiewicz Jun 6, 2025
976143e
Merge branch 'main' into perf/create-report-transactions-derived-value
TMisiukiewicz Jun 6, 2025
6e56c16
fix typechecks in tests
TMisiukiewicz Jun 9, 2025
8d43b4f
fix IOUTest
TMisiukiewicz Jun 9, 2025
070ec83
cleanup MoneyRequestReportPreviewContentProps
TMisiukiewicz Jun 9, 2025
24a54b8
bring back report utils change
TMisiukiewicz Jun 9, 2025
2876533
update IOUTest
TMisiukiewicz Jun 9, 2025
8c14b10
fix lint changed
TMisiukiewicz Jun 9, 2025
8732669
Merge branch 'main' into perf/create-report-transactions-derived-value
TMisiukiewicz Jun 10, 2025
d95779c
Merge branch 'main' into perf/create-report-transactions-derived-value
TMisiukiewicz Jun 11, 2025
dfaf0ae
Merge remote-tracking branch 'upstream/main' into perf/create-report-…
TMisiukiewicz Jun 13, 2025
48a49fa
pass transactions by report in MoneyRequestReportPreview tests
TMisiukiewicz Jun 13, 2025
88736c9
iterate through array of transactions
TMisiukiewicz Jun 13, 2025
014f745
fix MoneyRequestReportPreview test
TMisiukiewicz Jun 13, 2025
80a22f9
fix ReportPreviewTest
TMisiukiewicz Jun 13, 2025
ab34769
Merge remote-tracking branch 'upstream/main' into perf/create-report-…
TMisiukiewicz Jun 13, 2025
db7e699
remove defaults in useOnyx
TMisiukiewicz Jun 13, 2025
73aba68
fix crash when transactions are undefined
TMisiukiewicz Jun 13, 2025
8e04a10
Merge remote-tracking branch 'upstream/main' into perf/create-report-…
TMisiukiewicz Jun 16, 2025
9bfcdee
Merge remote-tracking branch 'upstream/main' into perf/create-report-…
TMisiukiewicz Jun 17, 2025
b11d6ce
Merge remote-tracking branch 'upstream/main' into perf/create-report-…
TMisiukiewicz Jun 18, 2025
079f1d7
replace reduce with for of
TMisiukiewicz Jun 18, 2025
2527d6e
Merge remote-tracking branch 'upstream/main' into perf/create-report-…
TMisiukiewicz Jun 20, 2025
ee77303
fix lint changed
TMisiukiewicz Jun 20, 2025
3190c25
Merge remote-tracking branch 'upstream/main' into perf/create-report-…
TMisiukiewicz Jun 23, 2025
029b316
Merge remote-tracking branch 'upstream/main' into perf/create-report-…
TMisiukiewicz Jun 24, 2025
6b25e51
Merge branch 'main' into perf/create-report-transactions-derived-value
TMisiukiewicz Jun 25, 2025
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 2 additions & 0 deletions src/ONYXKEYS.ts
Original file line number Diff line number Diff line change
Expand Up @@ -849,6 +849,7 @@ const ONYXKEYS = {
},
DERIVED: {
REPORT_ATTRIBUTES: 'reportAttributes',
REPORT_TRANSACTIONS_AND_VIOLATIONS: 'reportTransactionsAndViolations',
},
} as const;

Expand Down Expand Up @@ -1202,6 +1203,7 @@ type OnyxValuesMapping = {

type OnyxDerivedValuesMapping = {
[ONYXKEYS.DERIVED.REPORT_ATTRIBUTES]: OnyxTypes.ReportAttributesDerivedValue;
[ONYXKEYS.DERIVED.REPORT_TRANSACTIONS_AND_VIOLATIONS]: OnyxTypes.ReportTransactionsAndViolationsDerivedValue;
};

type OnyxValues = OnyxValuesMapping & OnyxCollectionValuesMapping & OnyxFormValuesMapping & OnyxFormDraftValuesMapping & OnyxDerivedValuesMapping;
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -82,8 +82,8 @@ type MoneyRequestReportListProps = {
/** Array of report actions for this report */
reportActions?: OnyxTypes.ReportAction[];

/** List of transactions belonging to this report */
transactions?: OnyxTypes.Transaction[];
/** All transactions grouped by reportID */
transactionsAndViolationsByReport: OnyxTypes.ReportTransactionsAndViolationsDerivedValue;

/** List of transactions that arrived when the report was open */
newTransactions: OnyxTypes.Transaction[];
Expand All @@ -109,7 +109,7 @@ function MoneyRequestReportActionsList({
report,
policy,
reportActions = [],
transactions = [],
transactionsAndViolationsByReport,
newTransactions,
hasNewerActions,
hasOlderActions,
Expand All @@ -124,7 +124,9 @@ function MoneyRequestReportActionsList({
const [isVisible, setIsVisible] = useState(Visibility.isVisible);
const isFocused = useIsFocused();
const route = useRoute<PlatformStackRouteProp<ReportsSplitNavigatorParamList, typeof SCREENS.REPORT>>();
const reportTransactionIDs = transactions.map((transaction) => transaction.transactionID);
const {transactions: reportTransactions} = transactionsAndViolationsByReport[report.reportID] ?? {};
const transactions = useMemo(() => Object.values(reportTransactions ?? {}) ?? [], [reportTransactions]);
const reportTransactionIDs = useMemo(() => transactions.map((transaction) => transaction.transactionID), [transactions]);
const [chatReport] = useOnyx(`${ONYXKEYS.COLLECTION.REPORT}${getNonEmptyStringOnyxID(report?.chatReportID)}`, {canBeMissing: true});

const reportID = report?.reportID;
Expand Down Expand Up @@ -484,6 +486,7 @@ function MoneyRequestReportActionsList({
isFirstVisibleReportAction={firstVisibleReportActionID === reportAction.reportActionID}
shouldHideThreadDividerLine
linkedReportActionID={linkedReportActionID}
transactionsAndViolationsByReport={transactionsAndViolationsByReport}
/>
);
},
Expand All @@ -497,6 +500,7 @@ function MoneyRequestReportActionsList({
unreadMarkerReportActionID,
firstVisibleReportActionID,
linkedReportActionID,
transactionsAndViolationsByReport,
allReports,
],
);
Expand Down
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
import {PortalHost} from '@gorhom/portal';
import React, {useCallback, useMemo} from 'react';
import {InteractionManager, View} from 'react-native';
import type {OnyxCollection, OnyxEntry} from 'react-native-onyx';
import type {OnyxEntry} from 'react-native-onyx';
import {useOnyx} from 'react-native-onyx';
import HeaderGap from '@components/HeaderGap';
import MoneyReportHeader from '@components/MoneyReportHeader';
Expand All @@ -16,14 +16,15 @@ import useThemeStyles from '@hooks/useThemeStyles';
import {removeFailedReport} from '@libs/actions/Report';
import getNonEmptyStringOnyxID from '@libs/getNonEmptyStringOnyxID';
import Log from '@libs/Log';
import {selectAllTransactionsForReport, shouldDisplayReportTableView, shouldWaitForTransactions as shouldWaitForTransactionsUtil} from '@libs/MoneyRequestReportUtils';
import {shouldDisplayReportTableView, shouldWaitForTransactions as shouldWaitForTransactionsUtil} from '@libs/MoneyRequestReportUtils';
import navigationRef from '@libs/Navigation/navigationRef';
import {getFilteredReportActionsForReportView, getOneTransactionThreadReportID, isMoneyRequestAction} from '@libs/ReportActionsUtils';
import {canEditReportAction, getReportOfflinePendingActionAndErrors, isReportTransactionThread} from '@libs/ReportUtils';
import {buildCannedSearchQuery} from '@libs/SearchQueryUtils';
import Navigation from '@navigation/Navigation';
import ReportActionsView from '@pages/home/report/ReportActionsView';
import ReportFooter from '@pages/home/report/ReportFooter';
import CONST from '@src/CONST';
import NAVIGATORS from '@src/NAVIGATORS';
import ONYXKEYS from '@src/ONYXKEYS';
import type {Route} from '@src/ROUTES';
Expand All @@ -47,6 +48,9 @@ type MoneyRequestReportViewProps = {

/** The `backTo` route that should be used when clicking back button */
backToRoute: Route | undefined;

/** All transactions grouped by reportID */
transactionsAndViolationsByReport: OnyxTypes.ReportTransactionsAndViolationsDerivedValue;
};

function goBackFromSearchMoneyRequest() {
Expand Down Expand Up @@ -84,7 +88,7 @@ function getParentReportAction(parentReportActions: OnyxEntry<OnyxTypes.ReportAc
return parentReportActions[parentReportActionID];
}

function MoneyRequestReportView({report, policy, reportMetadata, shouldDisplayReportFooter, backToRoute}: MoneyRequestReportViewProps) {
function MoneyRequestReportView({report, policy, reportMetadata, shouldDisplayReportFooter, backToRoute, transactionsAndViolationsByReport = {}}: MoneyRequestReportViewProps) {
const styles = useThemeStyles();
const {isOffline} = useNetwork();

Expand All @@ -97,11 +101,8 @@ function MoneyRequestReportView({report, policy, reportMetadata, shouldDisplayRe
const {reportActions: unfilteredReportActions, hasNewerActions, hasOlderActions} = usePaginatedReportActions(reportID);
const reportActions = getFilteredReportActionsForReportView(unfilteredReportActions);

const [transactions] = useOnyx(ONYXKEYS.COLLECTION.TRANSACTION, {
selector: (allTransactions: OnyxCollection<OnyxTypes.Transaction>) => selectAllTransactionsForReport(allTransactions, reportID, reportActions),
canBeMissing: true,
});

const {transactions: reportTransactions} = transactionsAndViolationsByReport[reportID ?? CONST.DEFAULT_NUMBER_ID];
const transactions = useMemo(() => Object.values(reportTransactions ?? {}) ?? [], [reportTransactions]);
const reportTransactionIDs = transactions?.map((transaction) => transaction.transactionID);
const transactionThreadReportID = getOneTransactionThreadReportID(report, chatReport, reportActions ?? [], isOffline, reportTransactionIDs);

Expand Down Expand Up @@ -217,7 +218,7 @@ function MoneyRequestReportView({report, policy, reportMetadata, shouldDisplayRe
<MoneyRequestReportActionsList
report={report}
policy={policy}
transactions={transactions}
transactionsAndViolationsByReport={transactionsAndViolationsByReport}
newTransactions={newTransactions}
reportActions={reportActions}
hasOlderActions={hasOlderActions}
Expand All @@ -233,6 +234,7 @@ function MoneyRequestReportView({report, policy, reportMetadata, shouldDisplayRe
hasOlderActions={hasOlderActions}
parentReportAction={parentReportAction}
transactionThreadReportID={transactionThreadReportID}
transactionsAndViolationsByReport={transactionsAndViolationsByReport}
/>
)}
{shouldDisplayReportFooter ? (
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -2,8 +2,8 @@ import React, {useCallback, useMemo, useState} from 'react';
import type {LayoutChangeEvent, ListRenderItem} from 'react-native';
import {useOnyx} from 'react-native-onyx';
import TransactionPreview from '@components/ReportActionItem/TransactionPreview';
import useNetwork from '@hooks/useNetwork';
import usePolicy from '@hooks/usePolicy';
import useReportWithTransactionsAndViolations from '@hooks/useReportWithTransactionsAndViolations';
import useResponsiveLayout from '@hooks/useResponsiveLayout';
import useStyleUtils from '@hooks/useStyleUtils';
import useThemeStyles from '@hooks/useThemeStyles';
Expand Down Expand Up @@ -35,6 +35,7 @@ function MoneyRequestReportPreview({
shouldDisplayContextMenu = true,
isInvoice = false,
shouldShowBorder,
transactionsAndViolationsByReport,
}: MoneyRequestReportPreviewProps) {
const styles = useThemeStyles();
const StyleUtils = useStyleUtils();
Expand All @@ -49,8 +50,12 @@ function MoneyRequestReportPreview({
personalDetails?.[chatReport?.invoiceReceiver && 'accountID' in chatReport.invoiceReceiver ? chatReport.invoiceReceiver.accountID : CONST.DEFAULT_NUMBER_ID],
canBeMissing: true,
});
const [iouReport, transactions, violations] = useReportWithTransactionsAndViolations(iouReportID);
const [iouReport] = useOnyx(`${ONYXKEYS.COLLECTION.REPORT}${iouReportID}`, {canBeMissing: true});
const {transactions: reportTransactions, violations} = transactionsAndViolationsByReport[iouReportID ?? CONST.DEFAULT_NUMBER_ID] ?? {};
const {isOffline} = useNetwork();
const filteredTransactions = Object.values(reportTransactions ?? {}).filter((transaction) => isOffline || transaction?.pendingAction !== CONST.RED_BRICK_ROAD_PENDING_ACTION.DELETE);
const policy = usePolicy(policyID);
const transactions = useMemo(() => Object.values(filteredTransactions ?? {}) ?? [], [filteredTransactions]);
const lastTransaction = transactions?.at(0);
const lastTransactionViolations = useTransactionViolations(lastTransaction?.transactionID);
const isTrackExpenseAction = isTrackExpenseActionReportActionsUtils(action);
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,7 @@ import type {LayoutChangeEvent, ListRenderItem, StyleProp, ViewStyle} from 'reac
import type {OnyxCollection, OnyxEntry} from 'react-native-onyx';
import type {TransactionPreviewStyleType} from '@components/ReportActionItem/TransactionPreview/types';
import type {ContextMenuAnchor} from '@pages/home/report/ContextMenu/ReportActionContextMenu';
import type {PersonalDetails, Policy, Report, ReportAction, Transaction, TransactionViolation, TransactionViolations} from '@src/types/onyx';
import type {PersonalDetails, Policy, Report, ReportAction, ReportTransactionsAndViolationsDerivedValue, Transaction, TransactionViolation, TransactionViolations} from '@src/types/onyx';

type TransactionPreviewStyle = {
[key in keyof TransactionPreviewStyleType]: number;
Expand Down Expand Up @@ -56,6 +56,9 @@ type MoneyRequestReportPreviewProps = {

/** Whether to show a border to separate Reports Chat Item and Money Request Report Preview */
shouldShowBorder?: boolean;

/** All transactions grouped by reportID */
transactionsAndViolationsByReport: ReportTransactionsAndViolationsDerivedValue;
};

type MoneyRequestReportPreviewContentOnyxProps = {
Expand All @@ -70,7 +73,7 @@ type MoneyRequestReportPreviewContentOnyxProps = {
};

type MoneyRequestReportPreviewContentProps = MoneyRequestReportPreviewContentOnyxProps &
Omit<MoneyRequestReportPreviewProps, 'policyID'> & {
Omit<MoneyRequestReportPreviewProps, 'policyID' | 'transactionsAndViolationsByReport'> & {
/** Extra styles passed used by MoneyRequestReportPreviewContent */
reportPreviewStyles: MoneyRequestReportPreviewStyleType;

Expand Down
8 changes: 6 additions & 2 deletions src/components/ReportActionItem/TripRoomPreview.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -28,7 +28,7 @@ import variables from '@styles/variables';
import * as Expensicons from '@src/components/Icon/Expensicons';
import CONST from '@src/CONST';
import ROUTES from '@src/ROUTES';
import type {Report, ReportAction} from '@src/types/onyx';
import type {Report, ReportAction, ReportTransactionsAndViolationsDerivedValue} from '@src/types/onyx';
import type {Reservation} from '@src/types/onyx/Transaction';

type TripRoomPreviewProps = {
Expand All @@ -55,6 +55,9 @@ type TripRoomPreviewProps = {

/** Whether context menu should be shown on press */
shouldDisplayContextMenu?: boolean;

/** The transactions for the report */
transactionsAndViolationsByReport: ReportTransactionsAndViolationsDerivedValue;
};

type ReservationViewProps = {
Expand Down Expand Up @@ -148,11 +151,12 @@ function TripRoomPreview({
isHovered = false,
checkIfContextMenuActive = () => {},
shouldDisplayContextMenu = true,
transactionsAndViolationsByReport,
}: TripRoomPreviewProps) {
const styles = useThemeStyles();
const {translate} = useLocalize();
const chatReportID = chatReport?.reportID;
const tripTransactions = useTripTransactions(chatReportID);
const tripTransactions = useTripTransactions(chatReportID, transactionsAndViolationsByReport);

const reservationsData: ReservationData[] = getReservationsFromTripTransactions(tripTransactions);
const dateInfo =
Expand Down
36 changes: 0 additions & 36 deletions src/hooks/useReportWithTransactionsAndViolations.ts

This file was deleted.

20 changes: 6 additions & 14 deletions src/hooks/useTripTransactions.ts
Original file line number Diff line number Diff line change
@@ -1,6 +1,7 @@
import {useOnyx} from 'react-native-onyx';
import CONST from '@src/CONST';
import ONYXKEYS from '@src/ONYXKEYS';
import type {Transaction} from '@src/types/onyx';
import type {ReportTransactionsAndViolationsDerivedValue, Transaction} from '@src/types/onyx';

/**
* Hook to fetch transactions associated with a specific `tripRoom` report.
Expand All @@ -12,26 +13,17 @@ import type {Transaction} from '@src/types/onyx';
* @param reportID - The trip room's reportID.
* @returns Transactions linked to the specified trip room.
*/
function useTripTransactions(reportID: string | undefined): Transaction[] {
function useTripTransactions(reportID: string | undefined, transactionsAndViolationsByReport: ReportTransactionsAndViolationsDerivedValue): Transaction[] {
const [tripTransactionReportIDs = []] = useOnyx(ONYXKEYS.COLLECTION.REPORT, {
selector: (reports) =>
Object.values(reports ?? {})
.filter((report) => report && report.chatReportID === reportID)
.map((report) => report?.reportID),
canBeMissing: true,
});
const [tripTransactions = []] = useOnyx(
ONYXKEYS.COLLECTION.TRANSACTION,
{
selector: (transactions) => {
if (!tripTransactionReportIDs.length) {
return [];
}
const {transactions} = transactionsAndViolationsByReport[reportID ?? CONST.DEFAULT_NUMBER_ID] ?? {};
const tripTransactions = tripTransactionReportIDs.flatMap((transactionReportID) => transactions?.[`${ONYXKEYS.COLLECTION.TRANSACTION}${transactionReportID}`] ?? []);

return Object.values(transactions ?? {}).filter((transaction): transaction is Transaction => !!transaction && tripTransactionReportIDs.includes(transaction.reportID));
},
},
[tripTransactionReportIDs],
);
return tripTransactions;
}

Expand Down
17 changes: 6 additions & 11 deletions src/libs/MoneyRequestReportUtils.ts
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
import type {OnyxCollection, OnyxEntry} from 'react-native-onyx';
import type {OnyxEntry} from 'react-native-onyx';
import type {ValueOf} from 'type-fest';
import type {TransactionListItemType} from '@components/SelectionList/types';
import CONST from '@src/CONST';
Expand Down Expand Up @@ -69,20 +69,15 @@ function getReportIDForTransaction(transactionItem: TransactionListItemType) {
}

/**
* Filters all available transactions and returns the ones that belong to a specific report (by `reportID`).
* It is used as an onyx selector, to make sure that report related views do not process all transactions in onyx.
* Filters all available transactions and returns the ones that belong to not removed parent action.
*/
function selectAllTransactionsForReport(transactions: OnyxCollection<Transaction>, reportID: string | undefined, reportActions: ReportAction[]) {
if (!reportID) {
return [];
}

return Object.values(transactions ?? {}).filter((transaction): transaction is Transaction => {
function getAllNonDeletedTransactions(transactions: Transaction[], reportActions: ReportAction[]) {
return transactions.filter((transaction): transaction is Transaction => {
if (!transaction) {
return false;
}
const action = getIOUActionForTransactionID(reportActions, transaction.transactionID);
return transaction.reportID === reportID && !isDeletedParentAction(action);
return !isDeletedParentAction(action);
});
}

Expand Down Expand Up @@ -164,7 +159,7 @@ export {
getThreadReportIDsForTransactions,
getReportIDForTransaction,
getTotalAmountForIOUReportPreviewButton,
selectAllTransactionsForReport,
getAllNonDeletedTransactions,
isSingleTransactionReport,
shouldDisplayReportTableView,
shouldWaitForTransactions,
Expand Down
2 changes: 2 additions & 0 deletions src/libs/actions/OnyxDerived/ONYX_DERIVED_VALUES.ts
Original file line number Diff line number Diff line change
@@ -1,6 +1,7 @@
import type {ValueOf} from 'type-fest';
import ONYXKEYS from '@src/ONYXKEYS';
import reportAttributesConfig from './configs/reportAttributes';
import reportTransactionsAndViolationsConfig from './configs/reportTransactionsAndViolations';
import type {OnyxDerivedValueConfig} from './types';

/**
Expand All @@ -9,6 +10,7 @@ import type {OnyxDerivedValueConfig} from './types';
*/
const ONYX_DERIVED_VALUES = {
[ONYXKEYS.DERIVED.REPORT_ATTRIBUTES]: reportAttributesConfig,
[ONYXKEYS.DERIVED.REPORT_TRANSACTIONS_AND_VIOLATIONS]: reportTransactionsAndViolationsConfig,
} as const satisfies {
// eslint-disable-next-line @typescript-eslint/no-explicit-any
[Key in ValueOf<typeof ONYXKEYS.DERIVED>]: OnyxDerivedValueConfig<Key, any>;
Expand Down
Loading
Loading