diff --git a/src/libs/actions/Policy/Policy.ts b/src/libs/actions/Policy/Policy.ts index ad7bfe87022b..3b308213bac2 100644 --- a/src/libs/actions/Policy/Policy.ts +++ b/src/libs/actions/Policy/Policy.ts @@ -2522,6 +2522,24 @@ function getApprovalModeForNewWorkspace( return CONST.POLICY.APPROVAL_MODE.OPTIONAL; } +/** + * Builds the default title report field (`fieldList`) used when seeding a new policy. The object intentionally omits the + * non-essential `PolicyReportField` properties (orderWeight, values, keys, etc.), so it is cast to the expected type. + */ +function buildDefaultTitleFieldList(pendingFields?: Record): Policy['fieldList'] { + return { + [CONST.POLICY.FIELDS.FIELD_LIST_TITLE]: { + defaultValue: CONST.POLICY.DEFAULT_REPORT_NAME_PATTERN, + type: CONST.POLICY.DEFAULT_FIELD_LIST_TYPE, + target: CONST.POLICY.DEFAULT_FIELD_LIST_TARGET, + name: CONST.POLICY.DEFAULT_FIELD_LIST_NAME, + fieldID: CONST.POLICY.FIELDS.FIELD_LIST_TITLE, + deletable: true, + ...(pendingFields ? {pendingFields} : {}), + }, + } as unknown as Policy['fieldList']; +} + /** * Generates onyx data for creating a new workspace * @@ -2721,17 +2739,7 @@ function buildPolicyData(options: BuildPolicyDataOptions): OnyxData = {}; + for (const transaction of reportTransactions) { + if (transaction?.transactionID) { + transactionsRecord[transaction.transactionID] = transaction; + } + } + const computedExpenseReportName = ReportUtils.computeOptimisticReportName(expenseReport, newWorkspace as Policy, policyID, transactionsRecord); + if (computedExpenseReportName !== null) { + expenseReport.reportName = computedExpenseReportName; + } + optimisticData.push({ onyxMethod: Onyx.METHOD.MERGE, key: `${ONYXKEYS.COLLECTION.REPORT}${iouReportID}`, @@ -4477,9 +4494,6 @@ function createWorkspaceFromIOUPayment( value: iouReport, }); - // The expense report transactions need to have the amount reversed to negative values - const reportTransactions = ReportUtils.getReportTransactions(iouReportID); - // For performance reasons, we are going to compose a merge collection data for transactions const transactionsOptimisticData: Record = {}; const transactionFailureData: Record = {}; @@ -4535,12 +4549,14 @@ function createWorkspaceFromIOUPayment( if (reportPreviewAction?.reportActionID) { // Update the created timestamp of the report preview action to be after the expense chat created timestamp. + // Also set childReportName so the preview line falls back to the recomputed expense report name if needed. optimisticData.push({ onyxMethod: Onyx.METHOD.MERGE, key: `${ONYXKEYS.COLLECTION.REPORT_ACTIONS}${memberData.workspaceChatReportID}`, value: { [reportPreviewAction.reportActionID]: { ...reportPreviewAction, + childReportName: expenseReport.reportName, message: [ { type: CONST.REPORT.MESSAGE.TYPE.TEXT, diff --git a/src/pages/inbox/ReportFetchHandler.tsx b/src/pages/inbox/ReportFetchHandler.tsx index 942b9dbf3be2..54fee8dc52b8 100644 --- a/src/pages/inbox/ReportFetchHandler.tsx +++ b/src/pages/inbox/ReportFetchHandler.tsx @@ -228,13 +228,13 @@ function ReportFetchHandler() { if ( transactionThreadReportID !== CONST.FAKE_REPORT_ID || transactionThreadReport?.reportID || - (!reportLoadingState.hasOnceLoadedReportActions && !reportMetadata?.isOptimisticReport) + (!reportLoadingState.hasOnceLoadedReportActions && !reportMetadata?.isOptimisticReport && !isOffline) ) { return; } createOneTransactionThread(); - }, [reportLoadingState.hasOnceLoadedReportActions, reportMetadata?.isOptimisticReport, transactionThreadReport?.reportID, transactionThreadReportID]); + }, [reportLoadingState.hasOnceLoadedReportActions, reportMetadata?.isOptimisticReport, transactionThreadReport?.reportID, transactionThreadReportID, isOffline]); useEffect(() => { if (isLoadingReportData || !prevIsLoadingReportData || !prevIsAnonymousUser.current || isAnonymousUser) {