diff --git a/src/components/ReportWelcomeText.tsx b/src/components/ReportWelcomeText.tsx index a5c46b82d94a..96f705ea2d52 100644 --- a/src/components/ReportWelcomeText.tsx +++ b/src/components/ReportWelcomeText.tsx @@ -7,6 +7,7 @@ import useThemeStyles from '@hooks/useThemeStyles'; import Navigation from '@libs/Navigation/Navigation'; import * as OptionsListUtils from '@libs/OptionsListUtils'; import * as ReportUtils from '@libs/ReportUtils'; +import SidebarUtils from '@libs/SidebarUtils'; import CONST from '@src/CONST'; import type {IOUType} from '@src/CONST'; import ONYXKEYS from '@src/ONYXKEYS'; @@ -42,7 +43,7 @@ function ReportWelcomeText({report, policy, personalDetails}: ReportWelcomeTextP const participantAccountIDs = ReportUtils.getParticipantsAccountIDsForDisplay(report); const isMultipleParticipant = participantAccountIDs.length > 1; const displayNamesWithTooltips = ReportUtils.getDisplayNamesWithTooltips(OptionsListUtils.getPersonalDetailsForAccountIDs(participantAccountIDs, personalDetails), isMultipleParticipant); - const roomWelcomeMessage = ReportUtils.getRoomWelcomeMessage(report); + const welcomeMessage = SidebarUtils.getWelcomeMessage(report, policy); const moneyRequestOptions = ReportUtils.temporary_getMoneyRequestOptions(report, policy, participantAccountIDs); const additionalText = moneyRequestOptions .filter((item): item is Exclude => item !== CONST.IOU.TYPE.INVOICE) @@ -86,47 +87,47 @@ function ReportWelcomeText({report, policy, personalDetails}: ReportWelcomeTextP {isPolicyExpenseChat && - (policy?.description ? ( + (welcomeMessage?.messageHtml ? ( { if (!canEditPolicyDescription) { return; } - Navigation.navigate(ROUTES.WORKSPACE_PROFILE_DESCRIPTION.getRoute(policy.id)); + Navigation.navigate(ROUTES.WORKSPACE_PROFILE_DESCRIPTION.getRoute(policy?.id ?? '-1')); }} style={[styles.renderHTML, canEditPolicyDescription ? styles.cursorPointer : styles.cursorText]} accessibilityLabel={translate('reportDescriptionPage.roomDescription')} > - + ) : ( - {translate('reportActionsView.beginningOfChatHistoryPolicyExpenseChatPartOne')} + {welcomeMessage.phrase1} {ReportUtils.getDisplayNameForParticipant(report?.ownerAccountID)} - {translate('reportActionsView.beginningOfChatHistoryPolicyExpenseChatPartTwo')} + {welcomeMessage.phrase2} {ReportUtils.getPolicyName(report)} - {translate('reportActionsView.beginningOfChatHistoryPolicyExpenseChatPartThree')} + {welcomeMessage.phrase3} ))} {isChatRoom && - (report?.description ? ( + (welcomeMessage?.messageHtml ? ( { if (ReportUtils.canEditReportDescription(report, policy)) { - Navigation.navigate(ROUTES.REPORT_DESCRIPTION.getRoute(report.reportID)); + Navigation.navigate(ROUTES.REPORT_DESCRIPTION.getRoute(report?.reportID ?? '-1')); return; } - Navigation.navigate(ROUTES.REPORT_WITH_ID_DETAILS.getRoute(report.reportID)); + Navigation.navigate(ROUTES.REPORT_WITH_ID_DETAILS.getRoute(report?.reportID ?? '-1')); }} style={styles.renderHTML} accessibilityLabel={translate('reportDescriptionPage.roomDescription')} > - + ) : ( - {roomWelcomeMessage.phrase1} - {roomWelcomeMessage.showReportName && ( + {welcomeMessage.phrase1} + {welcomeMessage.showReportName && ( )} - {roomWelcomeMessage.phrase2 !== undefined && {roomWelcomeMessage.phrase2}} + {welcomeMessage.phrase2 !== undefined && {welcomeMessage.phrase2}} ))} {isSelfDM && ( - {translate('reportActionsView.beginningOfChatHistorySelfDM')} + {welcomeMessage.phrase1} )} {isSystemChat && ( - {translate('reportActionsView.beginningOfChatHistorySystemDM')} + {welcomeMessage.phrase1} )} {isDefault && ( - {translate('reportActionsView.beginningOfChatHistory')} + {welcomeMessage.phrase1} {displayNamesWithTooltips.map(({displayName, accountID}, index) => ( // eslint-disable-next-line react/no-array-index-key diff --git a/src/libs/ReportUtils.ts b/src/libs/ReportUtils.ts index 9fe81b7de5b1..ad600fe43104 100644 --- a/src/libs/ReportUtils.ts +++ b/src/libs/ReportUtils.ts @@ -83,8 +83,6 @@ import * as UserUtils from './UserUtils'; type AvatarRange = 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18; -type WelcomeMessage = {showReportName: boolean; phrase1?: string; phrase2?: string}; - type SpendBreakdown = { nonReimbursableSpend: number; reimbursableSpend: number; @@ -1632,37 +1630,6 @@ function canDeleteReportAction(reportAction: OnyxInputOrEntry, rep return isActionOwner || isAdmin; } -/** - * Get welcome message based on room type - */ -function getRoomWelcomeMessage(report: OnyxEntry): WelcomeMessage { - const welcomeMessage: WelcomeMessage = {showReportName: true}; - const workspaceName = getPolicyName(report); - - if (isArchivedRoom(report)) { - welcomeMessage.phrase1 = Localize.translateLocal('reportActionsView.beginningOfArchivedRoomPartOne'); - welcomeMessage.phrase2 = Localize.translateLocal('reportActionsView.beginningOfArchivedRoomPartTwo'); - } else if (isDomainRoom(report)) { - welcomeMessage.phrase1 = Localize.translateLocal('reportActionsView.beginningOfChatHistoryDomainRoomPartOne', {domainRoom: report?.reportName ?? ''}); - welcomeMessage.phrase2 = Localize.translateLocal('reportActionsView.beginningOfChatHistoryDomainRoomPartTwo'); - } else if (isAdminRoom(report)) { - welcomeMessage.phrase1 = Localize.translateLocal('reportActionsView.beginningOfChatHistoryAdminRoomPartOne', {workspaceName}); - welcomeMessage.phrase2 = Localize.translateLocal('reportActionsView.beginningOfChatHistoryAdminRoomPartTwo'); - } else if (isAnnounceRoom(report)) { - welcomeMessage.phrase1 = Localize.translateLocal('reportActionsView.beginningOfChatHistoryAnnounceRoomPartOne', {workspaceName}); - welcomeMessage.phrase2 = Localize.translateLocal('reportActionsView.beginningOfChatHistoryAnnounceRoomPartTwo', {workspaceName}); - } else if (isInvoiceRoom(report)) { - welcomeMessage.showReportName = false; - welcomeMessage.phrase1 = Localize.translateLocal('reportActionsView.beginningOfChatHistoryInvoiceRoom'); - } else { - // Message for user created rooms or other room types. - welcomeMessage.phrase1 = Localize.translateLocal('reportActionsView.beginningOfChatHistoryUserRoomPartOne'); - welcomeMessage.phrase2 = Localize.translateLocal('reportActionsView.beginningOfChatHistoryUserRoomPartTwo'); - } - - return welcomeMessage; -} - /** * Returns true if Concierge is one of the chat participants (1:1 as well as group chats) */ @@ -7245,7 +7212,6 @@ export { getReportPreviewMessage, getReportRecipientAccountIDs, getRoom, - getRoomWelcomeMessage, getRootParentReport, getRouteFromLink, getSystemChat, @@ -7318,6 +7284,7 @@ export { isIOUReport, isIOUReportUsingReport, isJoinRequestInAdminRoom, + isDomainRoom, isMoneyRequest, isMoneyRequestReport, isMoneyRequestReportPendingDeletion, diff --git a/src/libs/SidebarUtils.ts b/src/libs/SidebarUtils.ts index 3151f522d800..1007ba455fa6 100644 --- a/src/libs/SidebarUtils.ts +++ b/src/libs/SidebarUtils.ts @@ -18,12 +18,15 @@ import localeCompare from './LocaleCompare'; import * as LocalePhoneNumber from './LocalePhoneNumber'; import * as Localize from './Localize'; import * as OptionsListUtils from './OptionsListUtils'; +import Parser from './Parser'; import Permissions from './Permissions'; import * as PolicyUtils from './PolicyUtils'; import * as ReportActionsUtils from './ReportActionsUtils'; import * as ReportUtils from './ReportUtils'; import * as TaskUtils from './TaskUtils'; +type WelcomeMessage = {showReportName: boolean; phrase1?: string; phrase2?: string; phrase3?: string; messageText?: string; messageHtml?: string}; + let allBetas: OnyxEntry; Onyx.connect({ key: ONYXKEYS.BETAS, @@ -31,6 +34,13 @@ Onyx.connect({ }); const visibleReportActionItems: ReportActions = {}; +let allPersonalDetails: OnyxEntry; +Onyx.connect({ + key: ONYXKEYS.PERSONAL_DETAILS_LIST, + callback: (value) => { + allPersonalDetails = value ?? {}; + }, +}); Onyx.connect({ key: ONYXKEYS.COLLECTION.REPORT_ACTIONS, callback: (actions, key) => { @@ -421,38 +431,12 @@ function getOptionData({ } else { result.alternateText = lastMessageTextFromReport.length > 0 ? lastMessageText : ReportActionsUtils.getLastVisibleMessage(report.reportID, {}, lastAction)?.lastMessageText; if (!result.alternateText) { - result.alternateText = Localize.translate(preferredLocale, 'report.noActivityYet'); + result.alternateText = ReportUtils.formatReportLastMessageText(getWelcomeMessage(report, policy).messageText ?? Localize.translateLocal('report.noActivityYet')); } } } else { if (!lastMessageText) { - if (ReportUtils.isSystemChat(report)) { - lastMessageText = Localize.translate(preferredLocale, 'reportActionsView.beginningOfChatHistorySystemDM'); - } else if (ReportUtils.isSelfDM(report)) { - lastMessageText = Localize.translate(preferredLocale, 'reportActionsView.beginningOfChatHistorySelfDM'); - } else { - // Here we get the beginning of chat history message and append the display name for each user, adding pronouns if there are any. - // We also add a fullstop after the final name, the word "and" before the final name and commas between all previous names. - lastMessageText = - Localize.translate(preferredLocale, 'reportActionsView.beginningOfChatHistory') + - displayNamesWithTooltips - .map(({displayName, pronouns}, index) => { - const formattedText = !pronouns ? displayName : `${displayName} (${pronouns})`; - - if (index === displayNamesWithTooltips.length - 1) { - return `${formattedText}.`; - } - if (index === displayNamesWithTooltips.length - 2) { - return `${formattedText} ${Localize.translate(preferredLocale, 'common.and')}`; - } - if (index < displayNamesWithTooltips.length - 2) { - return `${formattedText},`; - } - - return ''; - }) - .join(' '); - } + lastMessageText = ReportUtils.formatReportLastMessageText(getWelcomeMessage(report, policy).messageText ?? Localize.translateLocal('report.noActivityYet')); } result.alternateText = @@ -493,7 +477,111 @@ function getOptionData({ return result; } +function getWelcomeMessage(report: OnyxEntry, policy: OnyxEntry): WelcomeMessage { + const welcomeMessage: WelcomeMessage = {showReportName: true}; + if (ReportUtils.isChatThread(report) || ReportUtils.isTaskReport(report)) { + return welcomeMessage; + } + + if (ReportUtils.isChatRoom(report)) { + return getRoomWelcomeMessage(report); + } + + if (ReportUtils.isPolicyExpenseChat(report)) { + if (policy?.description) { + welcomeMessage.messageHtml = policy.description; + welcomeMessage.messageText = Parser.htmlToText(welcomeMessage.messageHtml); + } else { + welcomeMessage.phrase1 = Localize.translateLocal('reportActionsView.beginningOfChatHistoryPolicyExpenseChatPartOne'); + welcomeMessage.phrase2 = Localize.translateLocal('reportActionsView.beginningOfChatHistoryPolicyExpenseChatPartTwo'); + welcomeMessage.phrase3 = Localize.translateLocal('reportActionsView.beginningOfChatHistoryPolicyExpenseChatPartThree'); + welcomeMessage.messageText = `${welcomeMessage.phrase1} ${ReportUtils.getDisplayNameForParticipant(report?.ownerAccountID)} ${welcomeMessage.phrase2} ${ReportUtils.getPolicyName( + report, + )} ${welcomeMessage.phrase3}`; + } + return welcomeMessage; + } + + if (ReportUtils.isSelfDM(report)) { + welcomeMessage.phrase1 = Localize.translateLocal('reportActionsView.beginningOfChatHistorySelfDM'); + welcomeMessage.messageText = welcomeMessage.phrase1; + return welcomeMessage; + } + + if (ReportUtils.isSystemChat(report)) { + welcomeMessage.phrase1 = Localize.translateLocal('reportActionsView.beginningOfChatHistorySystemDM'); + welcomeMessage.messageText = welcomeMessage.phrase1; + return welcomeMessage; + } + + welcomeMessage.phrase1 = Localize.translateLocal('reportActionsView.beginningOfChatHistory'); + const participantAccountIDs = ReportUtils.getParticipantsAccountIDsForDisplay(report); + const isMultipleParticipant = participantAccountIDs.length > 1; + const displayNamesWithTooltips = ReportUtils.getDisplayNamesWithTooltips( + OptionsListUtils.getPersonalDetailsForAccountIDs(participantAccountIDs, allPersonalDetails), + isMultipleParticipant, + ); + const displayNamesWithTooltipsText = displayNamesWithTooltips + .map(({displayName, pronouns}, index) => { + const formattedText = !pronouns ? displayName : `${displayName} (${pronouns})`; + + if (index === displayNamesWithTooltips.length - 1) { + return `${formattedText}.`; + } + if (index === displayNamesWithTooltips.length - 2) { + return `${formattedText} ${Localize.translateLocal('common.and')}`; + } + if (index < displayNamesWithTooltips.length - 2) { + return `${formattedText},`; + } + + return ''; + }) + .join(' '); + + welcomeMessage.messageText = `${welcomeMessage.phrase1} ${displayNamesWithTooltipsText}`; + return welcomeMessage; +} + +/** + * Get welcome message based on room type + */ +function getRoomWelcomeMessage(report: OnyxEntry): WelcomeMessage { + const welcomeMessage: WelcomeMessage = {showReportName: true}; + const workspaceName = ReportUtils.getPolicyName(report); + + if (report?.description) { + welcomeMessage.messageHtml = report.description; + welcomeMessage.messageText = Parser.htmlToText(welcomeMessage.messageHtml); + return welcomeMessage; + } + if (ReportUtils.isArchivedRoom(report)) { + welcomeMessage.phrase1 = Localize.translateLocal('reportActionsView.beginningOfArchivedRoomPartOne'); + welcomeMessage.phrase2 = Localize.translateLocal('reportActionsView.beginningOfArchivedRoomPartTwo'); + } else if (ReportUtils.isDomainRoom(report)) { + welcomeMessage.phrase1 = Localize.translateLocal('reportActionsView.beginningOfChatHistoryDomainRoomPartOne', {domainRoom: report?.reportName ?? ''}); + welcomeMessage.phrase2 = Localize.translateLocal('reportActionsView.beginningOfChatHistoryDomainRoomPartTwo'); + } else if (ReportUtils.isAdminRoom(report)) { + welcomeMessage.phrase1 = Localize.translateLocal('reportActionsView.beginningOfChatHistoryAdminRoomPartOne', {workspaceName}); + welcomeMessage.phrase2 = Localize.translateLocal('reportActionsView.beginningOfChatHistoryAdminRoomPartTwo'); + } else if (ReportUtils.isAnnounceRoom(report)) { + welcomeMessage.phrase1 = Localize.translateLocal('reportActionsView.beginningOfChatHistoryAnnounceRoomPartOne', {workspaceName}); + welcomeMessage.phrase2 = Localize.translateLocal('reportActionsView.beginningOfChatHistoryAnnounceRoomPartTwo', {workspaceName}); + } else if (ReportUtils.isInvoiceRoom(report)) { + welcomeMessage.showReportName = false; + welcomeMessage.phrase1 = Localize.translateLocal('reportActionsView.beginningOfChatHistoryInvoiceRoom'); + } else { + // Message for user created rooms or other room types. + welcomeMessage.phrase1 = Localize.translateLocal('reportActionsView.beginningOfChatHistoryUserRoomPartOne'); + welcomeMessage.phrase2 = Localize.translateLocal('reportActionsView.beginningOfChatHistoryUserRoomPartTwo'); + } + welcomeMessage.messageText = `${welcomeMessage.phrase1} ${welcomeMessage.showReportName ? ReportUtils.getReportName(report) : ''} ${welcomeMessage.phrase2 ?? ''}`; + + return welcomeMessage; +} + export default { getOptionData, getOrderedReportIDs, + getWelcomeMessage, };