From 96c633a9eb5f87c4fbc1c7aa73cd9021f9973256 Mon Sep 17 00:00:00 2001 From: mkzie2 Date: Tue, 9 Sep 2025 17:32:03 +0800 Subject: [PATCH 1/7] fix: preview issue on submit in offline --- src/libs/SearchUIUtils.ts | 7 ++++++- tests/unit/Search/SearchUIUtilsTest.ts | 23 +++++++++++++++++++++++ 2 files changed, 29 insertions(+), 1 deletion(-) diff --git a/src/libs/SearchUIUtils.ts b/src/libs/SearchUIUtils.ts index 9f1444237a29..e279ae351063 100644 --- a/src/libs/SearchUIUtils.ts +++ b/src/libs/SearchUIUtils.ts @@ -1311,7 +1311,12 @@ function getReportActionsSections(data: OnyxTypes.SearchResults['data']): Report .filter(isPolicyEntry) .map((key) => data[key]); - for (const key in data) { + const listKeys = Object.keys(data); + const reportKeys = listKeys.filter(isReportEntry); + const transactionKeys = listKeys.filter(isTransactionEntry); + const orderedKeys: string[] = [...reportKeys, ...transactionKeys]; + + for (const key of orderedKeys) { if (isReportActionEntry(key)) { const reportActions = Object.values(data[key]); const freeTrialMessages = reportActions.filter((action) => { diff --git a/tests/unit/Search/SearchUIUtilsTest.ts b/tests/unit/Search/SearchUIUtilsTest.ts index e9a46827de1c..4904044a47ee 100644 --- a/tests/unit/Search/SearchUIUtilsTest.ts +++ b/tests/unit/Search/SearchUIUtilsTest.ts @@ -1784,6 +1784,29 @@ describe('SearchUIUtils', () => { SearchUIUtils.getSections(CONST.SEARCH.DATA_TYPES.EXPENSE, searchResultsGroupByWithdrawalID.data, 2074551, formatPhoneNumber, CONST.SEARCH.GROUP_BY.WITHDRAWAL_ID), ).toStrictEqual(transactionWithdrawalIDGroupListItems); }); + + it('should process report actions regardless of key order when bug is fixed', () => { + const testDataTransactionFirst = { + [`transactions_${transactionID}`]: searchResults.data[`transactions_${transactionID}`], + [`reportActions_${reportID}`]: searchResults.data[`reportActions_${reportID}`], + [`report_${reportID}`]: searchResults.data[`report_${reportID}`], + personalDetailsList: searchResults.data.personalDetailsList, + [`policy_${policyID}`]: searchResults.data[`policy_${policyID}`], + }; + + const testDataReportFirst = { + [`report_${reportID}`]: searchResults.data[`report_${reportID}`], + [`reportActions_${reportID}`]: searchResults.data[`reportActions_${reportID}`], + [`transactions_${transactionID}`]: searchResults.data[`transactions_${transactionID}`], + personalDetailsList: searchResults.data.personalDetailsList, + [`policy_${policyID}`]: searchResults.data[`policy_${policyID}`], + }; + + const resultTransactionFirst = SearchUIUtils.getSections(CONST.SEARCH.DATA_TYPES.CHAT, testDataTransactionFirst, adminAccountID, formatPhoneNumber) as ReportActionListItemType[]; + const resultReportFirst = SearchUIUtils.getSections(CONST.SEARCH.DATA_TYPES.CHAT, testDataReportFirst, adminAccountID, formatPhoneNumber) as ReportActionListItemType[]; + + expect(resultTransactionFirst).toEqual(resultReportFirst); + }); }); describe('Test getSortedSections', () => { From 0d5921bcbc608c999f69d28c09dd337de1fb4dd6 Mon Sep 17 00:00:00 2001 From: mkzie2 Date: Tue, 9 Sep 2025 17:37:17 +0800 Subject: [PATCH 2/7] fix: preview issue on submit in offline --- src/libs/SearchUIUtils.ts | 14 +++++++------- 1 file changed, 7 insertions(+), 7 deletions(-) diff --git a/src/libs/SearchUIUtils.ts b/src/libs/SearchUIUtils.ts index e279ae351063..49d7c4feb8c1 100644 --- a/src/libs/SearchUIUtils.ts +++ b/src/libs/SearchUIUtils.ts @@ -1311,12 +1311,7 @@ function getReportActionsSections(data: OnyxTypes.SearchResults['data']): Report .filter(isPolicyEntry) .map((key) => data[key]); - const listKeys = Object.keys(data); - const reportKeys = listKeys.filter(isReportEntry); - const transactionKeys = listKeys.filter(isTransactionEntry); - const orderedKeys: string[] = [...reportKeys, ...transactionKeys]; - - for (const key of orderedKeys) { + for (const key in data) { if (isReportActionEntry(key)) { const reportActions = Object.values(data[key]); const freeTrialMessages = reportActions.filter((action) => { @@ -1383,7 +1378,12 @@ function getReportSections( const queryJSON = getCurrentSearchQueryJSON(); const reportIDToTransactions: Record = {}; - for (const key in data) { + const listKeys = Object.keys(data); + const reportKeys = listKeys.filter(isReportEntry); + const transactionKeys = listKeys.filter(isTransactionEntry); + const orderedKeys: string[] = [...reportKeys, ...transactionKeys]; + + for (const key of orderedKeys) { if (isReportEntry(key) && (data[key].type === CONST.REPORT.TYPE.IOU || data[key].type === CONST.REPORT.TYPE.EXPENSE || data[key].type === CONST.REPORT.TYPE.INVOICE)) { const reportItem = {...data[key]}; const reportKey = `${ONYXKEYS.COLLECTION.REPORT}${reportItem.reportID}`; From d0c96e16dbc01bb3921cef1f1987337f8df42f24 Mon Sep 17 00:00:00 2001 From: mkzie2 Date: Tue, 9 Sep 2025 17:38:20 +0800 Subject: [PATCH 3/7] fix: preview issue on submit in offline --- tests/unit/Search/SearchUIUtilsTest.ts | 23 ----------------------- 1 file changed, 23 deletions(-) diff --git a/tests/unit/Search/SearchUIUtilsTest.ts b/tests/unit/Search/SearchUIUtilsTest.ts index 4904044a47ee..e9a46827de1c 100644 --- a/tests/unit/Search/SearchUIUtilsTest.ts +++ b/tests/unit/Search/SearchUIUtilsTest.ts @@ -1784,29 +1784,6 @@ describe('SearchUIUtils', () => { SearchUIUtils.getSections(CONST.SEARCH.DATA_TYPES.EXPENSE, searchResultsGroupByWithdrawalID.data, 2074551, formatPhoneNumber, CONST.SEARCH.GROUP_BY.WITHDRAWAL_ID), ).toStrictEqual(transactionWithdrawalIDGroupListItems); }); - - it('should process report actions regardless of key order when bug is fixed', () => { - const testDataTransactionFirst = { - [`transactions_${transactionID}`]: searchResults.data[`transactions_${transactionID}`], - [`reportActions_${reportID}`]: searchResults.data[`reportActions_${reportID}`], - [`report_${reportID}`]: searchResults.data[`report_${reportID}`], - personalDetailsList: searchResults.data.personalDetailsList, - [`policy_${policyID}`]: searchResults.data[`policy_${policyID}`], - }; - - const testDataReportFirst = { - [`report_${reportID}`]: searchResults.data[`report_${reportID}`], - [`reportActions_${reportID}`]: searchResults.data[`reportActions_${reportID}`], - [`transactions_${transactionID}`]: searchResults.data[`transactions_${transactionID}`], - personalDetailsList: searchResults.data.personalDetailsList, - [`policy_${policyID}`]: searchResults.data[`policy_${policyID}`], - }; - - const resultTransactionFirst = SearchUIUtils.getSections(CONST.SEARCH.DATA_TYPES.CHAT, testDataTransactionFirst, adminAccountID, formatPhoneNumber) as ReportActionListItemType[]; - const resultReportFirst = SearchUIUtils.getSections(CONST.SEARCH.DATA_TYPES.CHAT, testDataReportFirst, adminAccountID, formatPhoneNumber) as ReportActionListItemType[]; - - expect(resultTransactionFirst).toEqual(resultReportFirst); - }); }); describe('Test getSortedSections', () => { From c71f0f4bb7204fba49ec7a6ed3b98f836a1907c8 Mon Sep 17 00:00:00 2001 From: mkzie2 Date: Tue, 9 Sep 2025 17:46:19 +0800 Subject: [PATCH 4/7] chore: add test cases --- tests/unit/Search/SearchUIUtilsTest.ts | 38 ++++++++++++++++++++++++++ 1 file changed, 38 insertions(+) diff --git a/tests/unit/Search/SearchUIUtilsTest.ts b/tests/unit/Search/SearchUIUtilsTest.ts index e9a46827de1c..80090f3f99bd 100644 --- a/tests/unit/Search/SearchUIUtilsTest.ts +++ b/tests/unit/Search/SearchUIUtilsTest.ts @@ -1767,6 +1767,44 @@ describe('SearchUIUtils', () => { ); }); + it('should handle data where transaction keys appear before report keys in getReportSections', () => { + const testDataTransactionFirst = { + // Transaction keys first + [`transactions_${transactionID}`]: searchResults.data[`transactions_${transactionID}`], + [`transactions_${transactionID2}`]: searchResults.data[`transactions_${transactionID2}`], + // Report keys after transactions + [`report_${reportID}`]: searchResults.data[`report_${reportID}`], + [`report_${reportID2}`]: searchResults.data[`report_${reportID2}`], + // Other required data + personalDetailsList: searchResults.data.personalDetailsList, + [`policy_${policyID}`]: searchResults.data[`policy_${policyID}`], + }; + + const testDataReportFirst = { + // Report keys first + [`report_${reportID}`]: searchResults.data[`report_${reportID}`], + [`report_${reportID2}`]: searchResults.data[`report_${reportID2}`], + // Transaction keys after reports + [`transactions_${transactionID}`]: searchResults.data[`transactions_${transactionID}`], + [`transactions_${transactionID2}`]: searchResults.data[`transactions_${transactionID2}`], + // Other required data + personalDetailsList: searchResults.data.personalDetailsList, + [`policy_${policyID}`]: searchResults.data[`policy_${policyID}`], + }; + + const resultTransactionFirst = SearchUIUtils.getSections(CONST.SEARCH.DATA_TYPES.EXPENSE, testDataTransactionFirst, 2074551, formatPhoneNumber, CONST.SEARCH.GROUP_BY.REPORTS); + const resultReportFirst = SearchUIUtils.getSections(CONST.SEARCH.DATA_TYPES.EXPENSE, testDataReportFirst, 2074551, formatPhoneNumber, CONST.SEARCH.GROUP_BY.REPORTS); + + expect(resultTransactionFirst).toBeDefined(); + expect(Array.isArray(resultTransactionFirst)).toBe(true); + expect(resultReportFirst).toBeDefined(); + expect(Array.isArray(resultReportFirst)).toBe(true); + + expect(resultTransactionFirst).toEqual(resultReportFirst); + + expect(resultTransactionFirst.length).toBeGreaterThan(0); + }); + it('should return getMemberSections result when type is EXPENSE and groupBy is from', () => { expect(SearchUIUtils.getSections(CONST.SEARCH.DATA_TYPES.EXPENSE, searchResultsGroupByFrom.data, 2074551, formatPhoneNumber, CONST.SEARCH.GROUP_BY.FROM)).toStrictEqual( transactionMemberGroupListItems, From 49cde65eb26413e77e1f66b83ed6f980a75d02c0 Mon Sep 17 00:00:00 2001 From: mkzie2 Date: Mon, 22 Sep 2025 22:06:01 +0700 Subject: [PATCH 5/7] fix getCurrentSearchQueryJSON issue --- src/libs/SearchQueryUtils.ts | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/src/libs/SearchQueryUtils.ts b/src/libs/SearchQueryUtils.ts index f3538653fa53..18952a3b5b4a 100644 --- a/src/libs/SearchQueryUtils.ts +++ b/src/libs/SearchQueryUtils.ts @@ -1050,7 +1050,10 @@ function getCurrentSearchQueryJSON() { const rootState = navigationRef.getRootState(); const lastSearchNavigator = rootState?.routes?.findLast((route) => route.name === NAVIGATORS.SEARCH_FULLSCREEN_NAVIGATOR); - const lastSearchNavigatorState = lastSearchNavigator && lastSearchNavigator.key ? getPreservedNavigatorState(lastSearchNavigator?.key) : undefined; + let lastSearchNavigatorState = lastSearchNavigator?.state; + if (!lastSearchNavigatorState) { + lastSearchNavigatorState = lastSearchNavigator && lastSearchNavigator.key ? getPreservedNavigatorState(lastSearchNavigator?.key) : undefined; + } if (!lastSearchNavigatorState) { return; } From ea13a90e05de847c2a3b62857254160097ecbd2e Mon Sep 17 00:00:00 2001 From: mkzie2 Date: Wed, 8 Oct 2025 21:09:20 +0700 Subject: [PATCH 6/7] Update src/libs/SearchUIUtils.ts Co-authored-by: Rajat --- src/libs/SearchUIUtils.ts | 17 +++++++++++++---- 1 file changed, 13 insertions(+), 4 deletions(-) diff --git a/src/libs/SearchUIUtils.ts b/src/libs/SearchUIUtils.ts index 41aba9f4d342..dffa5722801f 100644 --- a/src/libs/SearchUIUtils.ts +++ b/src/libs/SearchUIUtils.ts @@ -1374,10 +1374,19 @@ function getReportSections( const queryJSON = getCurrentSearchQueryJSON(); const reportIDToTransactions: Record = {}; - const listKeys = Object.keys(data); - const reportKeys = listKeys.filter(isReportEntry); - const transactionKeys = listKeys.filter(isTransactionEntry); - const orderedKeys: string[] = [...reportKeys, ...transactionKeys]; + const { reportKeys, transactionKeys } = Object.keys(data).reduce( + (acc, key) => { + if (isReportEntry(key)) { + acc.reportKeys.push(key); + } else if (isTransactionEntry(key)) { + acc.transactionKeys.push(key); + } + return acc; + }, + { reportKeys: [] as string[], transactionKeys: [] as string[] } +); + +const orderedKeys: string[] = [...reportKeys, ...transactionKeys]; for (const key of orderedKeys) { if (isReportEntry(key) && (data[key].type === CONST.REPORT.TYPE.IOU || data[key].type === CONST.REPORT.TYPE.EXPENSE || data[key].type === CONST.REPORT.TYPE.INVOICE)) { From 56810004aa8e631f12aac227cce5599f8940447b Mon Sep 17 00:00:00 2001 From: mkzie2 Date: Wed, 8 Oct 2025 21:11:35 +0700 Subject: [PATCH 7/7] run prettier --- src/libs/SearchUIUtils.ts | 24 ++++++++++++------------ 1 file changed, 12 insertions(+), 12 deletions(-) diff --git a/src/libs/SearchUIUtils.ts b/src/libs/SearchUIUtils.ts index dffa5722801f..02d6f7e81908 100644 --- a/src/libs/SearchUIUtils.ts +++ b/src/libs/SearchUIUtils.ts @@ -1374,19 +1374,19 @@ function getReportSections( const queryJSON = getCurrentSearchQueryJSON(); const reportIDToTransactions: Record = {}; - const { reportKeys, transactionKeys } = Object.keys(data).reduce( - (acc, key) => { - if (isReportEntry(key)) { - acc.reportKeys.push(key); - } else if (isTransactionEntry(key)) { - acc.transactionKeys.push(key); - } - return acc; - }, - { reportKeys: [] as string[], transactionKeys: [] as string[] } -); + const {reportKeys, transactionKeys} = Object.keys(data).reduce( + (acc, key) => { + if (isReportEntry(key)) { + acc.reportKeys.push(key); + } else if (isTransactionEntry(key)) { + acc.transactionKeys.push(key); + } + return acc; + }, + {reportKeys: [] as string[], transactionKeys: [] as string[]}, + ); -const orderedKeys: string[] = [...reportKeys, ...transactionKeys]; + const orderedKeys: string[] = [...reportKeys, ...transactionKeys]; for (const key of orderedKeys) { if (isReportEntry(key) && (data[key].type === CONST.REPORT.TYPE.IOU || data[key].type === CONST.REPORT.TYPE.EXPENSE || data[key].type === CONST.REPORT.TYPE.INVOICE)) {