@@ -57,6 +57,7 @@ import {
5757import trackExpenseCreationError from '@libs/telemetry/trackExpenseCreationError' ;
5858import {
5959 didReceiptScanSucceed as didReceiptScanSucceedTransactionUtils ,
60+ getWaypoints ,
6061 hasEReceipt ,
6162 hasReceiptSource ,
6263 hasReceipt as hasReceiptTransactionUtils ,
@@ -79,6 +80,7 @@ import type * as OnyxTypes from '@src/types/onyx';
7980import type { TransactionPendingFieldsKey } from '@src/types/onyx/Transaction' ;
8081import type { FileObject } from '@src/types/utils/Attachment' ;
8182import { isEmptyObject } from '@src/types/utils/EmptyObject' ;
83+ import HoveredDistanceEReceipt from './HoveredDistanceEReceipt' ;
8284import { isElementHovered , resetButtonHoverState } from './receiptHoverUtils' ;
8385import ReportActionItemImage from './ReportActionItemImage' ;
8486
@@ -171,9 +173,15 @@ function MoneyRequestReceiptView({
171173 const transactionViolations = useTransactionViolations ( transaction ?. transactionID ) ;
172174 const [ policyCategories ] = useOnyx ( `${ ONYXKEYS . COLLECTION . POLICY_CATEGORIES } ${ moneyRequestReport ?. policyID } ` ) ;
173175
174- const isDistanceRequest = isDistanceRequestTransactionUtils ( transaction ) ;
175- const hasReceipt = hasReceiptTransactionUtils ( updatedTransaction ?? transaction ) ;
176- const isTransactionScanning = isScanning ( updatedTransaction ?? transaction ) ;
176+ const displayedTransaction = updatedTransaction ?? transaction ;
177+ const isDistanceRequest = isDistanceRequestTransactionUtils ( displayedTransaction ) ;
178+
179+ // A merged distance expense can be typed `distance-manual` while still carrying the map waypoints/route from the
180+ // expense it was merged with, so fall back to the presence of waypoints to still surface the distance e-receipt.
181+ const hasDistanceWaypoints = Object . keys ( getWaypoints ( displayedTransaction ) ?? { } ) . length > 0 ;
182+ const isMapDistanceRequest = ! ! displayedTransaction && isDistanceRequest && ( ! isManualDistanceRequest ( displayedTransaction ) || hasDistanceWaypoints ) ;
183+ const hasReceipt = hasReceiptTransactionUtils ( displayedTransaction ) ;
184+ const isTransactionScanning = isScanning ( displayedTransaction ) ;
177185 const didReceiptScanSucceed = hasReceipt && didReceiptScanSucceedTransactionUtils ( transaction ) ;
178186 const isInvoice = isInvoiceReport ( moneyRequestReport ) ;
179187 const isChatReportArchived = useReportIsArchived ( moneyRequestReport ?. chatReportID ) ;
@@ -255,10 +263,9 @@ function MoneyRequestReceiptView({
255263
256264 let receiptURIs ;
257265 if ( hasReceipt ) {
258- receiptURIs = getThumbnailAndImageURIs ( updatedTransaction ?? transaction ) ;
266+ receiptURIs = getThumbnailAndImageURIs ( displayedTransaction ) ;
259267 }
260- const transactionForReceipt = updatedTransaction ?? transaction ;
261- const isEReceiptTransaction = ! ! transactionForReceipt && ! hasReceiptSource ( transactionForReceipt ) && hasEReceipt ( transactionForReceipt ) ;
268+ const isEReceiptTransaction = ! ! displayedTransaction && ! hasReceiptSource ( displayedTransaction ) && hasEReceipt ( displayedTransaction ) ;
262269 const canZoomReceipt = hasReceipt && ! isLoading && ! isTransactionScanning && ! isEReceiptTransaction && ! ! receiptURIs ?. image ;
263270 const pendingAction = transaction ?. pendingAction ;
264271 // Need to return undefined when we have pendingAction to avoid the duplicate pending action
@@ -504,8 +511,6 @@ function MoneyRequestReceiptView({
504511
505512 const showBorderlessLoading = isLoading && fillSpace ;
506513
507- const isMapDistanceRequest = ! ! transaction && isDistanceRequest && ! isManualDistanceRequest ( transaction ) ;
508-
509514 const canShowReceiptActions = hasReceipt && ! isLoading && isEditable && ! isMapDistanceRequest && ! mergeTransactionID ;
510515 const receiptPendingAction = isDistanceRequest ? getPendingFieldAction ( 'waypoints' ) : getPendingFieldAction ( 'receipt' ) ;
511516 const isReceiptOfflinePending = isOffline && ! ! receiptPendingAction ;
@@ -623,23 +628,26 @@ function MoneyRequestReceiptView({
623628 isEnabled = { canZoomReceipt }
624629 hoverContainerRef = { receiptContainerRef }
625630 >
626- < ReportActionItemImage
627- shouldUseThumbnailImage = { ! fillSpace }
628- shouldUseFullHeight = { fillSpace }
629- thumbnail = { receiptURIs ?. thumbnail }
630- fileExtension = { receiptURIs ?. fileExtension }
631- isThumbnail = { receiptURIs ?. isThumbnail }
632- image = { receiptURIs ?. image }
633- isLocalFile = { receiptURIs ?. isLocalFile }
634- filename = { receiptURIs ?. filename }
635- transaction = { updatedTransaction ?? transaction }
636- enablePreviewModal
637- readonly = { readonly || ! canEditReceipt }
638- mergeTransactionID = { mergeTransactionID }
639- report = { report }
640- onLoad = { ( ) => setIsLoading ( false ) }
641- onLoadFailure = { ( ) => setIsLoading ( false ) }
642- />
631+ < >
632+ < ReportActionItemImage
633+ shouldUseThumbnailImage = { ! fillSpace }
634+ shouldUseFullHeight = { fillSpace }
635+ thumbnail = { receiptURIs ?. thumbnail }
636+ fileExtension = { receiptURIs ?. fileExtension }
637+ isThumbnail = { receiptURIs ?. isThumbnail }
638+ image = { receiptURIs ?. image }
639+ isLocalFile = { receiptURIs ?. isLocalFile }
640+ filename = { receiptURIs ?. filename }
641+ transaction = { updatedTransaction ?? transaction }
642+ enablePreviewModal
643+ readonly = { readonly || ! canEditReceipt }
644+ mergeTransactionID = { mergeTransactionID }
645+ report = { report }
646+ onLoad = { ( ) => setIsLoading ( false ) }
647+ onLoadFailure = { ( ) => setIsLoading ( false ) }
648+ />
649+ { isMapDistanceRequest && hovered && ! ! displayedTransaction && < HoveredDistanceEReceipt transaction = { displayedTransaction } /> }
650+ </ >
643651 </ ReceiptHoverZoom >
644652 </ View >
645653 { canShowReceiptActions && (
0 commit comments