Skip to content

Commit c357be7

Browse files
authored
Merge pull request Expensify#55264 from software-mansion-labs/fix/get-trip-transactions
Remove the getTripTransactions method
2 parents c257d31 + c513ffd commit c357be7

File tree

6 files changed

+64
-31
lines changed

6 files changed

+64
-31
lines changed

src/components/ReportActionItem/TripDetailsView.tsx

Lines changed: 9 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -15,10 +15,11 @@ import Navigation from '@libs/Navigation/Navigation';
1515
import variables from '@styles/variables';
1616
import * as Expensicons from '@src/components/Icon/Expensicons';
1717
import CONST from '@src/CONST';
18-
import * as ReportUtils from '@src/libs/ReportUtils';
19-
import * as TripReservationUtils from '@src/libs/TripReservationUtils';
18+
import type {ReservationData} from '@src/libs/TripReservationUtils';
19+
import {getReservationsFromTripTransactions, getTripReservationIcon} from '@src/libs/TripReservationUtils';
2020
import ROUTES from '@src/ROUTES';
2121
import type {Reservation, ReservationTimeDetails} from '@src/types/onyx/Transaction';
22+
import type Transaction from '@src/types/onyx/Transaction';
2223

2324
type ReservationViewProps = {
2425
reservation: Reservation;
@@ -33,7 +34,7 @@ function ReservationView({reservation, transactionID, tripRoomReportID, reservat
3334
const StyleUtils = useStyleUtils();
3435
const {shouldUseNarrowLayout} = useResponsiveLayout();
3536

36-
const reservationIcon = TripReservationUtils.getTripReservationIcon(reservation.type);
37+
const reservationIcon = getTripReservationIcon(reservation.type);
3738

3839
const formatAirportInfo = (reservationTimeDetails: ReservationTimeDetails) => {
3940
const longName = reservationTimeDetails?.longName ? `${reservationTimeDetails?.longName} ` : '';
@@ -140,14 +141,16 @@ type TripDetailsViewProps = {
140141

141142
/** Whether we should display the horizontal rule below the component */
142143
shouldShowHorizontalRule: boolean;
144+
145+
/** Trip transactions associated with the report */
146+
tripTransactions: Transaction[];
143147
};
144148

145-
function TripDetailsView({tripRoomReportID, shouldShowHorizontalRule}: TripDetailsViewProps) {
149+
function TripDetailsView({tripRoomReportID, shouldShowHorizontalRule, tripTransactions}: TripDetailsViewProps) {
146150
const styles = useThemeStyles();
147151
const {translate} = useLocalize();
148152

149-
const tripTransactions = ReportUtils.getTripTransactions(tripRoomReportID);
150-
const reservationsData: TripReservationUtils.ReservationData[] = TripReservationUtils.getReservationsFromTripTransactions(tripTransactions);
153+
const reservationsData: ReservationData[] = getReservationsFromTripTransactions(tripTransactions);
151154

152155
return (
153156
<View>

src/components/ReportActionItem/TripRoomPreview.tsx

Lines changed: 15 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -13,13 +13,15 @@ import useLocalize from '@hooks/useLocalize';
1313
import useStyleUtils from '@hooks/useStyleUtils';
1414
import useTheme from '@hooks/useTheme';
1515
import useThemeStyles from '@hooks/useThemeStyles';
16+
import useTripTransactions from '@hooks/useTripTransactions';
1617
import ControlSelection from '@libs/ControlSelection';
17-
import * as CurrencyUtils from '@libs/CurrencyUtils';
18+
import {convertToDisplayString} from '@libs/CurrencyUtils';
1819
import DateUtils from '@libs/DateUtils';
19-
import * as DeviceCapabilities from '@libs/DeviceCapabilities';
20+
import {canUseTouchScreen} from '@libs/DeviceCapabilities';
2021
import Navigation from '@libs/Navigation/Navigation';
21-
import * as ReportUtils from '@libs/ReportUtils';
22-
import * as TripReservationUtils from '@libs/TripReservationUtils';
22+
import {getMoneyRequestSpendBreakdown} from '@libs/ReportUtils';
23+
import type {ReservationData} from '@libs/TripReservationUtils';
24+
import {getReservationsFromTripTransactions, getTripReservationIcon} from '@libs/TripReservationUtils';
2325
import type {ContextMenuAnchor} from '@pages/home/report/ContextMenu/ReportActionContextMenu';
2426
import variables from '@styles/variables';
2527
import * as Expensicons from '@src/components/Icon/Expensicons';
@@ -59,7 +61,7 @@ function ReservationView({reservation}: ReservationViewProps) {
5961
const StyleUtils = useStyleUtils();
6062
const {translate} = useLocalize();
6163

62-
const reservationIcon = TripReservationUtils.getTripReservationIcon(reservation.type);
64+
const reservationIcon = getTripReservationIcon(reservation.type);
6365
const title = reservation.type === CONST.RESERVATION_TYPE.CAR ? reservation.carInfo?.name : reservation.start.longName;
6466

6567
let titleComponent = (
@@ -109,27 +111,27 @@ function ReservationView({reservation}: ReservationViewProps) {
109111
);
110112
}
111113

112-
const renderItem = ({item}: {item: TripReservationUtils.ReservationData}) => <ReservationView reservation={item.reservation} />;
114+
const renderItem = ({item}: {item: ReservationData}) => <ReservationView reservation={item.reservation} />;
113115

114116
function TripRoomPreview({action, chatReportID, containerStyles, contextMenuAnchor, isHovered = false, checkIfContextMenuActive = () => {}}: TripRoomPreviewProps) {
115117
const styles = useThemeStyles();
116118
const {translate} = useLocalize();
117119
const [chatReport] = useOnyx(`${ONYXKEYS.COLLECTION.REPORT}${chatReportID}`);
118120
const [iouReport] = useOnyx(`${ONYXKEYS.COLLECTION.REPORT}${chatReport?.iouReportID}`);
121+
const tripTransactions = useTripTransactions(chatReportID);
119122

120-
const tripTransactions = ReportUtils.getTripTransactions(chatReport?.reportID);
121-
const reservationsData: TripReservationUtils.ReservationData[] = TripReservationUtils.getReservationsFromTripTransactions(tripTransactions);
123+
const reservationsData: ReservationData[] = getReservationsFromTripTransactions(tripTransactions);
122124
const dateInfo = chatReport?.tripData ? DateUtils.getFormattedDateRange(new Date(chatReport.tripData.startDate), new Date(chatReport.tripData.endDate)) : '';
123-
const {totalDisplaySpend} = ReportUtils.getMoneyRequestSpendBreakdown(chatReport);
125+
const {totalDisplaySpend} = getMoneyRequestSpendBreakdown(chatReport);
124126

125127
const currency = iouReport?.currency ?? chatReport?.currency;
126128
const displayAmount = useMemo(() => {
127129
if (totalDisplaySpend) {
128-
return CurrencyUtils.convertToDisplayString(totalDisplaySpend, currency);
130+
return convertToDisplayString(totalDisplaySpend, currency);
129131
}
130132

131-
return CurrencyUtils.convertToDisplayString(
132-
tripTransactions.reduce((acc, transaction) => acc + Math.abs(transaction.amount), 0),
133+
return convertToDisplayString(
134+
tripTransactions?.reduce((acc, transaction) => acc + Math.abs(transaction.amount), 0),
133135
currency,
134136
);
135137
}, [currency, totalDisplaySpend, tripTransactions]);
@@ -142,7 +144,7 @@ function TripRoomPreview({action, chatReportID, containerStyles, contextMenuAnch
142144
>
143145
<View style={[styles.chatItemMessage, containerStyles]}>
144146
<PressableWithoutFeedback
145-
onPressIn={() => DeviceCapabilities.canUseTouchScreen() && ControlSelection.block()}
147+
onPressIn={() => canUseTouchScreen() && ControlSelection.block()}
146148
onPressOut={() => ControlSelection.unblock()}
147149
onLongPress={(event) => showContextMenuForReport(event, contextMenuAnchor, chatReportID, action, checkIfContextMenuActive)}
148150
shouldUseHapticsOnLongPress

src/hooks/useTripTransactions.ts

Lines changed: 35 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,35 @@
1+
import {useOnyx} from 'react-native-onyx';
2+
import ONYXKEYS from '@src/ONYXKEYS';
3+
import type {Transaction} from '@src/types/onyx';
4+
5+
/**
6+
* Hook to fetch transactions associated with a specific `tripRoom` report.
7+
*
8+
* Since trip rooms and their transactions lack a direct connection, this hook
9+
* fetches all child reports and transactions from Onyx and filters them to derive
10+
* relevant transactions for the given trip room.
11+
*
12+
* @param reportID - The trip room's reportID.
13+
* @returns Transactions linked to the specified trip room.
14+
*/
15+
function useTripTransactions(reportID: string | undefined): Transaction[] {
16+
const [tripTransactionReportIDs = []] = useOnyx(ONYXKEYS.COLLECTION.REPORT, {
17+
selector: (reports) =>
18+
Object.values(reports ?? {})
19+
.filter((report) => report && report.chatReportID === reportID)
20+
.map((report) => report?.reportID),
21+
});
22+
const [tripTransactions = []] = useOnyx(ONYXKEYS.COLLECTION.TRANSACTION, {
23+
selector: (transactions) => {
24+
if (!tripTransactionReportIDs.length) {
25+
return [];
26+
}
27+
28+
return Object.values(transactions ?? {}).filter((transaction): transaction is Transaction => !!transaction && tripTransactionReportIDs.includes(transaction.reportID));
29+
},
30+
});
31+
32+
return tripTransactions;
33+
}
34+
35+
export default useTripTransactions;

src/libs/ReportUtils.ts

Lines changed: 0 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -8328,13 +8328,6 @@ function shouldCreateNewMoneyRequestReport(existingIOUReport: OnyxInputOrEntry<R
83288328
return !existingIOUReport || hasIOUWaitingOnCurrentUserBankAccount(chatReport) || !canAddTransaction(existingIOUReport);
83298329
}
83308330

8331-
function getTripTransactions(tripRoomReportID: string | undefined, reportFieldToCompare: 'parentReportID' | 'reportID' = 'parentReportID'): Transaction[] {
8332-
const tripTransactionReportIDs = Object.values(allReports ?? {})
8333-
.filter((report) => report && report?.[reportFieldToCompare] === tripRoomReportID)
8334-
.map((report) => report?.reportID);
8335-
return tripTransactionReportIDs.flatMap((reportID) => getReportTransactions(reportID));
8336-
}
8337-
83388331
function getTripIDFromTransactionParentReportID(transactionParentReportID: string | undefined): string | undefined {
83398332
return getReportOrDraftReport(transactionParentReportID)?.tripData?.tripID;
83408333
}
@@ -9135,7 +9128,6 @@ export {
91359128
updateOptimisticParentReportAction,
91369129
updateReportPreview,
91379130
temporary_getMoneyRequestOptions,
9138-
getTripTransactions,
91399131
getTripIDFromTransactionParentReportID,
91409132
buildOptimisticInvoiceReport,
91419133
getInvoiceChatByParticipants,

src/pages/home/report/ReportActionsListItemRenderer.tsx

Lines changed: 2 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
import React, {memo, useMemo} from 'react';
22
import type {OnyxEntry} from 'react-native-onyx';
33
import {getOriginalMessage, isSentMoneyReportAction, isTransactionThread} from '@libs/ReportActionsUtils';
4-
import {getTripTransactions, isChatThread, isInvoiceRoom, isPolicyExpenseChat, isTripRoom} from '@libs/ReportUtils';
4+
import {isChatThread, isInvoiceRoom, isPolicyExpenseChat, isTripRoom} from '@libs/ReportUtils';
55
import CONST from '@src/CONST';
66
import type {Report, ReportAction} from '@src/types/onyx';
77
import ReportActionItem from './ReportActionItem';
@@ -144,9 +144,7 @@ function ReportActionsListItemRenderer({
144144

145145
const shouldDisplayParentAction =
146146
reportAction.actionName === CONST.REPORT.ACTIONS.TYPE.CREATED && (!isTransactionThread(parentReportAction) || isSentMoneyReportAction(parentReportAction));
147-
148-
const tripTransactions = getTripTransactions(report?.reportID);
149-
const shouldDisplayTripSummary = shouldDisplayParentAction && isTripRoom(report) && tripTransactions.length > 0;
147+
const shouldDisplayTripSummary = shouldDisplayParentAction && isTripRoom(report);
150148

151149
if (shouldDisplayTripSummary) {
152150
return <TripSummary report={report} />;

src/pages/home/report/TripSummary.tsx

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,7 @@ import type {OnyxEntry} from 'react-native-onyx';
44
import OfflineWithFeedback from '@components/OfflineWithFeedback';
55
import TripDetailsView from '@components/ReportActionItem/TripDetailsView';
66
import useThemeStyles from '@hooks/useThemeStyles';
7+
import useTripTransactions from '@hooks/useTripTransactions';
78
import type * as OnyxTypes from '@src/types/onyx';
89
import AnimatedEmptyStateBackground from './AnimatedEmptyStateBackground';
910
import RepliesDivider from './RepliesDivider';
@@ -15,6 +16,7 @@ type TripSummaryProps = {
1516

1617
function TripSummary({report}: TripSummaryProps) {
1718
const styles = useThemeStyles();
19+
const tripTransactions = useTripTransactions(report?.reportID);
1820

1921
if (!report?.reportID) {
2022
return null;
@@ -26,6 +28,7 @@ function TripSummary({report}: TripSummaryProps) {
2628
<OfflineWithFeedback pendingAction={report.pendingAction}>
2729
<TripDetailsView
2830
tripRoomReportID={report.reportID}
31+
tripTransactions={tripTransactions}
2932
shouldShowHorizontalRule={false}
3033
/>
3134
</OfflineWithFeedback>

0 commit comments

Comments
 (0)