From 06b9a23b2f0aedc2d3c7d35a518c0af2973afed0 Mon Sep 17 00:00:00 2001 From: daledah Date: Thu, 2 Jul 2026 16:28:50 +0700 Subject: [PATCH] refactor getReportPreviewMessage to use translate param --- .../QuickCreationActionsBar/index.tsx | 4 +- .../SearchActionsBarCreateButton.tsx | 4 +- src/hooks/useCreateNewReport.tsx | 6 ++- src/libs/ReportUtils.ts | 47 +++++++++---------- src/libs/actions/IOU/Duplicate.ts | 12 ++++- src/libs/actions/Policy/Policy.ts | 2 +- src/libs/actions/Report/index.ts | 5 +- src/pages/Search/EmptySearchView.tsx | 2 + .../Search/SearchTransactionsChangeReport.tsx | 4 ++ .../report/ContextMenu/ContextMenuActions.tsx | 1 + .../AttachmentPickerWithMenuItems.tsx | 7 ++- .../menuItems/CreateReportMenuItem.tsx | 2 + .../iou/request/step/IOURequestEditReport.tsx | 14 +++++- .../iou/request/step/IOURequestStepReport.tsx | 14 +++++- .../request/step/IOURequestStepUpgrade.tsx | 3 +- tests/perf-test/ReportUtils.perf-test.ts | 1 + tests/unit/OptionsListUtilsTest.tsx | 1 + tests/unit/ReportUtilsTest.ts | 16 +++++-- tests/unit/SidebarUtilsTest.ts | 2 + 19 files changed, 106 insertions(+), 41 deletions(-) diff --git a/src/components/Navigation/QuickCreationActionsBar/index.tsx b/src/components/Navigation/QuickCreationActionsBar/index.tsx index 7b57025a2b28..ed32f640d8d2 100644 --- a/src/components/Navigation/QuickCreationActionsBar/index.tsx +++ b/src/components/Navigation/QuickCreationActionsBar/index.tsx @@ -98,6 +98,8 @@ function QuickCreationActionsBar() { allBetas, false, shouldDismissEmptyReportsConfirmation, + undefined, + translate, ); // Navigate to the Reports page first so getCreateReportRoute() resolves against // the Search/Reports fullscreen context before opening the created report modal. @@ -106,7 +108,7 @@ function QuickCreationActionsBar() { Navigation.navigate(getCreateReportRoute({reportID: createdReportID})); }); }, - [currentUserPersonalDetails, hasViolations, defaultChatEnabledPolicy, isASAPSubmitBetaEnabled, allBetas], + [currentUserPersonalDetails, hasViolations, defaultChatEnabledPolicy, isASAPSubmitBetaEnabled, allBetas, translate], ); const {openCreateReportConfirmation} = useCreateEmptyReportConfirmation({ diff --git a/src/components/Search/SearchPageHeader/SearchActionsBarCreateButton.tsx b/src/components/Search/SearchPageHeader/SearchActionsBarCreateButton.tsx index 13ccdacd59db..edba77b6d952 100644 --- a/src/components/Search/SearchPageHeader/SearchActionsBarCreateButton.tsx +++ b/src/components/Search/SearchPageHeader/SearchActionsBarCreateButton.tsx @@ -82,6 +82,8 @@ function SearchActionsBarCreateButton() { allBetas, false, shouldDismissEmptyReportsConfirmation, + undefined, + translate, ); Navigation.setNavigationActionToMicrotaskQueue(() => { Navigation.navigate( @@ -91,7 +93,7 @@ function SearchActionsBarCreateButton() { ); }); }, - [currentUserPersonalDetails, hasViolations, defaultChatEnabledPolicy, isASAPSubmitBetaEnabled, allBetas], + [currentUserPersonalDetails, hasViolations, defaultChatEnabledPolicy, isASAPSubmitBetaEnabled, allBetas, translate], ); const {openCreateReportConfirmation} = useCreateEmptyReportConfirmation({ diff --git a/src/hooks/useCreateNewReport.tsx b/src/hooks/useCreateNewReport.tsx index ea0a41c18875..9a0b54cf8059 100644 --- a/src/hooks/useCreateNewReport.tsx +++ b/src/hooks/useCreateNewReport.tsx @@ -5,6 +5,7 @@ import {hasViolations as hasViolationsUtil} from '@libs/ReportUtils'; import CONST from '@src/CONST'; import ONYXKEYS from '@src/ONYXKEYS'; import useCurrentUserPersonalDetails from './useCurrentUserPersonalDetails'; +import useLocalize from './useLocalize'; import useOnyx from './useOnyx'; import usePermissions from './usePermissions'; @@ -16,6 +17,7 @@ function useCreateNewReport() { const currentUserPersonalDetails = useCurrentUserPersonalDetails(); const {isBetaEnabled} = usePermissions(); const isASAPSubmitBetaEnabled = isBetaEnabled(CONST.BETAS.ASAP_SUBMIT); + const {translate} = useLocalize(); const [accountID] = useOnyx(ONYXKEYS.SESSION, {selector: accountIDSelector}); const [email] = useOnyx(ONYXKEYS.SESSION, {selector: emailSelector}); const [transactionViolations] = useOnyx(ONYXKEYS.COLLECTION.TRANSACTION_VIOLATIONS); @@ -27,9 +29,9 @@ function useCreateNewReport() { return useCallback( (policyID: string, shouldDismissEmptyReportsConfirmation = false) => { const policy = policies?.[`${ONYXKEYS.COLLECTION.POLICY}${policyID}`]; - return createNewReport(currentUserPersonalDetails, hasViolations, isASAPSubmitBetaEnabled, policy, betas, false, shouldDismissEmptyReportsConfirmation); + return createNewReport(currentUserPersonalDetails, hasViolations, isASAPSubmitBetaEnabled, policy, betas, false, shouldDismissEmptyReportsConfirmation, undefined, translate); }, - [betas, currentUserPersonalDetails, hasViolations, isASAPSubmitBetaEnabled, policies], + [betas, currentUserPersonalDetails, hasViolations, isASAPSubmitBetaEnabled, policies, translate], ); } diff --git a/src/libs/ReportUtils.ts b/src/libs/ReportUtils.ts index a768fd0e6716..72aa05714397 100644 --- a/src/libs/ReportUtils.ts +++ b/src/libs/ReportUtils.ts @@ -5531,6 +5531,8 @@ type GetReportPreviewMessageBaseParams = { isForListPreview?: boolean; /** This can be either a report preview action or the IOU action. This will be the original report preview action in cases where `iouReportAction` was unwrapped from a report preview action. Otherwise, it will be the same as `iouReportAction`. */ originalReportAction?: OnyxInputOrEntry; + // TODO: We'll remove the optional (?) modifier from the translate parameter once https://github.com/Expensify/App/issues/66430 is completed + translate?: LocalizedTranslate; }; /** @@ -5540,6 +5542,7 @@ function getReportPreviewMessage(params: GetReportPreviewMessageBaseParams & {is function getReportPreviewMessage(params: GetReportPreviewMessageBaseParams & {isCopyAction: true; reportAttributes?: ReportAttributesDerivedValue['reports']}): string; function getReportPreviewMessage(params: GetReportPreviewMessageBaseParams & {isCopyAction?: boolean; reportAttributes?: ReportAttributesDerivedValue['reports']}): string { const {reportOrID, iouReportAction = null, shouldConsiderScanningReceiptOrPendingRoute = false, isPreviewMessageForParentChatReport = false, policy, isForListPreview = false} = params; + const translateFn = params.translate ?? translateLocal; const originalReportAction = params.originalReportAction ?? iouReportAction; const report = typeof reportOrID === 'string' ? getReport(reportOrID, deprecatedAllReports) : reportOrID; const reportActionMessage = getReportActionHtml(iouReportAction); @@ -5572,16 +5575,16 @@ function getReportPreviewMessage(params: GetReportPreviewMessageBaseParams & {is if (!isEmptyObject(linkedTransaction)) { if (isScanning(linkedTransaction)) { - return translateLocal('iou.receiptScanning', {count: 1}); + return translateFn('iou.receiptScanning', {count: 1}); } if (hasMissingSmartscanFieldsTransactionUtils(linkedTransaction, report)) { - return translateLocal('iou.receiptMissingDetails'); + return translateFn('iou.receiptMissingDetails'); } const amount = getTransactionAmount(linkedTransaction, !isEmptyObject(report) && isExpenseReport(report), linkedTransaction?.reportID === CONST.REPORT.UNREPORTED_REPORT_ID) ?? 0; const formattedAmount = convertToDisplayString(amount, getCurrency(linkedTransaction)) ?? ''; - return translateLocal('iou.didSplitAmount', formattedAmount, getMerchantOrDescription(linkedTransaction)); + return translateFn('iou.didSplitAmount', formattedAmount, getMerchantOrDescription(linkedTransaction)); } } @@ -5596,7 +5599,7 @@ function getReportPreviewMessage(params: GetReportPreviewMessageBaseParams & {is if (amount && currency) { const formattedAmount = convertToDisplayString(amount, currency); - return translateLocal('iou.trackedAmount', formattedAmount, comment); + return translateFn('iou.trackedAmount', formattedAmount, comment); } return reportActionMessage; @@ -5604,11 +5607,11 @@ function getReportPreviewMessage(params: GetReportPreviewMessageBaseParams & {is if (!isEmptyObject(linkedTransaction)) { if (isScanning(linkedTransaction)) { - return translateLocal('iou.receiptScanning', {count: 1}); + return translateFn('iou.receiptScanning', {count: 1}); } if (hasMissingSmartscanFieldsTransactionUtils(linkedTransaction, report)) { - return translateLocal('iou.receiptMissingDetails'); + return translateFn('iou.receiptMissingDetails'); } const amount = getTransactionAmount(linkedTransaction, !isEmptyObject(report) && isExpenseReport(report), linkedTransaction?.reportID === CONST.REPORT.UNREPORTED_REPORT_ID) ?? 0; @@ -5616,7 +5619,7 @@ function getReportPreviewMessage(params: GetReportPreviewMessageBaseParams & {is const merchantOrComment = getMerchantOrDescription(linkedTransaction); - return translateLocal('iou.trackedAmount', formattedAmount, merchantOrComment); + return translateFn('iou.trackedAmount', formattedAmount, merchantOrComment); } } @@ -5624,7 +5627,7 @@ function getReportPreviewMessage(params: GetReportPreviewMessageBaseParams & {is const {totalDisplaySpend: totalAmount} = getMoneyRequestSpendBreakdown(report); const parentReport = getParentReport(report); - const policyName = getPolicyName({report: parentReport ?? report, policy}); + const policyName = getPolicyName({report: parentReport ?? report, policy, unavailableTranslation: translateFn('workspace.common.unavailable')}); const payerName = isExpenseReport(report) ? policyName : getDisplayNameForParticipant({accountID: report.managerID, shouldUseShortForm: !isPreviewMessageForParentChatReport, formatPhoneNumber: formatPhoneNumberPhoneUtils}); @@ -5632,7 +5635,7 @@ function getReportPreviewMessage(params: GetReportPreviewMessageBaseParams & {is const formattedAmount = convertToDisplayString(totalAmount, report.currency); if (isReportApproved({report}) && isPaidGroupPolicy(report)) { - return translateLocal('iou.managerApprovedAmount', payerName ?? '', formattedAmount); + return translateFn('iou.managerApprovedAmount', payerName ?? '', formattedAmount); } const reportPolicy = allPolicies?.[`${ONYXKEYS.COLLECTION.POLICY}${report.policyID}`]; @@ -5643,11 +5646,11 @@ function getReportPreviewMessage(params: GetReportPreviewMessageBaseParams & {is } if (!isEmptyObject(linkedTransaction) && isScanning(linkedTransaction)) { - return translateLocal('iou.receiptScanning', {count: numberOfScanningReceipts}); + return translateFn('iou.receiptScanning', {count: numberOfScanningReceipts}); } if (!isEmptyObject(linkedTransaction) && isFetchingWaypointsFromServer(linkedTransaction) && !getTransactionAmount(linkedTransaction)) { - return translateLocal('iou.fieldPending'); + return translateFn('iou.fieldPending'); } const originalMessage = !isEmptyObject(iouReportAction) && isMoneyRequestAction(iouReportAction) ? getOriginalMessage(iouReportAction) : undefined; @@ -5676,7 +5679,7 @@ function getReportPreviewMessage(params: GetReportPreviewMessageBaseParams & {is if (isFromInvoice) { translatePhraseKey = originalMessage?.payAsBusiness ? 'iou.settleInvoiceBusiness' : 'iou.settleInvoicePersonal'; const currentBankAccount = getBankAccountFromID(originalMessage?.bankAccountID); - return translateLocal(translatePhraseKey, formattedAmount, currentBankAccount?.accountData?.accountNumber?.slice(-4) ?? ''); + return translateFn(translatePhraseKey, formattedAmount, currentBankAccount?.accountData?.accountNumber?.slice(-4) ?? ''); } } @@ -5689,22 +5692,22 @@ function getReportPreviewMessage(params: GetReportPreviewMessageBaseParams & {is actualPayerName = actualPayerName && isForListPreview && !isPreviewMessageForParentChatReport ? `${actualPayerName}:` : actualPayerName; const payerDisplayName = isPreviewMessageForParentChatReport ? payerName : actualPayerName; if (translatePhraseKey === 'iou.businessBankAccount') { - return translateLocal(translatePhraseKey, '', originalMessage?.accountNumber?.slice(-4) ?? reportPolicy?.achAccount?.accountNumber?.slice(-4) ?? ''); + return translateFn(translatePhraseKey, '', originalMessage?.accountNumber?.slice(-4) ?? reportPolicy?.achAccount?.accountNumber?.slice(-4) ?? ''); } if (translatePhraseKey === 'iou.automaticallyPaidWithExpensify' || translatePhraseKey === 'iou.paidWithExpensify') { - return translateLocal(translatePhraseKey, payerDisplayName ?? ''); + return translateFn(translatePhraseKey, payerDisplayName ?? ''); } if (translatePhraseKey === 'iou.paidElsewhere') { - return getElsewherePaymentReportActionMessage(translateLocal, originalMessage, payerDisplayName ?? undefined); + return getElsewherePaymentReportActionMessage(translateFn, originalMessage, payerDisplayName ?? undefined); } if (translatePhraseKey === 'iou.payerPaidAmount') { - return translateLocal(translatePhraseKey, formattedAmount, payerDisplayName ?? ''); + return translateFn(translatePhraseKey, formattedAmount, payerDisplayName ?? ''); } } if (report.isWaitingOnBankAccount) { const submitterDisplayName = getDisplayNameForParticipant({accountID: report.ownerAccountID, shouldUseShortForm: true, formatPhoneNumber: formatPhoneNumberPhoneUtils}) ?? ''; - return translateLocal('iou.waitingOnBankAccount', submitterDisplayName); + return translateFn('iou.waitingOnBankAccount', submitterDisplayName); } const lastActorID = iouReportAction?.actorAccountID; @@ -5734,17 +5737,13 @@ function getReportPreviewMessage(params: GetReportPreviewMessageBaseParams & {is lastActorID && lastActorID !== deprecatedCurrentUserAccountID ? getDisplayNameForParticipant({accountID: lastActorID, shouldUseShortForm: !isPreviewMessageForParentChatReport, formatPhoneNumber: formatPhoneNumberPhoneUtils}) : ''; - return `${requestorName ? `${requestorName}: ` : ''}${translateLocal('iou.expenseAmount', amountToDisplay, comment)}`; + return `${requestorName ? `${requestorName}: ` : ''}${translateFn('iou.expenseAmount', amountToDisplay, comment)}`; } if (containsNonReimbursable) { - return translateLocal( - 'iou.payerSpentAmount', - formattedAmount, - getDisplayNameForParticipant({accountID: report.ownerAccountID, formatPhoneNumber: formatPhoneNumberPhoneUtils}) ?? '', - ); + return translateFn('iou.payerSpentAmount', formattedAmount, getDisplayNameForParticipant({accountID: report.ownerAccountID, formatPhoneNumber: formatPhoneNumberPhoneUtils}) ?? ''); } - return translateLocal('iou.payerOwesAmount', formattedAmount, payerName ?? '', comment); + return translateFn('iou.payerOwesAmount', formattedAmount, payerName ?? '', comment); } /** diff --git a/src/libs/actions/IOU/Duplicate.ts b/src/libs/actions/IOU/Duplicate.ts index e0326a008dbe..c0ae0c3c13e3 100644 --- a/src/libs/actions/IOU/Duplicate.ts +++ b/src/libs/actions/IOU/Duplicate.ts @@ -925,7 +925,17 @@ function duplicateReport({ } const newReportName = translate('common.copyOfReportName', sourceReportName); - const {reportPreviewReportActionID, ...newReport} = createNewReport(ownerPersonalDetails, false, isASAPSubmitBetaEnabled, targetPolicy, betas, false, undefined, newReportName); + const {reportPreviewReportActionID, ...newReport} = createNewReport( + ownerPersonalDetails, + false, + isASAPSubmitBetaEnabled, + targetPolicy, + betas, + false, + undefined, + newReportName, + translate, + ); const isCrossWorkspace = !!sourceReport && sourceReport.policyID !== targetPolicy.id; diff --git a/src/libs/actions/Policy/Policy.ts b/src/libs/actions/Policy/Policy.ts index bc5b4e4b80f3..cae27acccd05 100644 --- a/src/libs/actions/Policy/Policy.ts +++ b/src/libs/actions/Policy/Policy.ts @@ -4582,7 +4582,7 @@ function createWorkspaceFromIOUPayment( message: [ { type: CONST.REPORT.MESSAGE.TYPE.TEXT, - text: ReportUtils.getReportPreviewMessage({reportOrID: expenseReport, policy: newWorkspace}), + text: ReportUtils.getReportPreviewMessage({reportOrID: expenseReport, policy: newWorkspace, translate: localeTranslate}), }, ], created: DateUtils.getDBTime(), diff --git a/src/libs/actions/Report/index.ts b/src/libs/actions/Report/index.ts index 8a70d19bd7f0..3d0b8270fc47 100644 --- a/src/libs/actions/Report/index.ts +++ b/src/libs/actions/Report/index.ts @@ -3967,6 +3967,7 @@ function buildNewReportOptimisticData( isASAPSubmitBetaEnabled: boolean, betas: OnyxEntry, reportName?: string, + translate?: LocalizedTranslate, ) { const {accountID, login, email} = ownerPersonalDetails; const timeOfCreation = DateUtils.getDBTime(); @@ -4005,7 +4006,7 @@ function buildNewReportOptimisticData( pendingAction: CONST.RED_BRICK_ROAD_PENDING_ACTION.ADD, }; - const message = getReportPreviewMessage({reportOrID: optimisticReportData}); + const message = getReportPreviewMessage({reportOrID: optimisticReportData, translate}); const createReportActionMessage = [ { html: message, @@ -4207,6 +4208,7 @@ function createNewReport( shouldNotifyNewAction = false, shouldDismissEmptyReportsConfirmation?: boolean, reportName?: string, + translate?: LocalizedTranslate, ) { const optimisticReportID = generateReportID(); const reportActionID = rand64(); @@ -4222,6 +4224,7 @@ function createNewReport( isASAPSubmitBetaEnabled, betas, reportName, + translate, ); if (shouldDismissEmptyReportsConfirmation) { diff --git a/src/pages/Search/EmptySearchView.tsx b/src/pages/Search/EmptySearchView.tsx index b968026df066..97999c586713 100644 --- a/src/pages/Search/EmptySearchView.tsx +++ b/src/pages/Search/EmptySearchView.tsx @@ -166,6 +166,8 @@ function EmptySearchViewContent({ betas, false, shouldDismissEmptyReportsConfirmation, + undefined, + translate, ); Navigation.setNavigationActionToMicrotaskQueue(() => { Navigation.navigate( diff --git a/src/pages/Search/SearchTransactionsChangeReport.tsx b/src/pages/Search/SearchTransactionsChangeReport.tsx index 43ce76b90657..d27f8ed24241 100644 --- a/src/pages/Search/SearchTransactionsChangeReport.tsx +++ b/src/pages/Search/SearchTransactionsChangeReport.tsx @@ -5,6 +5,7 @@ import {useSearchResultsContext, useSearchSelectionActions, useSearchSelectionCo import type {ListItem} from '@components/SelectionList/types'; import useConditionalCreateEmptyReportConfirmation from '@hooks/useConditionalCreateEmptyReportConfirmation'; import useHasPerDiemTransactions from '@hooks/useHasPerDiemTransactions'; +import useLocalize from '@hooks/useLocalize'; import useOnyx from '@hooks/useOnyx'; import usePermissions from '@hooks/usePermissions'; import usePolicyForMovingExpenses from '@hooks/usePolicyForMovingExpenses'; @@ -49,6 +50,7 @@ function SearchTransactionsChangeReport() { const [transactionViolations] = useOnyx(ONYXKEYS.COLLECTION.TRANSACTION_VIOLATIONS); const {isBetaEnabled} = usePermissions(); const isASAPSubmitBetaEnabled = isBetaEnabled(CONST.BETAS.ASAP_SUBMIT); + const {translate} = useLocalize(); const session = useSession(); const personalDetails = usePersonalDetails(); const hasViolations = hasViolationsReportUtils(undefined, transactionViolations, session?.accountID ?? CONST.DEFAULT_NUMBER_ID, session?.email ?? ''); @@ -137,6 +139,8 @@ function SearchTransactionsChangeReport() { betas, false, shouldDismissEmptyReportsConfirmation, + undefined, + translate, ); const reportNextStep = allReportNextSteps?.[`${ONYXKEYS.COLLECTION.NEXT_STEP}${optimisticReport.reportID}`]; const policyTagList = policyForMovingExpenses?.id ? allPolicyTags?.[`${ONYXKEYS.COLLECTION.POLICY_TAGS}${policyForMovingExpenses.id}`] : {}; diff --git a/src/pages/inbox/report/ContextMenu/ContextMenuActions.tsx b/src/pages/inbox/report/ContextMenu/ContextMenuActions.tsx index 54488fc74126..56212553a19d 100644 --- a/src/pages/inbox/report/ContextMenu/ContextMenuActions.tsx +++ b/src/pages/inbox/report/ContextMenu/ContextMenuActions.tsx @@ -920,6 +920,7 @@ const ContextMenuActions: ContextMenuAction[] = [ iouReportAction: reportAction, isCopyAction: true, reportAttributes, + translate, }); Clipboard.setString(displayMessage); } else if (isTaskActionReportActionsUtils(reportAction)) { diff --git a/src/pages/inbox/report/ReportActionCompose/AttachmentPickerWithMenuItems.tsx b/src/pages/inbox/report/ReportActionCompose/AttachmentPickerWithMenuItems.tsx index 8accb5cebe16..6653573799ac 100644 --- a/src/pages/inbox/report/ReportActionCompose/AttachmentPickerWithMenuItems.tsx +++ b/src/pages/inbox/report/ReportActionCompose/AttachmentPickerWithMenuItems.tsx @@ -201,14 +201,17 @@ function AttachmentPickerWithMenuItems({ policyID: report?.policyID, policyName: policy?.name ?? '', onConfirm: (shouldDismissEmptyReportsConfirmation) => - selectOption(() => createNewReport(currentUserPersonalDetails, isASAPSubmitBetaEnabled, hasViolations, policy, betas, true, shouldDismissEmptyReportsConfirmation), true), + selectOption( + () => createNewReport(currentUserPersonalDetails, isASAPSubmitBetaEnabled, hasViolations, policy, betas, true, shouldDismissEmptyReportsConfirmation, undefined, translate), + true, + ), }); const handleCreateReport = () => { if (shouldShowEmptyReportConfirmation) { openCreateReportConfirmation(); } else { - createNewReport(currentUserPersonalDetails, isASAPSubmitBetaEnabled, hasViolations, policy, betas, true, false); + createNewReport(currentUserPersonalDetails, isASAPSubmitBetaEnabled, hasViolations, policy, betas, true, false, undefined, translate); } }; diff --git a/src/pages/inbox/sidebar/FABPopoverContent/menuItems/CreateReportMenuItem.tsx b/src/pages/inbox/sidebar/FABPopoverContent/menuItems/CreateReportMenuItem.tsx index 1a9c6b38cba3..be1c8145f5c0 100644 --- a/src/pages/inbox/sidebar/FABPopoverContent/menuItems/CreateReportMenuItem.tsx +++ b/src/pages/inbox/sidebar/FABPopoverContent/menuItems/CreateReportMenuItem.tsx @@ -82,6 +82,8 @@ function CreateReportMenuItem() { allBetas, false, shouldDismissEmptyReportsConfirmation, + undefined, + translate, ); // Navigate to the Reports page first so getCreateReportRoute() resolves against // the Search/Reports fullscreen context before opening the created report modal. diff --git a/src/pages/iou/request/step/IOURequestEditReport.tsx b/src/pages/iou/request/step/IOURequestEditReport.tsx index a72aff3eaa4b..95653b5c9c04 100644 --- a/src/pages/iou/request/step/IOURequestEditReport.tsx +++ b/src/pages/iou/request/step/IOURequestEditReport.tsx @@ -6,6 +6,7 @@ import type {ListItem} from '@components/SelectionList/types'; import useConditionalCreateEmptyReportConfirmation from '@hooks/useConditionalCreateEmptyReportConfirmation'; import useCurrentUserPersonalDetails from '@hooks/useCurrentUserPersonalDetails'; import useHasPerDiemTransactions from '@hooks/useHasPerDiemTransactions'; +import useLocalize from '@hooks/useLocalize'; import useOnyx from '@hooks/useOnyx'; import usePermissions from '@hooks/usePermissions'; import usePolicyForMovingExpenses from '@hooks/usePolicyForMovingExpenses'; @@ -44,6 +45,7 @@ function IOURequestEditReport({route}: IOURequestEditReportProps) { const [reportNextStep] = useOnyx(`${ONYXKEYS.COLLECTION.NEXT_STEP}${reportID}`); const {isBetaEnabled} = usePermissions(); const isASAPSubmitBetaEnabled = isBetaEnabled(CONST.BETAS.ASAP_SUBMIT); + const {translate} = useLocalize(); const currentUserPersonalDetails = useCurrentUserPersonalDetails(); const [personalPolicyID] = useOnyx(ONYXKEYS.PERSONAL_POLICY_ID); const [userBillingGracePeriodEnds] = useOnyx(ONYXKEYS.COLLECTION.SHARED_NVP_PRIVATE_USER_BILLING_GRACE_PERIOD_END); @@ -131,7 +133,17 @@ function IOURequestEditReport({route}: IOURequestEditReportProps) { return; } - const optimisticReport = createNewReport(ownerPersonalDetails, hasViolations, isASAPSubmitBetaEnabled, policyForMovingExpenses, betas, false, shouldDismissEmptyReportsConfirmation); + const optimisticReport = createNewReport( + ownerPersonalDetails, + hasViolations, + isASAPSubmitBetaEnabled, + policyForMovingExpenses, + betas, + false, + shouldDismissEmptyReportsConfirmation, + undefined, + translate, + ); selectReport( { value: optimisticReport.reportID, diff --git a/src/pages/iou/request/step/IOURequestStepReport.tsx b/src/pages/iou/request/step/IOURequestStepReport.tsx index 5b68a0dfe733..c8dd623ed524 100644 --- a/src/pages/iou/request/step/IOURequestStepReport.tsx +++ b/src/pages/iou/request/step/IOURequestStepReport.tsx @@ -4,6 +4,7 @@ import {usePersonalDetails, useSession} from '@components/OnyxListItemProvider'; import {useSearchSelectionActions} from '@components/Search/SearchContext'; import type {ListItem} from '@components/SelectionList/types'; import useConditionalCreateEmptyReportConfirmation from '@hooks/useConditionalCreateEmptyReportConfirmation'; +import useLocalize from '@hooks/useLocalize'; import useOnyx from '@hooks/useOnyx'; import useOptimisticDraftTransactions from '@hooks/useOptimisticDraftTransactions'; import usePermissions from '@hooks/usePermissions'; @@ -62,6 +63,7 @@ function IOURequestStepReport({route, transaction}: IOURequestStepReportProps) { const isFromGlobalCreate = !!transaction?.isFromGlobalCreate; const {isBetaEnabled} = usePermissions(); const isASAPSubmitBetaEnabled = isBetaEnabled(CONST.BETAS.ASAP_SUBMIT); + const {translate} = useLocalize(); const session = useSession(); const personalDetails = usePersonalDetails(); const ownerAccountID = isUnreported @@ -145,7 +147,17 @@ function IOURequestStepReport({route, transaction}: IOURequestStepReportProps) { } const policyForNewReport = isPerDiemTransaction && perDiemOriginalPolicy ? perDiemOriginalPolicy : policyForMovingExpenses; - const optimisticReport = createNewReport(ownerPersonalDetails, hasViolations, isASAPSubmitBetaEnabled, policyForNewReport, betas, false, shouldDismissEmptyReportsConfirmation); + const optimisticReport = createNewReport( + ownerPersonalDetails, + hasViolations, + isASAPSubmitBetaEnabled, + policyForNewReport, + betas, + false, + shouldDismissEmptyReportsConfirmation, + undefined, + translate, + ); handleRegularReportSelection({value: optimisticReport.reportID, keyForList: optimisticReport.reportID, policyID: policyForNewReport?.id}, optimisticReport); }; diff --git a/src/pages/iou/request/step/IOURequestStepUpgrade.tsx b/src/pages/iou/request/step/IOURequestStepUpgrade.tsx index 9c4daba0a29f..aa8f9fc5598f 100644 --- a/src/pages/iou/request/step/IOURequestStepUpgrade.tsx +++ b/src/pages/iou/request/step/IOURequestStepUpgrade.tsx @@ -122,7 +122,7 @@ function IOURequestStepUpgrade({ if (upgradePath === CONST.UPGRADE_PATHS.REPORTS && policyID && selectedTransactionsKeys.includes(transactionID)) { const newPolicy = allPolicies?.[`${ONYXKEYS.COLLECTION.POLICY}${policyID}`]; - const optimisticReport = createNewReport(ownerPersonalDetails, hasViolations, isASAPSubmitBetaEnabled, newPolicy, betas); + const optimisticReport = createNewReport(ownerPersonalDetails, hasViolations, isASAPSubmitBetaEnabled, newPolicy, betas, false, undefined, undefined, translate); const reportNextStep = allReportNextSteps?.[`${ONYXKEYS.COLLECTION.NEXT_STEP}${optimisticReport.reportID}`]; const policyTagList = policyID ? allPolicyTags?.[`${ONYXKEYS.COLLECTION.POLICY_TAGS}${policyID}`] : {}; @@ -239,6 +239,7 @@ function IOURequestStepUpgrade({ createReportForCurrentUser, transactionViolations, allReports, + translate, ]); const participant = transaction?.participants?.[0]; diff --git a/tests/perf-test/ReportUtils.perf-test.ts b/tests/perf-test/ReportUtils.perf-test.ts index d3455cc6199c..652d1c2016e9 100644 --- a/tests/perf-test/ReportUtils.perf-test.ts +++ b/tests/perf-test/ReportUtils.perf-test.ts @@ -152,6 +152,7 @@ describe('ReportUtils', () => { shouldConsiderScanningReceiptOrPendingRoute: shouldConsiderReceiptBeingScanned, isPreviewMessageForParentChatReport, policy, + translate: translateLocal, }), ); }); diff --git a/tests/unit/OptionsListUtilsTest.tsx b/tests/unit/OptionsListUtilsTest.tsx index 4dbb529ccf9a..cce6f505f78c 100644 --- a/tests/unit/OptionsListUtilsTest.tsx +++ b/tests/unit/OptionsListUtilsTest.tsx @@ -4190,6 +4190,7 @@ describe('OptionsListUtils', () => { policy: null, isForListPreview: true, originalReportAction: reportPreviewAction, + translate: translateLocal, }); const formattedMessage = formatReportLastMessageText(Parser.htmlToText(reportPreviewMessage)); expect(formattedMessage).toBe('$1.00 for A A A'); diff --git a/tests/unit/ReportUtilsTest.ts b/tests/unit/ReportUtilsTest.ts index 4bd706dad4ea..2ac92fa42cba 100644 --- a/tests/unit/ReportUtilsTest.ts +++ b/tests/unit/ReportUtilsTest.ts @@ -14856,7 +14856,7 @@ describe('ReportUtils', () => { }; // When we call getReportPreviewMessage - const result = getReportPreviewMessage({reportOrID: report, iouReportAction: reportAction, originalReportAction: reportAction}); + const result = getReportPreviewMessage({reportOrID: report, iouReportAction: reportAction, originalReportAction: reportAction, translate: translateLocal}); // Then it should return the childReportName instead of "payer owes $0" expect(result).toBe('Expense Report 2025-01-15'); @@ -14876,7 +14876,7 @@ describe('ReportUtils', () => { }; // When we call getReportPreviewMessage - const result = getReportPreviewMessage({reportOrID: report, iouReportAction: reportAction, originalReportAction: reportAction}); + const result = getReportPreviewMessage({reportOrID: report, iouReportAction: reportAction, originalReportAction: reportAction, translate: translateLocal}); // Then it should return the message from the report action (not the childReportName) expect(result).toBe('payer owes $100'); @@ -14892,7 +14892,7 @@ describe('ReportUtils', () => { }; // When we call getReportPreviewMessage with isCopyAction = true - const result = getReportPreviewMessage({reportOrID: report, iouReportAction: reportAction, originalReportAction: reportAction, isCopyAction: true}); + const result = getReportPreviewMessage({reportOrID: report, iouReportAction: reportAction, originalReportAction: reportAction, isCopyAction: true, translate: translateLocal}); // Then it should return the childReportName instead of "payer owes $0" expect(result).toBe('Expense Report 2025-01-15'); @@ -14924,6 +14924,7 @@ describe('ReportUtils', () => { originalReportAction: reportAction, isCopyAction: true, reportAttributes, + translate: translateLocal, }); expect(result).toBe('Computed Report Name'); }); @@ -14969,14 +14970,19 @@ describe('ReportUtils', () => { originalMessage: {...payOriginalMessage, accountNumber: 'XXXXXX4321'}, }; - const result = getReportPreviewMessage({reportOrID: settledReport, iouReportAction: actionWithAccountNumber, originalReportAction: actionWithAccountNumber}); + const result = getReportPreviewMessage({ + reportOrID: settledReport, + iouReportAction: actionWithAccountNumber, + originalReportAction: actionWithAccountNumber, + translate: translateLocal, + }); // Then the preview shows the last 4 digits of that account, not the policy default expect(result).toBe(translate(CONST.LOCALES.EN, 'iou.businessBankAccount', '', '4321')); }); it('falls back to the policy default bank account when the action has no accountNumber', () => { - const result = getReportPreviewMessage({reportOrID: settledReport, iouReportAction: payReportAction, originalReportAction: payReportAction}); + const result = getReportPreviewMessage({reportOrID: settledReport, iouReportAction: payReportAction, originalReportAction: payReportAction, translate: translateLocal}); expect(result).toBe(translate(CONST.LOCALES.EN, 'iou.businessBankAccount', '', '0000')); }); diff --git a/tests/unit/SidebarUtilsTest.ts b/tests/unit/SidebarUtilsTest.ts index e3564b7e8013..76507be0dd1d 100644 --- a/tests/unit/SidebarUtilsTest.ts +++ b/tests/unit/SidebarUtilsTest.ts @@ -3446,6 +3446,7 @@ describe('SidebarUtils', () => { policy: null, isForListPreview: true, originalReportAction: lastReportPreviewAction, + translate: translateLocal, }); expect(result?.alternateText).toBe(`${getLastActorDisplayName({accountID: managerID}, managerID)}: ${reportPreviewMessage}`); }); @@ -3556,6 +3557,7 @@ describe('SidebarUtils', () => { policy: null, isForListPreview: true, originalReportAction: lastReportPreviewAction, + translate: translateLocal, }); expect(result?.alternateText).toBe(reportPreviewMessage); });