diff --git a/src/libs/SearchQueryUtils.ts b/src/libs/SearchQueryUtils.ts index f0dad2f8f07e..b94a90792380 100644 --- a/src/libs/SearchQueryUtils.ts +++ b/src/libs/SearchQueryUtils.ts @@ -1055,7 +1055,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; } diff --git a/src/libs/SearchUIUtils.ts b/src/libs/SearchUIUtils.ts index f93e63ae7c74..02d6f7e81908 100644 --- a/src/libs/SearchUIUtils.ts +++ b/src/libs/SearchUIUtils.ts @@ -1374,7 +1374,21 @@ function getReportSections( const queryJSON = getCurrentSearchQueryJSON(); const reportIDToTransactions: Record = {}; - for (const key in data) { + 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)) { const reportItem = {...data[key]}; const reportKey = `${ONYXKEYS.COLLECTION.REPORT}${reportItem.reportID}`; diff --git a/tests/unit/Search/SearchUIUtilsTest.ts b/tests/unit/Search/SearchUIUtilsTest.ts index b642a100bcbc..33c9dbab9e3a 100644 --- a/tests/unit/Search/SearchUIUtilsTest.ts +++ b/tests/unit/Search/SearchUIUtilsTest.ts @@ -1769,6 +1769,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,