From a48428e2b9b04c5c6cbc8a75e1e6d5d7f351b8e6 Mon Sep 17 00:00:00 2001 From: daledah Date: Tue, 16 Dec 2025 16:12:25 +0700 Subject: [PATCH 1/5] fix: moved this report chat shown as html tag in search & member section --- src/components/Search/SearchAutocompleteList.tsx | 3 ++- src/pages/RoomMembersPage.tsx | 3 ++- 2 files changed, 4 insertions(+), 2 deletions(-) diff --git a/src/components/Search/SearchAutocompleteList.tsx b/src/components/Search/SearchAutocompleteList.tsx index cb20336535fc..a27e376b5abb 100644 --- a/src/components/Search/SearchAutocompleteList.tsx +++ b/src/components/Search/SearchAutocompleteList.tsx @@ -22,6 +22,7 @@ import FS from '@libs/Fullstory'; import Log from '@libs/Log'; import type {Options, SearchOption} from '@libs/OptionsListUtils'; import {combineOrderingOfReportsAndPersonalDetails, getSearchOptions} from '@libs/OptionsListUtils'; +import Parser from '@libs/Parser'; import Performance from '@libs/Performance'; import {getAllTaxRates, getCleanedTagName, shouldShowPolicy} from '@libs/PolicyUtils'; import type {OptionData} from '@libs/ReportUtils'; @@ -777,7 +778,7 @@ function SearchAutocompleteList({ const styledRecentReports = recentReportsOptions.map((item) => ({ ...item, pressableStyle: styles.br2, - text: StringUtils.lineBreaksToSpaces(item.text), + text: StringUtils.lineBreaksToSpaces(Parser.htmlToText(item.text ?? '')), wrapperStyle: [styles.pr3, styles.pl3], })); sections.push({title: autocompleteQueryValue.trim() === '' ? translate('search.recentChats') : undefined, data: styledRecentReports}); diff --git a/src/pages/RoomMembersPage.tsx b/src/pages/RoomMembersPage.tsx index eecd964e68e4..f21f70d58b45 100644 --- a/src/pages/RoomMembersPage.tsx +++ b/src/pages/RoomMembersPage.tsx @@ -34,6 +34,7 @@ import Navigation from '@libs/Navigation/Navigation'; import type {PlatformStackRouteProp, PlatformStackScreenProps} from '@libs/Navigation/PlatformStackNavigation/types'; import type {RoomMembersNavigatorParamList} from '@libs/Navigation/types'; import {isPersonalDetailsReady, isSearchStringMatchUserDetails} from '@libs/OptionsListUtils'; +import Parser from '@libs/Parser'; import {getDisplayNameOrDefault, getPersonalDetailsByIDs} from '@libs/PersonalDetailsUtils'; import {isPolicyEmployee as isPolicyEmployeeUtils, isUserPolicyAdmin} from '@libs/PolicyUtils'; import {getReportName, getReportPersonalDetailsParticipants, isChatThread, isDefaultRoom, isPolicyExpenseChat as isPolicyExpenseChatUtils, isUserCreatedPolicyRoom} from '@libs/ReportUtils'; @@ -404,7 +405,7 @@ function RoomMembersPage({report, policy}: RoomMembersPageProps) { { if (isMobileSelectionModeEnabled) { setSelectedMembers([]); From a4802ca64d3ec2dc2194f91970ef599b9d7ded90 Mon Sep 17 00:00:00 2001 From: daledah Date: Thu, 25 Dec 2025 15:35:59 +0700 Subject: [PATCH 2/5] fix logic show the html to text --- .../Search/SearchAutocompleteList.tsx | 20 ++++++++++++------- .../Search/SearchRouter/SearchRouter.tsx | 15 +++++++++++--- src/pages/RoomInvitePage.tsx | 6 +++++- src/pages/RoomMembersPage.tsx | 5 ++++- 4 files changed, 34 insertions(+), 12 deletions(-) diff --git a/src/components/Search/SearchAutocompleteList.tsx b/src/components/Search/SearchAutocompleteList.tsx index 95e4a48c7507..8b3d0ba1bf3f 100644 --- a/src/components/Search/SearchAutocompleteList.tsx +++ b/src/components/Search/SearchAutocompleteList.tsx @@ -26,7 +26,9 @@ import {combineOrderingOfReportsAndPersonalDetails, getSearchOptions} from '@lib import Parser from '@libs/Parser'; import Performance from '@libs/Performance'; import {getAllTaxRates, getCleanedTagName, shouldShowPolicy} from '@libs/PolicyUtils'; +import {getReportAction} from '@libs/ReportActionsUtils'; import type {OptionData} from '@libs/ReportUtils'; +import {getReportOrDraftReport} from '@libs/ReportUtils'; import { getAutocompleteCategories, getAutocompleteRecentCategories, @@ -791,13 +793,17 @@ function SearchAutocompleteList({ if (!autocompleteQueryValue && recentSearchesData && recentSearchesData.length > 0) { sections.push({title: translate('search.recentSearches'), data: recentSearchesData}); } - - const styledRecentReports = recentReportsOptions.map((item) => ({ - ...item, - pressableStyle: styles.br2, - text: StringUtils.lineBreaksToSpaces(Parser.htmlToText(item.text ?? '')), - wrapperStyle: [styles.pr3, styles.pl3], - })); + const styledRecentReports = recentReportsOptions.map((option) => { + const report = getReportOrDraftReport(option.reportID ?? ''); + const reportAction = getReportAction(report?.parentReportID, report?.parentReportActionID); + const shouldParserToHTML = reportAction?.actionName !== CONST.REPORT.ACTIONS.TYPE.ADD_COMMENT; + return { + ...option, + pressableStyle: styles.br2, + text: StringUtils.lineBreaksToSpaces(shouldParserToHTML ? Parser.htmlToText(option.text ?? '') : (option.text ?? '')), + wrapperStyle: [styles.pr3, styles.pl3], + }; + }); sections.push({title: autocompleteQueryValue.trim() === '' ? translate('search.recentChats') : undefined, data: styledRecentReports}); if (autocompleteSuggestions.length > 0) { diff --git a/src/components/Search/SearchRouter/SearchRouter.tsx b/src/components/Search/SearchRouter/SearchRouter.tsx index d1af0eb7476e..bccb0570e55e 100644 --- a/src/components/Search/SearchRouter/SearchRouter.tsx +++ b/src/components/Search/SearchRouter/SearchRouter.tsx @@ -32,6 +32,9 @@ import Log from '@libs/Log'; import backHistory from '@libs/Navigation/helpers/backHistory'; import type {SearchOption} from '@libs/OptionsListUtils'; import {createOptionFromReport} from '@libs/OptionsListUtils'; +import Parser from '@libs/Parser'; +import {getReportAction} from '@libs/ReportActionsUtils'; +import {getReportOrDraftReport} from '@libs/ReportUtils'; import type {OptionData} from '@libs/ReportUtils'; import {getAutocompleteQueryWithComma, getQueryWithoutAutocompletedPart} from '@libs/SearchAutocompleteUtils'; import {getPolicyNameWithFallback, getQueryWithUpdatedValues, sanitizeSearchValue} from '@libs/SearchQueryUtils'; @@ -149,7 +152,9 @@ function SearchRouter({onRouterClose, shouldHideInputCaret, isSearchRouterDispla return undefined; } let reportForContextualSearch = recentReports.find((option) => option.reportID === contextualReportID); - + const reportForContextualSearchReport = getReportOrDraftReport(reportForContextualSearch?.reportID ?? ''); + const reportAction = getReportAction(reportForContextualSearchReport?.parentReportID, reportForContextualSearchReport?.parentReportActionID); + const shouldParserToHTML = reportAction?.actionName !== CONST.REPORT.ACTIONS.TYPE.ADD_COMMENT; if (!reportForContextualSearch) { const report = reports?.[`${ONYXKEYS.COLLECTION.REPORT}${contextualReportID}`]; if (!report) { @@ -187,7 +192,11 @@ function SearchRouter({onRouterClose, shouldHideInputCaret, isSearchRouterDispla { data: [ { - text: StringUtils.lineBreaksToSpaces(`${translate('search.searchIn')} ${reportForContextualSearch.text ?? reportForContextualSearch.alternateText}`), + text: StringUtils.lineBreaksToSpaces( + shouldParserToHTML + ? Parser.htmlToText(reportForContextualSearch.text ?? reportForContextualSearch.alternateText ?? '') + : (reportForContextualSearch.text ?? reportForContextualSearch.alternateText ?? ''), + ), singleIcon: expensifyIcons.MagnifyingGlass, searchQuery: reportQueryValue, autocompleteID, @@ -201,7 +210,7 @@ function SearchRouter({onRouterClose, shouldHideInputCaret, isSearchRouterDispla }, ]; }, - [contextualReportID, styles.activeComponentBG, textInputValue, translate, isSearchRouterDisplayed, reports, personalDetails, expensifyIcons.MagnifyingGlass], + [contextualReportID, styles.activeComponentBG, textInputValue, isSearchRouterDisplayed, reports, personalDetails, expensifyIcons.MagnifyingGlass], ); const searchQueryItem = textInputValue diff --git a/src/pages/RoomInvitePage.tsx b/src/pages/RoomInvitePage.tsx index 570a97741823..ce6bc793dcf2 100644 --- a/src/pages/RoomInvitePage.tsx +++ b/src/pages/RoomInvitePage.tsx @@ -31,10 +31,12 @@ import type {PlatformStackScreenProps} from '@libs/Navigation/PlatformStackNavig import type {RoomMembersNavigatorParamList} from '@libs/Navigation/types'; import type {MemberForList} from '@libs/OptionsListUtils'; import {filterAndOrderOptions, formatMemberForList, getHeaderMessage, getMemberInviteOptions} from '@libs/OptionsListUtils'; +import Parser from '@libs/Parser'; import {getLoginsByAccountIDs} from '@libs/PersonalDetailsUtils'; import {addSMSDomainIfPhoneNumber, parsePhoneNumber} from '@libs/PhoneNumber'; import type {MemberEmailsToAccountIDs} from '@libs/PolicyUtils'; import {isPolicyEmployee as isPolicyEmployeeUtil} from '@libs/PolicyUtils'; +import {getReportAction} from '@libs/ReportActionsUtils'; import type {OptionData} from '@libs/ReportUtils'; import {getReportName, isHiddenForCurrentUser} from '@libs/ReportUtils'; import CONST from '@src/CONST'; @@ -193,6 +195,8 @@ function RoomInvitePage({ // Non policy members should not be able to view the participants of a room const reportID = report?.reportID; const isPolicyEmployee = useMemo(() => isPolicyEmployeeUtil(report?.policyID, policy), [report?.policyID, policy]); + const reportAction = getReportAction(report?.parentReportID, report?.parentReportActionID); + const shouldParserToHTML = reportAction?.actionName !== CONST.REPORT.ACTIONS.TYPE.ADD_COMMENT; const backRoute = useMemo(() => { return reportID && (!isPolicyEmployee || isReportArchived ? ROUTES.REPORT_WITH_ID_DETAILS.getRoute(reportID, backTo) : ROUTES.ROOM_MEMBERS.getRoute(reportID, backTo)); }, [isPolicyEmployee, reportID, backTo, isReportArchived]); @@ -270,7 +274,7 @@ function RoomInvitePage({ > >(); + const reportAction = getReportAction(report?.parentReportID, report?.parentReportActionID); + const shouldParserToHTML = reportAction?.actionName !== CONST.REPORT.ACTIONS.TYPE.ADD_COMMENT; const icons = useMemoizedLazyExpensifyIcons(['RemoveMembers']); const styles = useThemeStyles(); const [session] = useOnyx(ONYXKEYS.SESSION, {canBeMissing: false}); @@ -405,7 +408,7 @@ function RoomMembersPage({report, policy}: RoomMembersPageProps) { { if (isMobileSelectionModeEnabled) { setSelectedMembers([]); From 6b3a12c27119ab0016f16efad16ddf17bea78c29 Mon Sep 17 00:00:00 2001 From: daledah Date: Thu, 25 Dec 2025 15:40:43 +0700 Subject: [PATCH 3/5] fix lint --- src/components/Search/SearchAutocompleteList.tsx | 2 +- src/components/Search/SearchRouter/SearchRouter.tsx | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/src/components/Search/SearchAutocompleteList.tsx b/src/components/Search/SearchAutocompleteList.tsx index 8b3d0ba1bf3f..8ee2ad3b360a 100644 --- a/src/components/Search/SearchAutocompleteList.tsx +++ b/src/components/Search/SearchAutocompleteList.tsx @@ -794,7 +794,7 @@ function SearchAutocompleteList({ sections.push({title: translate('search.recentSearches'), data: recentSearchesData}); } const styledRecentReports = recentReportsOptions.map((option) => { - const report = getReportOrDraftReport(option.reportID ?? ''); + const report = getReportOrDraftReport(option.reportID); const reportAction = getReportAction(report?.parentReportID, report?.parentReportActionID); const shouldParserToHTML = reportAction?.actionName !== CONST.REPORT.ACTIONS.TYPE.ADD_COMMENT; return { diff --git a/src/components/Search/SearchRouter/SearchRouter.tsx b/src/components/Search/SearchRouter/SearchRouter.tsx index bccb0570e55e..1ed04df36036 100644 --- a/src/components/Search/SearchRouter/SearchRouter.tsx +++ b/src/components/Search/SearchRouter/SearchRouter.tsx @@ -152,7 +152,7 @@ function SearchRouter({onRouterClose, shouldHideInputCaret, isSearchRouterDispla return undefined; } let reportForContextualSearch = recentReports.find((option) => option.reportID === contextualReportID); - const reportForContextualSearchReport = getReportOrDraftReport(reportForContextualSearch?.reportID ?? ''); + const reportForContextualSearchReport = getReportOrDraftReport(reportForContextualSearch?.reportID); const reportAction = getReportAction(reportForContextualSearchReport?.parentReportID, reportForContextualSearchReport?.parentReportActionID); const shouldParserToHTML = reportAction?.actionName !== CONST.REPORT.ACTIONS.TYPE.ADD_COMMENT; if (!reportForContextualSearch) { From 8ff3235f54866a7792f3f846e6d165a6b8e66005 Mon Sep 17 00:00:00 2001 From: daledah Date: Fri, 26 Dec 2025 10:14:42 +0700 Subject: [PATCH 4/5] fix comments --- .../Search/SearchAutocompleteList.tsx | 26 +++++++++++-------- .../Search/SearchRouter/SearchRouter.tsx | 2 +- src/pages/RoomInvitePage.tsx | 2 +- src/pages/RoomMembersPage.tsx | 2 +- 4 files changed, 18 insertions(+), 14 deletions(-) diff --git a/src/components/Search/SearchAutocompleteList.tsx b/src/components/Search/SearchAutocompleteList.tsx index 8ee2ad3b360a..8bfc861ff0e1 100644 --- a/src/components/Search/SearchAutocompleteList.tsx +++ b/src/components/Search/SearchAutocompleteList.tsx @@ -793,17 +793,21 @@ function SearchAutocompleteList({ if (!autocompleteQueryValue && recentSearchesData && recentSearchesData.length > 0) { sections.push({title: translate('search.recentSearches'), data: recentSearchesData}); } - const styledRecentReports = recentReportsOptions.map((option) => { - const report = getReportOrDraftReport(option.reportID); - const reportAction = getReportAction(report?.parentReportID, report?.parentReportActionID); - const shouldParserToHTML = reportAction?.actionName !== CONST.REPORT.ACTIONS.TYPE.ADD_COMMENT; - return { - ...option, - pressableStyle: styles.br2, - text: StringUtils.lineBreaksToSpaces(shouldParserToHTML ? Parser.htmlToText(option.text ?? '') : (option.text ?? '')), - wrapperStyle: [styles.pr3, styles.pl3], - }; - }); + const styledRecentReports = useMemo( + () => + recentReportsOptions.map((option) => { + const report = getReportOrDraftReport(option.reportID); + const reportAction = getReportAction(report?.parentReportID, report?.parentReportActionID); + const shouldParserToHTML = reportAction?.actionName !== CONST.REPORT.ACTIONS.TYPE.ADD_COMMENT; + return { + ...option, + pressableStyle: styles.br2, + text: StringUtils.lineBreaksToSpaces(shouldParserToHTML ? Parser.htmlToText(option.text ?? '') : (option.text ?? '')), + wrapperStyle: [styles.pr3, styles.pl3], + }; + }), + [recentReportsOptions, styles.br2, styles.pr3, styles.pl3], + ); sections.push({title: autocompleteQueryValue.trim() === '' ? translate('search.recentChats') : undefined, data: styledRecentReports}); if (autocompleteSuggestions.length > 0) { diff --git a/src/components/Search/SearchRouter/SearchRouter.tsx b/src/components/Search/SearchRouter/SearchRouter.tsx index 1ed04df36036..1a3c442aeb65 100644 --- a/src/components/Search/SearchRouter/SearchRouter.tsx +++ b/src/components/Search/SearchRouter/SearchRouter.tsx @@ -210,7 +210,7 @@ function SearchRouter({onRouterClose, shouldHideInputCaret, isSearchRouterDispla }, ]; }, - [contextualReportID, styles.activeComponentBG, textInputValue, isSearchRouterDisplayed, reports, personalDetails, expensifyIcons.MagnifyingGlass], + [contextualReportID, styles.activeComponentBG, textInputValue, translate, isSearchRouterDisplayed, reports, personalDetails, expensifyIcons.MagnifyingGlass], ); const searchQueryItem = textInputValue diff --git a/src/pages/RoomInvitePage.tsx b/src/pages/RoomInvitePage.tsx index ce6bc793dcf2..2c71a38b4043 100644 --- a/src/pages/RoomInvitePage.tsx +++ b/src/pages/RoomInvitePage.tsx @@ -195,7 +195,7 @@ function RoomInvitePage({ // Non policy members should not be able to view the participants of a room const reportID = report?.reportID; const isPolicyEmployee = useMemo(() => isPolicyEmployeeUtil(report?.policyID, policy), [report?.policyID, policy]); - const reportAction = getReportAction(report?.parentReportID, report?.parentReportActionID); + const reportAction = useMemo(() => getReportAction(report?.parentReportID, report?.parentReportActionID), [report?.parentReportID, report?.parentReportActionID]); const shouldParserToHTML = reportAction?.actionName !== CONST.REPORT.ACTIONS.TYPE.ADD_COMMENT; const backRoute = useMemo(() => { return reportID && (!isPolicyEmployee || isReportArchived ? ROUTES.REPORT_WITH_ID_DETAILS.getRoute(reportID, backTo) : ROUTES.ROOM_MEMBERS.getRoute(reportID, backTo)); diff --git a/src/pages/RoomMembersPage.tsx b/src/pages/RoomMembersPage.tsx index 6e7f474f1501..a754500db506 100644 --- a/src/pages/RoomMembersPage.tsx +++ b/src/pages/RoomMembersPage.tsx @@ -55,7 +55,7 @@ type RoomMembersPageProps = WithReportOrNotFoundProps & WithCurrentUserPersonalD function RoomMembersPage({report, policy}: RoomMembersPageProps) { const route = useRoute>(); - const reportAction = getReportAction(report?.parentReportID, report?.parentReportActionID); + const reportAction = useMemo(() => getReportAction(report?.parentReportID, report?.parentReportActionID), [report?.parentReportID, report?.parentReportActionID]); const shouldParserToHTML = reportAction?.actionName !== CONST.REPORT.ACTIONS.TYPE.ADD_COMMENT; const icons = useMemoizedLazyExpensifyIcons(['RemoveMembers']); const styles = useThemeStyles(); From ddf30932187682a93aa632b76ec843527fbdc25e Mon Sep 17 00:00:00 2001 From: daledah Date: Mon, 5 Jan 2026 22:48:33 +0700 Subject: [PATCH 5/5] fix lint --- src/components/Search/SearchRouter/SearchRouter.tsx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/components/Search/SearchRouter/SearchRouter.tsx b/src/components/Search/SearchRouter/SearchRouter.tsx index fe6ec8791cb7..37a92158fe7a 100644 --- a/src/components/Search/SearchRouter/SearchRouter.tsx +++ b/src/components/Search/SearchRouter/SearchRouter.tsx @@ -210,7 +210,7 @@ function SearchRouter({onRouterClose, shouldHideInputCaret, isSearchRouterDispla }, ]; }, - [contextualReportID, styles.activeComponentBG, textInputValue, translate, isSearchRouterDisplayed, reports, personalDetails, expensifyIcons.MagnifyingGlass], + [contextualReportID, styles.activeComponentBG, textInputValue, isSearchRouterDisplayed, reports, personalDetails, expensifyIcons.MagnifyingGlass], ); const searchQueryItem = textInputValue