From 799f9844c81461706a24b4529ac6f9259c32a4cc Mon Sep 17 00:00:00 2001 From: daledah Date: Fri, 26 Jun 2026 17:04:09 +0700 Subject: [PATCH 1/2] refactor getChatRoomSubtitle function to use translate param --- src/components/AvatarWithDisplayName.tsx | 2 +- .../MoneyRequestReportPreviewContent.tsx | 2 +- .../SearchList/ListItem/WorkspaceCell.tsx | 4 ++- src/libs/OptionsListUtils/index.ts | 4 +-- src/libs/ReportUtils.ts | 20 ++++++++----- src/libs/SidebarUtils.ts | 2 +- src/libs/actions/Task.ts | 5 ++-- src/pages/DynamicReportDetailsPage.tsx | 4 +-- src/pages/ShareCodePage.tsx | 5 +++- src/pages/inbox/HeaderView.tsx | 2 +- .../report/ReportAvatarModalContent.tsx | 6 ++-- src/pages/tasks/NewTaskPage.tsx | 2 +- tests/unit/ReportUtilsTest.ts | 30 +++++++++---------- 13 files changed, 51 insertions(+), 37 deletions(-) diff --git a/src/components/AvatarWithDisplayName.tsx b/src/components/AvatarWithDisplayName.tsx index cc88299d72fe..ee22958b5a21 100644 --- a/src/components/AvatarWithDisplayName.tsx +++ b/src/components/AvatarWithDisplayName.tsx @@ -201,7 +201,7 @@ function AvatarWithDisplayName({ const isReportArchived = useReportIsArchived(report?.reportID); const title = getReportName(report, reportAttributes); const isParentReportArchived = useReportIsArchived(report?.parentReportID); - const subtitle = getChatRoomSubtitle(report, policy, true, isReportArchived); + const subtitle = getChatRoomSubtitle(report, policy, true, isReportArchived, translate); const parentNavigationSubtitleData = getParentNavigationSubtitle(report, policy, conciergeReportID, isParentReportArchived, reportAttributes); const isMoneyRequestOrReport = isMoneyRequestReport(report) || isMoneyRequest(report) || isTrackExpenseReport(report) || isInvoiceReport(report); const ownerPersonalDetails = getPersonalDetailsForAccountIDs(report?.ownerAccountID ? [report.ownerAccountID] : [], personalDetails); diff --git a/src/components/ReportActionItem/MoneyRequestReportPreview/MoneyRequestReportPreviewContent.tsx b/src/components/ReportActionItem/MoneyRequestReportPreview/MoneyRequestReportPreviewContent.tsx index 0c002857292b..ba66c7693344 100644 --- a/src/components/ReportActionItem/MoneyRequestReportPreview/MoneyRequestReportPreviewContent.tsx +++ b/src/components/ReportActionItem/MoneyRequestReportPreview/MoneyRequestReportPreviewContent.tsx @@ -242,7 +242,7 @@ function MoneyRequestReportPreviewContent({ let payerOrApproverName; if (isPolicyExpenseChat || isTripRoom) { - payerOrApproverName = getPolicyName({report: chatReport, policy}); + payerOrApproverName = getPolicyName({report: chatReport, policy, unavailableTranslation: translate('workspace.common.unavailable')}); } else if (isInvoiceRoom) { payerOrApproverName = getInvoicePayerName(chatReport, invoiceReceiverPolicy, invoiceReceiverPersonalDetail); } else { diff --git a/src/components/Search/SearchList/ListItem/WorkspaceCell.tsx b/src/components/Search/SearchList/ListItem/WorkspaceCell.tsx index 2a75591b8a4e..c5962a155792 100644 --- a/src/components/Search/SearchList/ListItem/WorkspaceCell.tsx +++ b/src/components/Search/SearchList/ListItem/WorkspaceCell.tsx @@ -2,6 +2,7 @@ import React from 'react'; import {View} from 'react-native'; import Avatar from '@components/Avatar'; import TextWithTooltip from '@components/TextWithTooltip'; +import useLocalize from '@hooks/useLocalize'; import useThemeStyles from '@hooks/useThemeStyles'; import {getPolicyName, getWorkspaceIcon} from '@libs/ReportUtils'; import CONST from '@src/CONST'; @@ -13,9 +14,10 @@ type WorkspaceCellProps = { }; function WorkspaceCell({policyID, report}: WorkspaceCellProps) { + const {translate} = useLocalize(); const styles = useThemeStyles(); const icon = getWorkspaceIcon(report); - const name = getPolicyName({report}); + const name = getPolicyName({report, unavailableTranslation: translate('workspace.common.unavailable')}); if (report?.type !== CONST.REPORT.TYPE.EXPENSE && report?.type !== CONST.REPORT.TYPE.INVOICE) { return null; diff --git a/src/libs/OptionsListUtils/index.ts b/src/libs/OptionsListUtils/index.ts index 268d04936de7..cab5b5548cc3 100644 --- a/src/libs/OptionsListUtils/index.ts +++ b/src/libs/OptionsListUtils/index.ts @@ -1197,11 +1197,11 @@ function createOption({ // eslint-disable-next-line @typescript-eslint/prefer-nullish-coalescing -- below is a boolean expression hasMultipleParticipants = personalDetailList.length > 1 || result.isChatRoom || result.isPolicyExpenseChat || reportUtilsIsGroupChat(report); - subtitle = getChatRoomSubtitle(report, policy, true, result.private_isArchived); + const translateFn = translate ?? translateLocal; + subtitle = getChatRoomSubtitle(report, policy, true, result.private_isArchived, translateFn); // If displaying chat preview line is needed, let's overwrite the default alternate text const lastActorDetails = personalDetails?.[report?.lastActorAccountID ?? String(CONST.DEFAULT_NUMBER_ID)] ?? {}; - const translateFn = translate ?? translateLocal; result.lastMessageText = getLastMessageTextForReport({ translate: translateFn, report, diff --git a/src/libs/ReportUtils.ts b/src/libs/ReportUtils.ts index 3738743afe70..54c458bd85ce 100644 --- a/src/libs/ReportUtils.ts +++ b/src/libs/ReportUtils.ts @@ -5950,18 +5950,24 @@ function getReportSubtitlePrefix(report: OnyxEntry): string { /** * Get either the policyName or domainName the chat is tied to */ -function getChatRoomSubtitle(report: OnyxEntry, policy: OnyxEntry, isPolicyNamePreferred = false, isReportArchived = false): string | undefined { +function getChatRoomSubtitle( + report: OnyxEntry, + policy: OnyxEntry, + isPolicyNamePreferred = false, + isReportArchived = false, + translate: LocalizedTranslate, +): string | undefined { if (isChatThread(report)) { return ''; } if (isSelfDM(report)) { - return translateLocal('reportActionsView.yourSpace'); + return translate('reportActionsView.yourSpace'); } if (isInvoiceRoom(report)) { - return translateLocal('workspace.common.invoices'); + return translate('workspace.common.invoices'); } if (isConciergeChatReport(report)) { - return translateLocal('reportActionsView.conciergeSupport'); + return translate('reportActionsView.conciergeSupport'); } if (!isDefaultRoom(report) && !isUserCreatedPolicyRoom(report) && !isPolicyExpenseChat(report)) { return ''; @@ -5976,15 +5982,15 @@ function getChatRoomSubtitle(report: OnyxEntry, policy: OnyxEntry 1 || result.isChatRoom || result.isPolicyExpenseChat || isExpense; - const subtitle = getChatRoomSubtitle(report, policy, false, isReportArchived); + const subtitle = getChatRoomSubtitle(report, policy, false, isReportArchived, translate); const status = personalDetail?.status ?? ''; diff --git a/src/libs/actions/Task.ts b/src/libs/actions/Task.ts index 842e4acc3222..0fb2d1ae478a 100644 --- a/src/libs/actions/Task.ts +++ b/src/libs/actions/Task.ts @@ -1,7 +1,7 @@ import type {NullishDeep, OnyxEntry, OnyxUpdate} from 'react-native-onyx'; import Onyx from 'react-native-onyx'; import FallbackAvatar from '@assets/images/avatars/fallback-avatar.svg'; -import type {LocaleContextProps} from '@components/LocaleContextProvider'; +import type {LocaleContextProps, LocalizedTranslate} from '@components/LocaleContextProvider'; import * as API from '@libs/API'; import type {CancelTaskParams, CompleteTaskParams, CreateTaskParams, EditTaskAssigneeParams, EditTaskParams, ReopenTaskParams} from '@libs/API/parameters'; import {WRITE_COMMANDS} from '@libs/API/types'; @@ -1120,6 +1120,7 @@ function getShareDestination( personalDetails: OnyxEntry, localeCompare: LocaleContextProps['localeCompare'], policy: OnyxEntry, + translate: LocalizedTranslate, reportAttributes?: OnyxTypes.ReportAttributesDerivedValue['reports'], ): ShareDestination { const isOneOnOneChat = ReportUtils.isOneOnOneChat(report); @@ -1142,7 +1143,7 @@ function getShareDestination( const login = personalDetails?.[participantAccountID]?.login ?? ''; subtitle = LocalePhoneNumber.formatPhoneNumber(login || displayName); } else { - subtitle = ReportUtils.getChatRoomSubtitle(report, policy) ?? ''; + subtitle = ReportUtils.getChatRoomSubtitle(report, policy, false, false, translate) ?? ''; } return { icons: ReportUtils.getIcons(report, LocalePhoneNumber.formatPhoneNumber, personalDetails, FallbackAvatar), diff --git a/src/pages/DynamicReportDetailsPage.tsx b/src/pages/DynamicReportDetailsPage.tsx index 0e38a6a45acc..4560f982e611 100644 --- a/src/pages/DynamicReportDetailsPage.tsx +++ b/src/pages/DynamicReportDetailsPage.tsx @@ -248,14 +248,14 @@ function DynamicReportDetailsPage({policy, report, route, reportMetadata, report const ancestors = useAncestors(report); const chatRoomSubtitle = useMemo(() => { - const subtitle = getChatRoomSubtitle(report, policy, false, isReportArchived); + const subtitle = getChatRoomSubtitle(report, policy, false, isReportArchived, translate); if (subtitle) { return subtitle; } return ''; - }, [isReportArchived, report, policy]); + }, [isReportArchived, report, policy, translate]); const isSystemChat = useMemo(() => isSystemChatUtil(report), [report]); const isGroupChat = useMemo(() => isGroupChatUtil(report), [report]); diff --git a/src/pages/ShareCodePage.tsx b/src/pages/ShareCodePage.tsx index 694921a63ae2..44323ef88402 100644 --- a/src/pages/ShareCodePage.tsx +++ b/src/pages/ShareCodePage.tsx @@ -98,7 +98,10 @@ function ShareCodePage({report, policy, backTo}: ShareCodePageProps) { .join(' & '); } - return getParentNavigationSubtitle(report, policy, conciergeReportID, isParentReportArchived).workspaceName ?? getChatRoomSubtitle(report, policy, false, isReportArchived); + return ( + getParentNavigationSubtitle(report, policy, conciergeReportID, isParentReportArchived).workspaceName ?? + getChatRoomSubtitle(report, policy, false, isReportArchived, translate) + ); } return currentUserPersonalDetails.login; diff --git a/src/pages/inbox/HeaderView.tsx b/src/pages/inbox/HeaderView.tsx index 945fc1605f28..eab22e85a145 100644 --- a/src/pages/inbox/HeaderView.tsx +++ b/src/pages/inbox/HeaderView.tsx @@ -154,7 +154,7 @@ function HeaderView({onNavigationMenuButtonClicked, reportID}: HeaderViewProps) const {accountID: currentUserAccountID} = useCurrentUserPersonalDetails(); // Use sorted display names for the title for group chats on native small screen widths const title = getReportName(reportHeaderData, reportAttributes); - const subtitle = getChatRoomSubtitle(reportHeaderData, reportHeaderDataPolicy, false, isReportHeaderDataArchived); + const subtitle = getChatRoomSubtitle(reportHeaderData, reportHeaderDataPolicy, false, isReportHeaderDataArchived, translate); // This is used to get the status badge for invoice report subtitle. const statusTextForInvoiceReport = isParentInvoiceAndIsChatThread ? getReportStatusTranslation({stateNum: reportHeaderData?.stateNum, statusNum: reportHeaderData?.statusNum, translate}) diff --git a/src/pages/media/AttachmentModalScreen/routes/report/ReportAvatarModalContent.tsx b/src/pages/media/AttachmentModalScreen/routes/report/ReportAvatarModalContent.tsx index 184ce2a20a69..279f911a3ece 100644 --- a/src/pages/media/AttachmentModalScreen/routes/report/ReportAvatarModalContent.tsx +++ b/src/pages/media/AttachmentModalScreen/routes/report/ReportAvatarModalContent.tsx @@ -1,5 +1,6 @@ import React, {useMemo} from 'react'; import useDefaultAvatars from '@hooks/useDefaultAvatars'; +import useLocalize from '@hooks/useLocalize'; import useOnyx from '@hooks/useOnyx'; import useReportAttributes from '@hooks/useReportAttributes'; import {getReportName} from '@libs/ReportNameUtils'; @@ -15,6 +16,7 @@ import type SCREENS from '@src/SCREENS'; function ReportAvatarModalContent({navigation, route}: AttachmentModalScreenProps) { const {reportID, policyID} = route.params; + const {translate} = useLocalize(); const defaultAvatars = useDefaultAvatars(); const [report] = useOnyx(`${ONYXKEYS.COLLECTION.REPORT}${reportID}`); const [policy] = useOnyx(`${ONYXKEYS.COLLECTION.POLICY}${policyID}`); @@ -39,12 +41,12 @@ function ReportAvatarModalContent({navigation, route}: AttachmentModalScreenProp return { source: getFullSizeAvatar({avatarSource: getWorkspaceIcon(report, policy).source, defaultAvatars}), - headerTitle: getPolicyName({report, policy}), + headerTitle: getPolicyName({report, policy, unavailableTranslation: translate('workspace.common.unavailable')}), // In the case of default workspace avatar, originalFileName prop takes policyID as value to get the color of the avatar originalFileName: policy?.originalFileName ?? policy?.id ?? report?.policyID, isWorkspaceAvatar: true, }; - }, [policy, report, defaultAvatars, reportAttributes]); + }, [policy, report, defaultAvatars, reportAttributes, translate]); const onDownloadAttachment = useDownloadAttachment(); diff --git a/src/pages/tasks/NewTaskPage.tsx b/src/pages/tasks/NewTaskPage.tsx index d5e276296100..4b07b9903f9a 100644 --- a/src/pages/tasks/NewTaskPage.tsx +++ b/src/pages/tasks/NewTaskPage.tsx @@ -51,7 +51,7 @@ function NewTaskPage({route}: NewTaskPageProps) { localeCompare, formatPhoneNumber, ); - const shareDestination = task?.shareDestination ? getShareDestination(parentReport, personalDetails, localeCompare, policy, reportAttributes) : undefined; + const shareDestination = task?.shareDestination ? getShareDestination(parentReport, personalDetails, localeCompare, policy, translate, reportAttributes) : undefined; const ancestors = useAncestors(parentReport); const taskKey = `${task?.assignee}|${task?.assigneeAccountID}|${task?.description}|${task?.parentReportID}|${task?.shareDestination}|${task?.title}`; const [error, setError] = useState<{message: string; taskKey: string}>({message: '', taskKey: ''}); diff --git a/tests/unit/ReportUtilsTest.ts b/tests/unit/ReportUtilsTest.ts index 0e78d8d4f67c..0c3a2d5bfbe5 100644 --- a/tests/unit/ReportUtilsTest.ts +++ b/tests/unit/ReportUtilsTest.ts @@ -3618,46 +3618,46 @@ describe('ReportUtils', () => { it('should return empty string for chat thread', () => { const report = createWorkspaceThread(1); - const result = getChatRoomSubtitle(report, policy); + const result = getChatRoomSubtitle(report, policy, false, false, translateLocal); expect(result).toBe(''); }); it('should return "Your space" for self DM', () => { const report = createSelfDM(1, currentUserAccountID); - const result = getChatRoomSubtitle(report, policy); + const result = getChatRoomSubtitle(report, policy, false, false, translateLocal); expect(result).toBe('Your space'); }); it('should return "Invoices" for invoice room', () => { const report = createInvoiceRoom(1); - const result = getChatRoomSubtitle(report, policy); + const result = getChatRoomSubtitle(report, policy, false, false, translateLocal); expect(result).toBe('Invoices'); }); it('should return empty string for non-default, non-user-created, non-policy-expense chat', () => { const report = createRegularChat(1, [currentUserAccountID, 2]); - const result = getChatRoomSubtitle(report, policy); + const result = getChatRoomSubtitle(report, policy, false, false, translateLocal); expect(result).toBe(''); }); it('should return domain name for domain room', () => { const report = createDomainRoom(1); report.reportName = '#example.com'; - const result = getChatRoomSubtitle(report, policy); + const result = getChatRoomSubtitle(report, policy, false, false, translateLocal); expect(result).toBe('example.com'); }); it('should return policy name for admin room', () => { const report = createAdminRoom(1); report.policyID = policy.id; - const result = getChatRoomSubtitle(report, policy); + const result = getChatRoomSubtitle(report, policy, false, false, translateLocal); expect(result).toBe(policy.name); }); it('should return policy name for announce room', () => { const report = createAnnounceRoom(1); report.policyID = policy.id; - const result = getChatRoomSubtitle(report, policy); + const result = getChatRoomSubtitle(report, policy, false, false, translateLocal); expect(result).toBe(policy.name); }); @@ -3667,42 +3667,42 @@ describe('ReportUtils', () => { type: CONST.REPORT.TYPE.CHAT, policyID: policy.id, }; - const result = getChatRoomSubtitle(report, policy); + const result = getChatRoomSubtitle(report, policy, false, false, translateLocal); expect(result).toBe(policy.name); }); it('should return policy name for policy expense chat when not in create expense flow', () => { const report = createPolicyExpenseChat(1); report.policyID = policy.id; - const result = getChatRoomSubtitle(report, policy); + const result = getChatRoomSubtitle(report, policy, false, false, translateLocal); expect(result).toBe(policy.name); }); it('should return empty string for expense report (not default/user-created/policy-expense)', () => { const report = createExpenseReport(1); report.policyID = policy.id; - const result = getChatRoomSubtitle(report, policy); + const result = getChatRoomSubtitle(report, policy, false, false, translateLocal); expect(result).toBe(''); }); it('should return empty string for expense report in create expense flow (not default/user-created/policy-expense)', () => { const report = createExpenseReport(1); report.policyID = policy.id; - const result = getChatRoomSubtitle(report, policy, true, false); + const result = getChatRoomSubtitle(report, policy, true, false, translateLocal); expect(result).toBe(''); }); it('should return oldPolicyName when report is archived', () => { const report = createAdminRoom(1); report.oldPolicyName = 'Old Policy Name'; - const result = getChatRoomSubtitle(report, policy, false, true); + const result = getChatRoomSubtitle(report, policy, false, true, translateLocal); expect(result).toBe('Old Policy Name'); }); it('should return empty string when report is archived but has no oldPolicyName', () => { const report = createAdminRoom(1); report.oldPolicyName = undefined; - const result = getChatRoomSubtitle(report, policy, false, true); + const result = getChatRoomSubtitle(report, policy, false, true, translateLocal); expect(result).toBe(''); }); @@ -3710,14 +3710,14 @@ describe('ReportUtils', () => { const report = createAdminRoom(1); report.policyID = policy.id; report.oldPolicyName = 'Archived Policy'; - const result = getChatRoomSubtitle(report, policy, true, true); + const result = getChatRoomSubtitle(report, policy, true, true, translateLocal); expect(result).toBe('Archived Policy'); }); it('should handle with only report data', () => { const report = createAdminRoom(1); report.policyID = policy.id; - const result = getChatRoomSubtitle(report, policy); + const result = getChatRoomSubtitle(report, policy, false, false, translateLocal); expect(result).toBe(policy.name); }); }); From f96c4ac3e5035279d3ad275adb55cf88b60f6294 Mon Sep 17 00:00:00 2001 From: daledah Date: Mon, 29 Jun 2026 10:51:48 +0700 Subject: [PATCH 2/2] fix ts and eslint --- src/components/AvatarWithDisplayName.tsx | 2 +- src/libs/OptionsListUtils/index.ts | 2 +- src/libs/ReportUtils.ts | 2 +- src/libs/SidebarUtils.ts | 2 +- src/libs/actions/Task.ts | 2 +- src/pages/DynamicReportDetailsPage.tsx | 2 +- src/pages/ShareCodePage.tsx | 2 +- src/pages/inbox/HeaderView.tsx | 2 +- tests/actions/TaskTest.ts | 8 +++--- tests/unit/ReportUtilsTest.ts | 34 ++++++++++++------------ 10 files changed, 29 insertions(+), 29 deletions(-) diff --git a/src/components/AvatarWithDisplayName.tsx b/src/components/AvatarWithDisplayName.tsx index 1b41272a05e8..481a3f9fa6b6 100644 --- a/src/components/AvatarWithDisplayName.tsx +++ b/src/components/AvatarWithDisplayName.tsx @@ -201,7 +201,7 @@ function AvatarWithDisplayName({ const isReportArchived = useReportIsArchived(report?.reportID); const title = getReportName(report, reportAttributes); const isParentReportArchived = useReportIsArchived(report?.parentReportID); - const subtitle = getChatRoomSubtitle(report, policy, conciergeReportID, true, isReportArchived, translate); + const subtitle = getChatRoomSubtitle(report, policy, conciergeReportID, translate, true, isReportArchived); const parentNavigationSubtitleData = getParentNavigationSubtitle(report, policy, conciergeReportID, isParentReportArchived, reportAttributes); const isMoneyRequestOrReport = isMoneyRequestReport(report) || isMoneyRequest(report) || isTrackExpenseReport(report) || isInvoiceReport(report); const ownerPersonalDetails = getPersonalDetailsForAccountIDs(report?.ownerAccountID ? [report.ownerAccountID] : [], personalDetails); diff --git a/src/libs/OptionsListUtils/index.ts b/src/libs/OptionsListUtils/index.ts index 113ac22ebe0e..8a04995956e6 100644 --- a/src/libs/OptionsListUtils/index.ts +++ b/src/libs/OptionsListUtils/index.ts @@ -1198,7 +1198,7 @@ function createOption({ // eslint-disable-next-line @typescript-eslint/prefer-nullish-coalescing -- below is a boolean expression hasMultipleParticipants = personalDetailList.length > 1 || result.isChatRoom || result.isPolicyExpenseChat || reportUtilsIsGroupChat(report); const translateFn = translate ?? translateLocal; - subtitle = getChatRoomSubtitle(report, policy, conciergeReportID, true, result.private_isArchived, translateFn); + subtitle = getChatRoomSubtitle(report, policy, conciergeReportID, translateFn, true, result.private_isArchived); // If displaying chat preview line is needed, let's overwrite the default alternate text const lastActorDetails = personalDetails?.[report?.lastActorAccountID ?? String(CONST.DEFAULT_NUMBER_ID)] ?? {}; diff --git a/src/libs/ReportUtils.ts b/src/libs/ReportUtils.ts index 8ab06e83d676..67be11011324 100644 --- a/src/libs/ReportUtils.ts +++ b/src/libs/ReportUtils.ts @@ -5954,9 +5954,9 @@ function getChatRoomSubtitle( report: OnyxEntry, policy: OnyxEntry, conciergeReportID: string | undefined, + translate: LocalizedTranslate, isPolicyNamePreferred = false, isReportArchived = false, - translate: LocalizedTranslate, ): string | undefined { if (isChatThread(report)) { return ''; diff --git a/src/libs/SidebarUtils.ts b/src/libs/SidebarUtils.ts index 011689a629ee..ddf9c0d3176b 100644 --- a/src/libs/SidebarUtils.ts +++ b/src/libs/SidebarUtils.ts @@ -935,7 +935,7 @@ function getOptionData({ const isExpense = isExpenseReport(report); const hasMultipleParticipants = participantPersonalDetailList.length > 1 || result.isChatRoom || result.isPolicyExpenseChat || isExpense; - const subtitle = getChatRoomSubtitle(report, policy, conciergeReportID, false, isReportArchived, translate); + const subtitle = getChatRoomSubtitle(report, policy, conciergeReportID, translate, false, isReportArchived); const status = personalDetail?.status ?? ''; diff --git a/src/libs/actions/Task.ts b/src/libs/actions/Task.ts index 3211e1672028..68b7a01934e1 100644 --- a/src/libs/actions/Task.ts +++ b/src/libs/actions/Task.ts @@ -1144,7 +1144,7 @@ function getShareDestination( const login = personalDetails?.[participantAccountID]?.login ?? ''; subtitle = LocalePhoneNumber.formatPhoneNumber(login || displayName); } else { - subtitle = ReportUtils.getChatRoomSubtitle(report, policy, conciergeReportID, false, false, translate) ?? ''; + subtitle = ReportUtils.getChatRoomSubtitle(report, policy, conciergeReportID, translate) ?? ''; } return { icons: ReportUtils.getIcons(report, LocalePhoneNumber.formatPhoneNumber, personalDetails, FallbackAvatar), diff --git a/src/pages/DynamicReportDetailsPage.tsx b/src/pages/DynamicReportDetailsPage.tsx index 2f116ddc4a39..cde9780044ad 100644 --- a/src/pages/DynamicReportDetailsPage.tsx +++ b/src/pages/DynamicReportDetailsPage.tsx @@ -248,7 +248,7 @@ function DynamicReportDetailsPage({policy, report, route, reportMetadata, report const ancestors = useAncestors(report); const chatRoomSubtitle = useMemo(() => { - const subtitle = getChatRoomSubtitle(report, policy, conciergeReportID, false, isReportArchived, translate); + const subtitle = getChatRoomSubtitle(report, policy, conciergeReportID, translate, false, isReportArchived); if (subtitle) { return subtitle; diff --git a/src/pages/ShareCodePage.tsx b/src/pages/ShareCodePage.tsx index 3ec0bb940c9e..3754af75f5ae 100644 --- a/src/pages/ShareCodePage.tsx +++ b/src/pages/ShareCodePage.tsx @@ -100,7 +100,7 @@ function ShareCodePage({report, policy, backTo}: ShareCodePageProps) { return ( getParentNavigationSubtitle(report, policy, conciergeReportID, isParentReportArchived).workspaceName ?? - getChatRoomSubtitle(report, policy, conciergeReportID, false, isReportArchived, translate) + getChatRoomSubtitle(report, policy, conciergeReportID, translate, false, isReportArchived) ); } diff --git a/src/pages/inbox/HeaderView.tsx b/src/pages/inbox/HeaderView.tsx index c20b8199b39d..41858e47a8fd 100644 --- a/src/pages/inbox/HeaderView.tsx +++ b/src/pages/inbox/HeaderView.tsx @@ -154,7 +154,7 @@ function HeaderView({onNavigationMenuButtonClicked, reportID}: HeaderViewProps) const {accountID: currentUserAccountID} = useCurrentUserPersonalDetails(); // Use sorted display names for the title for group chats on native small screen widths const title = getReportName(reportHeaderData, reportAttributes); - const subtitle = getChatRoomSubtitle(reportHeaderData, reportHeaderDataPolicy, conciergeReportID, false, isReportHeaderDataArchived, translate); + const subtitle = getChatRoomSubtitle(reportHeaderData, reportHeaderDataPolicy, conciergeReportID, translate, false, isReportHeaderDataArchived); // This is used to get the status badge for invoice report subtitle. const statusTextForInvoiceReport = isParentInvoiceAndIsChatThread ? getReportStatusTranslation({stateNum: reportHeaderData?.stateNum, statusNum: reportHeaderData?.statusNum, translate}) diff --git a/tests/actions/TaskTest.ts b/tests/actions/TaskTest.ts index 1c4eace1da7f..0a6e02b2df6d 100644 --- a/tests/actions/TaskTest.ts +++ b/tests/actions/TaskTest.ts @@ -34,7 +34,7 @@ import type {OnyxData} from '@src/types/onyx/Request'; import createRandomPolicy from '../utils/collections/policies'; import createMock from '../utils/createMock'; import {getFakeReport, getFakeReportAction} from '../utils/LHNTestUtils'; -import {getGlobalFetchMock} from '../utils/TestHelper'; +import {getGlobalFetchMock, translateLocal} from '../utils/TestHelper'; import waitForBatchedUpdates from '../utils/waitForBatchedUpdates'; import waitForBatchedUpdatesWithAct from '../utils/waitForBatchedUpdatesWithAct'; @@ -1695,7 +1695,7 @@ describe('actions/Task', () => { const report = getFakeReport([CURRENT_USER_ACCOUNT_ID, OTHER_ACCOUNT_ID]); // When the share destination is built - const result = getShareDestination(report, personalDetails, localeCompare, undefined, undefined); + const result = getShareDestination(report, personalDetails, localeCompare, undefined, undefined, translateLocal); // Then the subtitle is the other participant's login and the display name matches getReportName expect(result.subtitle).toBe(OTHER_LOGIN); @@ -1712,7 +1712,7 @@ describe('actions/Task', () => { }; // When the share destination is built - const result = getShareDestination(report, personalDetails, localeCompare, policy, undefined); + const result = getShareDestination(report, personalDetails, localeCompare, policy, undefined, translateLocal); // Then the subtitle falls back to the workspace name resolved by getChatRoomSubtitle expect(result.subtitle).toBe(policy.name); @@ -1724,7 +1724,7 @@ describe('actions/Task', () => { const report = getFakeReport([CURRENT_USER_ACCOUNT_ID, OTHER_ACCOUNT_ID]); // When the share destination is built - const result = getShareDestination(report, personalDetails, localeCompare, undefined, undefined); + const result = getShareDestination(report, personalDetails, localeCompare, undefined, undefined, translateLocal); // Then it includes the icons and tooltip metadata used to render the destination expect(Array.isArray(result.icons)).toBe(true); diff --git a/tests/unit/ReportUtilsTest.ts b/tests/unit/ReportUtilsTest.ts index 7da6714129f1..a9b20ceed5cb 100644 --- a/tests/unit/ReportUtilsTest.ts +++ b/tests/unit/ReportUtilsTest.ts @@ -3618,46 +3618,46 @@ describe('ReportUtils', () => { it('should return empty string for chat thread', () => { const report = createWorkspaceThread(1); - const result = getChatRoomSubtitle(report, policy, undefined, false, false, translateLocal); + const result = getChatRoomSubtitle(report, policy, undefined, translateLocal); expect(result).toBe(''); }); it('should return "Your space" for self DM', () => { const report = createSelfDM(1, currentUserAccountID); - const result = getChatRoomSubtitle(report, policy, undefined, false, false, translateLocal); + const result = getChatRoomSubtitle(report, policy, undefined, translateLocal); expect(result).toBe('Your space'); }); it('should return "Invoices" for invoice room', () => { const report = createInvoiceRoom(1); - const result = getChatRoomSubtitle(report, policy, undefined, false, false, translateLocal); + const result = getChatRoomSubtitle(report, policy, undefined, translateLocal); expect(result).toBe('Invoices'); }); it('should return empty string for non-default, non-user-created, non-policy-expense chat', () => { const report = createRegularChat(1, [currentUserAccountID, 2]); - const result = getChatRoomSubtitle(report, policy, undefined, false, false, translateLocal); + const result = getChatRoomSubtitle(report, policy, undefined, translateLocal); expect(result).toBe(''); }); it('should return domain name for domain room', () => { const report = createDomainRoom(1); report.reportName = '#example.com'; - const result = getChatRoomSubtitle(report, policy, undefined, false, false, translateLocal); + const result = getChatRoomSubtitle(report, policy, undefined, translateLocal); expect(result).toBe('example.com'); }); it('should return policy name for admin room', () => { const report = createAdminRoom(1); report.policyID = policy.id; - const result = getChatRoomSubtitle(report, policy, undefined, false, false, translateLocal); + const result = getChatRoomSubtitle(report, policy, undefined, translateLocal); expect(result).toBe(policy.name); }); it('should return policy name for announce room', () => { const report = createAnnounceRoom(1); report.policyID = policy.id; - const result = getChatRoomSubtitle(report, policy, undefined, false, false, translateLocal); + const result = getChatRoomSubtitle(report, policy, undefined, translateLocal); expect(result).toBe(policy.name); }); @@ -3667,42 +3667,42 @@ describe('ReportUtils', () => { type: CONST.REPORT.TYPE.CHAT, policyID: policy.id, }; - const result = getChatRoomSubtitle(report, policy, undefined, false, false, translateLocal); + const result = getChatRoomSubtitle(report, policy, undefined, translateLocal); expect(result).toBe(policy.name); }); it('should return policy name for policy expense chat when not in create expense flow', () => { const report = createPolicyExpenseChat(1); report.policyID = policy.id; - const result = getChatRoomSubtitle(report, policy, undefined, false, false, translateLocal); + const result = getChatRoomSubtitle(report, policy, undefined, translateLocal); expect(result).toBe(policy.name); }); it('should return empty string for expense report (not default/user-created/policy-expense)', () => { const report = createExpenseReport(1); report.policyID = policy.id; - const result = getChatRoomSubtitle(report, policy, undefined, false, false, translateLocal); + const result = getChatRoomSubtitle(report, policy, undefined, translateLocal); expect(result).toBe(''); }); it('should return empty string for expense report in create expense flow (not default/user-created/policy-expense)', () => { const report = createExpenseReport(1); report.policyID = policy.id; - const result = getChatRoomSubtitle(report, policy, undefined, true, false, translateLocal); + const result = getChatRoomSubtitle(report, policy, undefined, translateLocal, true); expect(result).toBe(''); }); it('should return oldPolicyName when report is archived', () => { const report = createAdminRoom(1); report.oldPolicyName = 'Old Policy Name'; - const result = getChatRoomSubtitle(report, policy, undefined, false, true, translateLocal); + const result = getChatRoomSubtitle(report, policy, undefined, translateLocal, false, true); expect(result).toBe('Old Policy Name'); }); it('should return empty string when report is archived but has no oldPolicyName', () => { const report = createAdminRoom(1); report.oldPolicyName = undefined; - const result = getChatRoomSubtitle(report, policy, undefined, false, true, translateLocal); + const result = getChatRoomSubtitle(report, policy, undefined, translateLocal, false, true); expect(result).toBe(''); }); @@ -3710,26 +3710,26 @@ describe('ReportUtils', () => { const report = createAdminRoom(1); report.policyID = policy.id; report.oldPolicyName = 'Archived Policy'; - const result = getChatRoomSubtitle(report, policy, undefined, true, true, translateLocal); + const result = getChatRoomSubtitle(report, policy, undefined, translateLocal, true, true); expect(result).toBe('Archived Policy'); }); it('should handle with only report data', () => { const report = createAdminRoom(1); report.policyID = policy.id; - const result = getChatRoomSubtitle(report, policy, undefined, false, false, translateLocal); + const result = getChatRoomSubtitle(report, policy, undefined, translateLocal); expect(result).toBe(policy.name); }); it('should return "Concierge support" when the report is the Concierge chat passed via conciergeReportID', () => { const report = createRegularChat(1, [currentUserAccountID, CONST.ACCOUNT_ID.CONCIERGE]); - const result = getChatRoomSubtitle(report, policy, report.reportID, false, false, translateLocal); + const result = getChatRoomSubtitle(report, policy, report.reportID, translateLocal); expect(result).toBe('Your personal AI agent'); }); it('should not return "Concierge support" when conciergeReportID does not match the report', () => { const report = createRegularChat(1, [currentUserAccountID, CONST.ACCOUNT_ID.CONCIERGE]); - const result = getChatRoomSubtitle(report, policy, 'some-other-report-id', false, false, translateLocal); + const result = getChatRoomSubtitle(report, policy, 'some-other-report-id', translateLocal); expect(result).not.toBe('Your personal AI agent'); }); });