Skip to content

Commit 495b89e

Browse files
authored
Merge pull request Expensify#75806 from mukhrr/fix/73893
fixed bold unread search option
2 parents af7a4c4 + 718f5dd commit 495b89e

4 files changed

Lines changed: 78 additions & 4 deletions

File tree

src/components/Search/SearchAutocompleteList.tsx

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -207,6 +207,7 @@ function SearchAutocompleteList({
207207
includeCurrentUser: true,
208208
countryCode,
209209
shouldShowGBR: false,
210+
shouldUnreadBeBold: true,
210211
});
211212
}, [areOptionsInitialized, options, draftComments, nvpDismissedProductTraining, betas, autocompleteQueryValue, countryCode]);
212213

src/libs/OptionsListUtils/index.ts

Lines changed: 25 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -122,6 +122,7 @@ import {
122122
isInvoiceRoom,
123123
isMoneyRequest,
124124
isPolicyAdmin,
125+
isUnread,
125126
isAdminRoom as reportUtilsIsAdminRoom,
126127
isAnnounceRoom as reportUtilsIsAnnounceRoom,
127128
isChatReport as reportUtilsIsChatReport,
@@ -659,6 +660,7 @@ function getLastMessageTextForReport({
659660
: undefined;
660661
// For workspace chats, use the report title
661662
if (reportUtilsIsPolicyExpenseChat(report) && !isEmptyObject(iouReport)) {
663+
// eslint-disable-next-line @typescript-eslint/no-deprecated
662664
lastMessageTextFromReport = formatReportLastMessageText(getReportName(iouReport));
663665
} else {
664666
const reportPreviewMessage = getReportPreviewMessage(
@@ -917,7 +919,8 @@ function createOption(
917919
: getAlternateText(result, {showChatPreviewLine, forcePolicyNamePreview}, !!result.private_isArchived, lastActorDetails);
918920
reportName = showPersonalDetails
919921
? getDisplayNameForParticipant({accountID: accountIDs.at(0), formatPhoneNumber: formatPhoneNumberPhoneUtils}) || formatPhoneNumberPhoneUtils(personalDetail?.login ?? '')
920-
: getReportName(report);
922+
: // eslint-disable-next-line @typescript-eslint/no-deprecated
923+
getReportName(report);
921924
} else {
922925
// eslint-disable-next-line @typescript-eslint/prefer-nullish-coalescing
923926
reportName = getDisplayNameForParticipant({accountID: accountIDs.at(0), formatPhoneNumber: formatPhoneNumberPhoneUtils}) || formatPhoneNumberPhoneUtils(personalDetail?.login ?? '');
@@ -963,6 +966,7 @@ function getReportOption(participant: Participant, reportAttributesDerived?: Rep
963966
// eslint-disable-next-line @typescript-eslint/no-deprecated
964967
option.alternateText = translateLocal('reportActionsView.yourSpace');
965968
} else if (option.isInvoiceRoom) {
969+
// eslint-disable-next-line @typescript-eslint/no-deprecated
966970
option.text = getReportName(report);
967971
// eslint-disable-next-line @typescript-eslint/no-deprecated
968972
option.alternateText = translateLocal('workspace.common.invoices');
@@ -1012,6 +1016,7 @@ function getReportDisplayOption(report: OnyxEntry<Report>, unknownUserDetails: O
10121016
// eslint-disable-next-line @typescript-eslint/no-deprecated
10131017
option.alternateText = translateLocal('reportActionsView.yourSpace');
10141018
} else if (option.isInvoiceRoom) {
1019+
// eslint-disable-next-line @typescript-eslint/no-deprecated
10151020
option.text = getReportName(report);
10161021
// eslint-disable-next-line @typescript-eslint/no-deprecated
10171022
option.alternateText = translateLocal('workspace.common.invoices');
@@ -1822,6 +1827,7 @@ function prepareReportOptionsForDisplay(options: Array<SearchOption<Report>>, co
18221827
isPerDiemRequest = false,
18231828
showRBR = true,
18241829
shouldShowGBR = false,
1830+
shouldUnreadBeBold = false,
18251831
} = config;
18261832

18271833
const validOptions: Array<SearchOption<Report>> = [];
@@ -1841,7 +1847,18 @@ function prepareReportOptionsForDisplay(options: Array<SearchOption<Report>>, co
18411847
*/
18421848
const alternateText = getAlternateText(option, {showChatPreviewLine, forcePolicyNamePreview}, !!option.private_isArchived);
18431849
const isSelected = isReportSelected(option, selectedOptions);
1844-
const isBold = shouldBoldTitleByDefault || shouldUseBoldText(option);
1850+
1851+
let isOptionUnread = option.isUnread;
1852+
if (shouldUnreadBeBold) {
1853+
const chatReport = allReports?.[`${ONYXKEYS.COLLECTION.REPORT}${report.chatReportID}`];
1854+
const oneTransactionThreadReportID =
1855+
report.type === CONST.REPORT.TYPE.IOU || report.type === CONST.REPORT.TYPE.EXPENSE || report.type === CONST.REPORT.TYPE.INVOICE
1856+
? getOneTransactionThreadReportID(report, chatReport, allSortedReportActions[report.reportID])
1857+
: undefined;
1858+
const oneTransactionThreadReport = oneTransactionThreadReportID ? allReports?.[`${ONYXKEYS.COLLECTION.REPORT}${oneTransactionThreadReportID}`] : undefined;
1859+
1860+
isOptionUnread = isUnread(report, oneTransactionThreadReport, !!option.private_isArchived) && !!report.lastActorAccountID;
1861+
}
18451862

18461863
let lastIOUCreationDate;
18471864
// Add a field to sort the recent reports by the time of last IOU request for create actions
@@ -1862,11 +1879,13 @@ function prepareReportOptionsForDisplay(options: Array<SearchOption<Report>>, co
18621879
...option,
18631880
alternateText,
18641881
isSelected,
1865-
isBold,
1882+
isUnread: isOptionUnread,
18661883
lastIOUCreationDate,
18671884
brickRoadIndicator: showRBR ? option.brickRoadIndicator : null,
18681885
};
18691886

1887+
newReportOption.isBold = shouldBoldTitleByDefault || shouldUseBoldText(newReportOption);
1888+
18701889
if (newReportOption.brickRoadIndicator === CONST.BRICK_ROAD_INDICATOR_STATUS.INFO) {
18711890
newReportOption.brickRoadIndicator = shouldShowGBR ? CONST.BRICK_ROAD_INDICATOR_STATUS.INFO : null;
18721891
}
@@ -2168,6 +2187,7 @@ type SearchOptionsConfig = {
21682187
includeCurrentUser?: boolean;
21692188
countryCode?: number;
21702189
shouldShowGBR?: boolean;
2190+
shouldUnreadBeBold?: boolean;
21712191
};
21722192

21732193
/**
@@ -2187,6 +2207,7 @@ function getSearchOptions({
21872207
includeCurrentUser = false,
21882208
countryCode = CONST.DEFAULT_COUNTRY_CODE,
21892209
shouldShowGBR = false,
2210+
shouldUnreadBeBold = false,
21902211
}: SearchOptionsConfig): Options {
21912212
Timing.start(CONST.TIMING.LOAD_SEARCH_OPTIONS);
21922213
Performance.markStart(CONST.TIMING.LOAD_SEARCH_OPTIONS);
@@ -2214,6 +2235,7 @@ function getSearchOptions({
22142235
searchString: searchQuery,
22152236
includeUserToInvite,
22162237
shouldShowGBR,
2238+
shouldUnreadBeBold,
22172239
},
22182240
countryCode,
22192241
);

src/libs/OptionsListUtils/types.ts

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -154,6 +154,7 @@ type GetValidReportsConfig = {
154154
shouldShowGBR?: boolean;
155155
isRestrictedToPreferredPolicy?: boolean;
156156
preferredPolicyID?: string;
157+
shouldUnreadBeBold?: boolean;
157158
} & GetValidOptionsSharedConfig;
158159

159160
type IsValidReportsConfig = Pick<

tests/unit/OptionsListUtilsTest.tsx

Lines changed: 51 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -52,7 +52,7 @@ import IntlStore from '@src/languages/IntlStore';
5252
import ONYXKEYS from '@src/ONYXKEYS';
5353
import type {PersonalDetails, Policy, Report, ReportAction, Transaction} from '@src/types/onyx';
5454
import createRandomReportAction from '../utils/collections/reportActions';
55-
import {createRandomReport} from '../utils/collections/reports';
55+
import {createRandomReport, createRegularChat} from '../utils/collections/reports';
5656
import createRandomTransaction from '../utils/collections/transaction';
5757
import {getFakeAdvancedReportAction} from '../utils/LHNTestUtils';
5858
import {getNvpDismissedProductTraining, localeCompare} from '../utils/TestHelper';
@@ -1042,6 +1042,56 @@ describe('OptionsListUtils', () => {
10421042
});
10431043
expect(results.recentReports.at(0)?.brickRoadIndicator).toBe(null);
10441044
});
1045+
1046+
it('should mark unread report as bold when shouldUnreadBeBold is true', async () => {
1047+
const reportID = '99999';
1048+
const report: Report = {
1049+
...createRegularChat(Number(reportID), [1]),
1050+
reportID,
1051+
reportName: 'Unread Report',
1052+
lastReadTime: DateUtils.getDBTime(Date.now() - 10000),
1053+
lastVisibleActionCreated: DateUtils.getDBTime(Date.now()),
1054+
lastActorAccountID: 1,
1055+
lastMessageText: 'Test message',
1056+
};
1057+
1058+
await Onyx.merge(`${ONYXKEYS.COLLECTION.REPORT}${reportID}`, report);
1059+
await waitForBatchedUpdates();
1060+
1061+
const inputOption: SearchOption<Report> = {
1062+
item: report,
1063+
reportID,
1064+
text: 'Unread Report',
1065+
isUnread: false, // Intentionally false initially to prove it gets recalculated
1066+
participantsList: [],
1067+
keyForList: reportID,
1068+
isChatRoom: true,
1069+
policyID: '123',
1070+
lastMessageText: '',
1071+
lastVisibleActionCreated: report.lastVisibleActionCreated,
1072+
notificationPreference: 'always',
1073+
accountID: 0,
1074+
login: '',
1075+
alternateText: '',
1076+
subtitle: '',
1077+
firstName: '',
1078+
lastName: '',
1079+
icons: [],
1080+
isSelected: false,
1081+
isDisabled: false,
1082+
brickRoadIndicator: null,
1083+
isBold: false,
1084+
};
1085+
1086+
const results = getValidOptions({reports: [inputOption], personalDetails: []}, {}, nvpDismissedProductTraining, {
1087+
includeRecentReports: true,
1088+
shouldUnreadBeBold: true,
1089+
includeMultipleParticipantReports: true,
1090+
});
1091+
1092+
expect(results.recentReports.at(0)?.isBold).toBe(true);
1093+
expect(results.recentReports.at(0)?.isUnread).toBe(true);
1094+
});
10451095
});
10461096

10471097
describe('getValidOptions() for chat room', () => {

0 commit comments

Comments
 (0)