Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
5 changes: 4 additions & 1 deletion src/libs/SearchQueryUtils.ts
Original file line number Diff line number Diff line change
Expand Up @@ -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;
}
Comment on lines +1058 to +1061

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

What are we doing here? lastSearchNavigatorState. What is the reason for this change?

Copy link
Copy Markdown
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

We should fix this function to return the correct query JSON then the new expense can be updated on Search page in offline.

return {...state, routes: routesToRender, index: routesToRender.length - 1};

Because the preserved state of full-screen navigator only stores the last route, the search root page doesn't appear in the preserved state if we open the search money request page.

return {...state, routes: routesToRender, index: routesToRender.length - 1};

if (!lastSearchNavigatorState) {
return;
}
Expand Down
16 changes: 15 additions & 1 deletion src/libs/SearchUIUtils.ts
Original file line number Diff line number Diff line change
Expand Up @@ -1374,7 +1374,21 @@ function getReportSections(
const queryJSON = getCurrentSearchQueryJSON();
const reportIDToTransactions: Record<string, TransactionReportGroupListItemType> = {};

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}`;
Expand Down
38 changes: 38 additions & 0 deletions tests/unit/Search/SearchUIUtilsTest.ts
Original file line number Diff line number Diff line change
Expand Up @@ -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,
Expand Down
Loading