diff --git a/src/pages/iou/request/step/IOURequestStepCategory.tsx b/src/pages/iou/request/step/IOURequestStepCategory.tsx index 3877ffd5a3d9c..8e4f7bb93f056 100644 --- a/src/pages/iou/request/step/IOURequestStepCategory.tsx +++ b/src/pages/iou/request/step/IOURequestStepCategory.tsx @@ -27,7 +27,7 @@ import {isCategoryMissing} from '@libs/CategoryUtils'; import Navigation from '@libs/Navigation/Navigation'; import {hasEnabledOptions} from '@libs/OptionsListUtils'; import {isPolicyAdmin} from '@libs/PolicyUtils'; -import {getTransactionDetails, isGroupPolicy, isReportInGroupPolicy} from '@libs/ReportUtils'; +import {getReportOrDraftReport, getTransactionDetails, isGroupPolicy, isReportInGroupPolicy} from '@libs/ReportUtils'; import {isExpenseUnreported} from '@libs/TransactionUtils'; import CONST from '@src/CONST'; import ONYXKEYS from '@src/ONYXKEYS'; @@ -57,8 +57,9 @@ function IOURequestStepCategory({ const isUnreportedExpense = isExpenseUnreported(transaction); const {policyForMovingExpenses, policyForMovingExpensesID} = usePolicyForMovingExpenses(); const isCreatingTrackExpense = action === CONST.IOU.ACTION.CREATE && iouType === CONST.IOU.TYPE.TRACK; - - const policyIdReal = getIOURequestPolicyID(transaction, reportReal); + const transactionReport = getReportOrDraftReport(transaction?.reportID); + const report = reportReal ?? reportDraft ?? transactionReport; + const policyIdReal = getIOURequestPolicyID(transaction, reportReal ?? transactionReport); const policyIdDraft = getIOURequestPolicyID(transaction, reportDraft); const [policyReal] = useOnyx(`${ONYXKEYS.COLLECTION.POLICY}${policyIdReal}`, {canBeMissing: true}); const [policyDraft] = useOnyx(`${ONYXKEYS.COLLECTION.POLICY_DRAFTS}${policyIdDraft}`, {canBeMissing: true}); @@ -71,7 +72,6 @@ function IOURequestStepCategory({ const [policyTags] = useOnyx(`${ONYXKEYS.COLLECTION.POLICY_TAGS}${policyID}`, {canBeMissing: true}); const [policyRecentlyUsedCategories] = useOnyx(`${ONYXKEYS.COLLECTION.POLICY_RECENTLY_USED_CATEGORIES}${policyID}`, {canBeMissing: true}); - const report = reportReal ?? reportDraft; const policyCategories = policyCategoriesReal ?? policyCategoriesDraft; const policyData = usePolicyData(policy?.id); const {currentSearchHash} = useSearchContext(); diff --git a/src/pages/iou/request/step/IOURequestStepConfirmation.tsx b/src/pages/iou/request/step/IOURequestStepConfirmation.tsx index e767e20613ddd..25564bdf6dde8 100644 --- a/src/pages/iou/request/step/IOURequestStepConfirmation.tsx +++ b/src/pages/iou/request/step/IOURequestStepConfirmation.tsx @@ -170,10 +170,15 @@ function IOURequestStepConfirmation({ /* * We want to use a report from the transaction if it exists * Also if the report was submitted and delayed submission is on, then we should use an initial report + * Additionally, if neither reportReal nor reportDraft exist, we fallback to the transactionReport + * to ensure proper navigation after expense creation. */ const transactionReport = getReportOrDraftReport(transaction?.reportID); - const shouldUseTransactionReport = - transactionReport && !(isProcessingReport(transactionReport) && !policyReal?.harvesting?.enabled) && isReportOutstanding(transactionReport, policyReal?.id, undefined, false); + const reportWithDraftFallback = useMemo(() => reportReal ?? reportDraft, [reportDraft, reportReal]); + const canUseReport = !(isProcessingReport(transactionReport) && !policyReal?.harvesting?.enabled) && isReportOutstanding(transactionReport, policyReal?.id, undefined, false); + + const shouldUseTransactionReport = !!transactionReport && (canUseReport || !reportWithDraftFallback); + const report = useMemo(() => { if (isUnreported) { return undefined; @@ -181,8 +186,8 @@ function IOURequestStepConfirmation({ if (shouldUseTransactionReport) { return transactionReport; } - return reportReal ?? reportDraft; - }, [isUnreported, shouldUseTransactionReport, transactionReport, reportReal, reportDraft]); + return reportWithDraftFallback; + }, [isUnreported, shouldUseTransactionReport, transactionReport, reportWithDraftFallback]); const policy = isCreatingTrackExpense || isUnreported ? policyForMovingExpenses : (policyReal ?? policyDraft); const policyID = isCreatingTrackExpense || isUnreported ? policyForMovingExpensesID : getIOURequestPolicyID(transaction, report);