1- import React , { useEffect , useState } from 'react' ;
1+ import React , { useCallback , useEffect , useState } from 'react' ;
22import { View } from 'react-native' ;
33import FullPageNotFoundView from '@components/BlockingViews/FullPageNotFoundView' ;
44import Button from '@components/Button' ;
@@ -27,6 +27,8 @@ import type {MergeFieldKey, MergeValue} from '@libs/MergeTransactionUtils';
2727import Navigation from '@libs/Navigation/Navigation' ;
2828import type { PlatformStackScreenProps } from '@libs/Navigation/PlatformStackNavigation/types' ;
2929import type { MergeTransactionNavigatorParamList } from '@libs/Navigation/types' ;
30+ import { getIOUActionForTransactionID } from '@libs/ReportActionsUtils' ;
31+ import { buildTransactionThread , generateReportID , getReportOrDraftReport } from '@libs/ReportUtils' ;
3032import { getCurrency } from '@libs/TransactionUtils' ;
3133import { openReport } from '@userActions/Report' ;
3234import type { TranslationPaths } from '@src/languages/types' ;
@@ -44,16 +46,33 @@ function DetailsReviewPage({route}: DetailsReviewPageProps) {
4446 const styles = useThemeStyles ( ) ;
4547 const { transactionID, backTo} = route . params ;
4648
47- const [ allReports ] = useOnyx ( ONYXKEYS . COLLECTION . REPORT , { canBeMissing : false } ) ;
4849 const [ mergeTransaction , mergeTransactionMetadata ] = useOnyx ( `${ ONYXKEYS . COLLECTION . MERGE_TRANSACTION } ${ transactionID } ` , { canBeMissing : false } ) ;
4950 const [ targetTransaction = getTargetTransactionFromMergeTransaction ( mergeTransaction ) ] = useOnyx ( `${ ONYXKEYS . COLLECTION . TRANSACTION } ${ mergeTransaction ?. targetTransactionID } ` , {
5051 canBeMissing : true ,
5152 } ) ;
52- const [ sourceTransaction = getSourceTransactionFromMergeTransaction ( mergeTransaction ) ] = useOnyx ( `${ ONYXKEYS . COLLECTION . TRANSACTION } ${ mergeTransaction ?. sourceTransactionID } ` , {
53+ const [ hasOnceLoadedTransactionThreadReportActions ] = useOnyx ( `${ ONYXKEYS . COLLECTION . REPORT_METADATA } ${ targetTransaction ?. reportID } ` , {
54+ selector : ( value ) => value ?. hasOnceLoadedReportActions ,
5355 canBeMissing : true ,
5456 } ) ;
5557 const targetTransactionThreadReportID = getTransactionThreadReportID ( targetTransaction ) ;
56- const targetTransactionThreadReport = allReports ?. [ `${ ONYXKEYS . COLLECTION . REPORT } ${ targetTransactionThreadReportID } ` ] ;
58+ const [ iouActionForTargetTransaction ] = useOnyx (
59+ `${ ONYXKEYS . COLLECTION . REPORT_ACTIONS } ${ targetTransaction ?. reportID } ` ,
60+ {
61+ selector : ( value ) => {
62+ if ( ! hasOnceLoadedTransactionThreadReportActions || ! ! targetTransactionThreadReportID || ! targetTransaction ?. transactionID ) {
63+ return undefined ;
64+ }
65+ return getIOUActionForTransactionID ( Object . values ( value ?? { } ) , targetTransaction ?. transactionID ) ;
66+ } ,
67+ canBeMissing : true ,
68+ } ,
69+ [ hasOnceLoadedTransactionThreadReportActions , targetTransactionThreadReportID , targetTransaction ?. transactionID ] ,
70+ ) ;
71+ const [ sourceTransaction = getSourceTransactionFromMergeTransaction ( mergeTransaction ) ] = useOnyx ( `${ ONYXKEYS . COLLECTION . TRANSACTION } ${ mergeTransaction ?. sourceTransactionID } ` , {
72+ canBeMissing : true ,
73+ } ) ;
74+ const [ targetTransactionThreadReport ] = useOnyx ( `${ ONYXKEYS . COLLECTION . REPORT } ${ targetTransactionThreadReportID } ` , { canBeMissing : true } ) ;
75+ const [ currentUserEmail ] = useOnyx ( ONYXKEYS . SESSION , { selector : ( value ) => value ?. email , canBeMissing : false } ) ;
5776
5877 const [ hasErrors , setHasErrors ] = useState < Partial < Record < MergeFieldKey , boolean > > > ( { } ) ;
5978 const [ diffFields , setDiffFields ] = useState < MergeFieldKey [ ] > ( [ ] ) ;
@@ -70,6 +89,24 @@ function DetailsReviewPage({route}: DetailsReviewPageProps) {
7089 setDiffFields ( conflictFields as MergeFieldKey [ ] ) ;
7190 } , [ targetTransaction , sourceTransaction , transactionID ] ) ;
7291
92+ const createTargetTransactionThreadReport = useCallback ( ( ) => {
93+ const transactionThreadReportID = generateReportID ( ) ;
94+ const iouReport = getReportOrDraftReport ( targetTransaction ?. reportID ) ;
95+ const optimisticTransactionThread = buildTransactionThread ( iouActionForTargetTransaction , iouReport , undefined , transactionThreadReportID ) ;
96+
97+ openReport (
98+ transactionThreadReportID ,
99+ undefined ,
100+ currentUserEmail ? [ currentUserEmail ] : [ ] ,
101+ optimisticTransactionThread ,
102+ iouActionForTargetTransaction ?. reportActionID ,
103+ false ,
104+ [ ] ,
105+ undefined ,
106+ targetTransaction ?. transactionID ,
107+ ) ;
108+ } , [ currentUserEmail , iouActionForTargetTransaction , targetTransaction ?. reportID , targetTransaction ?. transactionID ] ) ;
109+
73110 useEffect ( ( ) => {
74111 if ( ! isCheckingDataBeforeGoNext ) {
75112 return ;
@@ -79,6 +116,14 @@ function DetailsReviewPage({route}: DetailsReviewPageProps) {
79116 // The App may not have the transaction thread report loaded for card transactions, so we need to trigger
80117 // OpenReport to ensure the transaction thread report is available for confirmation page
81118 if ( ! targetTransactionThreadReportID && targetTransaction ?. reportID ) {
119+ // If the report was already loaded before, but there are still no transaction thread report info, it means it hasn't been created yet.
120+ // So we should create it.
121+ if ( hasOnceLoadedTransactionThreadReportActions ) {
122+ createTargetTransactionThreadReport ( ) ;
123+ setIsCheckingDataBeforeGoNext ( false ) ;
124+ Navigation . navigate ( ROUTES . MERGE_TRANSACTION_CONFIRMATION_PAGE . getRoute ( transactionID , Navigation . getActiveRoute ( ) ) ) ;
125+ return ;
126+ }
82127 return openReport ( targetTransaction . reportID ) ;
83128 }
84129 if ( targetTransactionThreadReportID && ! targetTransactionThreadReport ) {
@@ -91,7 +136,18 @@ function DetailsReviewPage({route}: DetailsReviewPageProps) {
91136
92137 Navigation . navigate ( ROUTES . MERGE_TRANSACTION_CONFIRMATION_PAGE . getRoute ( transactionID , Navigation . getActiveRoute ( ) ) ) ;
93138 setIsCheckingDataBeforeGoNext ( false ) ;
94- } , [ isCheckingDataBeforeGoNext , targetTransactionThreadReportID , targetTransaction ?. reportID , targetTransactionThreadReport , transactionID ] ) ;
139+ } , [
140+ isCheckingDataBeforeGoNext ,
141+ targetTransactionThreadReportID ,
142+ targetTransaction ?. reportID ,
143+ targetTransactionThreadReport ,
144+ transactionID ,
145+ hasOnceLoadedTransactionThreadReportActions ,
146+ iouActionForTargetTransaction ,
147+ currentUserEmail ,
148+ targetTransaction ?. transactionID ,
149+ createTargetTransactionThreadReport ,
150+ ] ) ;
95151
96152 // Handle selection
97153 const handleSelect = ( field : MergeFieldKey , value : MergeValue ) => {
0 commit comments