Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
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
31 changes: 10 additions & 21 deletions src/components/MoneyRequestReportView/MoneyRequestReportView.tsx
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
import React, {useCallback} 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 @@ -14,9 +14,10 @@ import useThemeStyles from '@hooks/useThemeStyles';
import {removeFailedReport} from '@libs/actions/Report';
import getNonEmptyStringOnyxID from '@libs/getNonEmptyStringOnyxID';
import Log from '@libs/Log';
import {selectAllTransactionsForReport} from '@libs/MoneyRequestReportUtils';
import navigationRef from '@libs/Navigation/navigationRef';
import {getIOUActionForTransactionID, getOneTransactionThreadReportID, isDeletedParentAction, isMoneyRequestAction} from '@libs/ReportActionsUtils';
import {canEditReportAction, getReportOfflinePendingActionAndErrors} from '@libs/ReportUtils';
import {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';
Expand Down Expand Up @@ -82,20 +83,6 @@ function getParentReportAction(parentReportActions: OnyxEntry<OnyxTypes.ReportAc
return parentReportActions[parentReportActionID];
}

function selectTransactionsForReportID(transactions: OnyxCollection<OnyxTypes.Transaction>, reportID: string | undefined, reportActions: OnyxTypes.ReportAction[]) {
if (!reportID) {
return [];
}

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

function MoneyRequestReportView({report, policy, reportMetadata, shouldDisplayReportFooter, backToRoute}: MoneyRequestReportViewProps) {
const styles = useThemeStyles();
const {isOffline} = useNetwork();
Expand All @@ -110,10 +97,9 @@ function MoneyRequestReportView({report, policy, reportMetadata, shouldDisplayRe
const transactionThreadReportID = getOneTransactionThreadReportID(reportID, reportActions ?? [], isOffline);

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

const [parentReportAction] = useOnyx(`${ONYXKEYS.COLLECTION.REPORT_ACTIONS}${getNonEmptyStringOnyxID(report?.parentReportID)}`, {
canEvict: false,
Expand Down Expand Up @@ -161,6 +147,10 @@ function MoneyRequestReportView({report, policy, reportMetadata, shouldDisplayRe
);
}

// Special case handling a report that is a transaction thread
// If true we will use standard `ReportActionsView` to display report data, anything else is handled via `MoneyRequestReportActionsList`
const isTransactionThreadView = isReportTransactionThread(report);

return (
<View style={styles.flex1}>
<OfflineWithFeedback
Expand Down Expand Up @@ -188,8 +178,7 @@ function MoneyRequestReportView({report, policy, reportMetadata, shouldDisplayRe
}}
/>
<View style={[styles.overflowHidden, styles.flex1]}>
{shouldUseSingleTransactionView ? (
// This component originally lives in ReportScreen, it is used here to handle the case when the report has a single transaction. Any other case will be handled by MoneyRequestReportActionsList
{isTransactionThreadView ? (
<ReportActionsView
report={report}
reportActions={reportActions}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -86,7 +86,6 @@ const FixIconPadding = <View style={{height: variables.iconSizeNormal}} />;

function MoneyRequestReportPreviewContent({
iouReportID,
policyID,
chatReportID,
action,
containerStyles,
Expand All @@ -105,12 +104,13 @@ function MoneyRequestReportPreviewContent({
invoiceReceiverPersonalDetail,
lastTransactionViolations,
isDelegateAccessRestricted,
renderItem,
getCurrentWidth,
renderTransactionItem,
onLayout,
reportPreviewStyles,
shouldDisplayContextMenu = true,
isInvoice,
shouldShowBorder = false,
onPress,
}: MoneyRequestReportPreviewContentProps) {
const lastTransaction = transactions?.at(0);
const transactionIDList = transactions?.map((reportTransaction) => reportTransaction.transactionID) ?? [];
Expand Down Expand Up @@ -405,7 +405,7 @@ function MoneyRequestReportPreviewContent({
</View>
);
}
return renderItem(itemInfo);
return renderTransactionItem(itemInfo);
};

// The button should expand up to transaction width
Expand Down Expand Up @@ -440,10 +440,10 @@ function MoneyRequestReportPreviewContent({
>
<View
style={[styles.chatItemMessage, containerStyles]}
onLayout={getCurrentWidth}
onLayout={onLayout}
>
<PressableWithoutFeedback
onPress={() => {}}
onPress={onPress}
onPressIn={() => canUseTouchScreen() && ControlSelection.block()}
onPressOut={() => ControlSelection.unblock()}
onLongPress={(event) => {
Expand Down Expand Up @@ -580,7 +580,6 @@ function MoneyRequestReportPreviewContent({
onAnimationFinish={stopAnimation}
formattedAmount={getTotalAmountForIOUReportPreviewButton(iouReport, policy, buttonType)}
currency={iouReport?.currency}
policyID={policyID}
chatReportID={chatReportID}
iouReport={iouReport}
wrapperStyle={buttonMaxWidth}
Expand Down Expand Up @@ -625,7 +624,7 @@ function MoneyRequestReportPreviewContent({
text={translate('common.review', {
amount: shouldShowSettlementButton ? getTotalAmountForIOUReportPreviewButton(iouReport, policy, buttonType) : '',
})}
onPress={() => {}}
onPress={onPress}
style={buttonMaxWidth}
/>
)}
Expand All @@ -647,7 +646,6 @@ function MoneyRequestReportPreviewContent({
isNoDelegateAccessMenuVisible={isNoDelegateAccessMenuVisible}
onClose={() => setIsNoDelegateAccessMenuVisible(false)}
/>

{isHoldMenuVisible && !!iouReport && !!requestType && (
<ProcessMoneyReportHoldMenu
nonHeldAmount={!hasOnlyHeldExpenses && hasValidNonHeldAmount ? nonHeldAmount : undefined}
Expand Down
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
import React, {useMemo, useState} from 'react';
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';
Expand All @@ -9,9 +9,14 @@ import useResponsiveLayout from '@hooks/useResponsiveLayout';
import useStyleUtils from '@hooks/useStyleUtils';
import useThemeStyles from '@hooks/useThemeStyles';
import useTransactionViolations from '@hooks/useTransactionViolations';
import Performance from '@libs/Performance';
import {getIOUActionForReportID, isSplitBillAction as isSplitBillActionReportActionsUtils, isTrackExpenseAction as isTrackExpenseActionReportActionsUtils} from '@libs/ReportActionsUtils';
import Navigation from '@navigation/Navigation';
import {contextMenuRef} from '@pages/home/report/ContextMenu/ReportActionContextMenu';
import Timing from '@userActions/Timing';
import CONST from '@src/CONST';
import ONYXKEYS from '@src/ONYXKEYS';
import ROUTES from '@src/ROUTES';
import type {Transaction} from '@src/types/onyx';
import MoneyRequestReportPreviewContent from './MoneyRequestReportPreviewContent';
import type {MoneyRequestReportPreviewProps} from './types';
Expand Down Expand Up @@ -58,6 +63,16 @@ function MoneyRequestReportPreview({
[StyleUtils, currentWidth, shouldUseNarrowLayout, transactions.length],
);

const openReportFromPreview = useCallback(() => {
if (!iouReportID || contextMenuRef.current?.isContextMenuOpening) {
return;
}

Performance.markStart(CONST.TIMING.OPEN_REPORT_FROM_PREVIEW);
Timing.start(CONST.TIMING.OPEN_REPORT_FROM_PREVIEW);
Navigation.navigate(ROUTES.REPORT_WITH_ID.getRoute(iouReportID));
}, [iouReportID]);

const renderItem: ListRenderItem<Transaction> = ({item}) => (
<TransactionPreview
chatReportID={chatReportID}
Expand All @@ -69,43 +84,42 @@ function MoneyRequestReportPreview({
isWhisper={isWhisper}
isHovered={isHovered}
iouReportID={iouReportID}
onPreviewPressed={() => {}}
wrapperStyle={reportPreviewStyles.transactionPreviewStyle}
containerStyles={[styles.h100, containerStyles]}
containerStyles={[styles.h100, reportPreviewStyles.transactionPreviewStyle, containerStyles]}
transactionPreviewWidth={reportPreviewStyles.transactionPreviewStyle.width}
transactionID={item.transactionID}
reportPreviewAction={action}
/>
);

return (
<MoneyRequestReportPreviewContent
iouReportID={iouReportID}
chatReportID={chatReportID}
iouReport={iouReport}
chatReport={chatReport}
action={action}
containerStyles={[reportPreviewStyles.componentStyle, containerStyles]}
contextMenuAnchor={contextMenuAnchor}
isHovered={isHovered}
isWhisper={isWhisper}
checkIfContextMenuActive={checkIfContextMenuActive}
onPaymentOptionsShow={onPaymentOptionsShow}
onPaymentOptionsHide={onPaymentOptionsHide}
action={action}
chatReportID={chatReportID}
iouReportID={iouReportID}
policyID={undefined}
iouReport={iouReport}
transactions={transactions}
violations={violations}
chatReport={chatReport}
policy={policy}
invoiceReceiverPersonalDetail={invoiceReceiverPersonalDetail}
invoiceReceiverPolicy={invoiceReceiverPolicy}
lastTransactionViolations={lastTransactionViolations}
isDelegateAccessRestricted={isDelegateAccessRestricted}
renderItem={renderItem}
getCurrentWidth={(e: LayoutChangeEvent) => {
renderTransactionItem={renderItem}
onLayout={(e: LayoutChangeEvent) => {
setCurrentWidth(e.nativeEvent.layout.width ?? 255);
}}
reportPreviewStyles={reportPreviewStyles}
shouldDisplayContextMenu={shouldDisplayContextMenu}
isInvoice={isInvoice}
onPress={openReportFromPreview}
shouldShowBorder={shouldShowBorder}
/>
);
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -73,6 +73,18 @@ type MoneyRequestReportPreviewContentOnyxProps = {
};

type MoneyRequestReportPreviewContentProps = MoneyRequestReportPreviewContentOnyxProps &
MoneyRequestReportPreviewProps & {renderItem: ListRenderItem<Transaction>; getCurrentWidth: (e: LayoutChangeEvent) => void; reportPreviewStyles: MoneyRequestReportPreviewStyleType};
Omit<MoneyRequestReportPreviewProps, 'policyID'> & {
/** Extra styles passed used by MoneyRequestReportPreviewContent */
reportPreviewStyles: MoneyRequestReportPreviewStyleType;
Comment thread
Kicu marked this conversation as resolved.

/** Callback passed to onLayout */
onLayout: (e: LayoutChangeEvent) => void;

/** Callback to render a transaction preview item */
renderTransactionItem: ListRenderItem<Transaction>;

/** Callback called when the whole preview is pressed */
onPress: () => void;
};

export type {MoneyRequestReportPreviewContentProps, MoneyRequestReportPreviewProps, MoneyRequestReportPreviewStyleType};
Loading