From f3a621e06b6164524e25264fdc809803e0c1b8a4 Mon Sep 17 00:00:00 2001 From: Carlos Martins Date: Tue, 6 Aug 2024 13:16:56 +0300 Subject: [PATCH 1/2] fix crash for missing report --- src/libs/SearchUtils.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/libs/SearchUtils.ts b/src/libs/SearchUtils.ts index f778cca36f6..d267e942f6f 100644 --- a/src/libs/SearchUtils.ts +++ b/src/libs/SearchUtils.ts @@ -220,7 +220,7 @@ function getReportSections(data: OnyxTypes.SearchResults['data'], metadata: Onyx }; if (reportIDToTransactions[reportKey]?.transactions) { reportIDToTransactions[reportKey].transactions.push(transaction); - } else { + } else if (reportIDToTransactions[reportKey]) { reportIDToTransactions[reportKey].transactions = [transaction]; } } From a27acf1e454dd0f13d8591bc88894c3aaa263f35 Mon Sep 17 00:00:00 2001 From: Carlos Martins Date: Wed, 7 Aug 2024 10:29:05 +0300 Subject: [PATCH 2/2] fix empty state --- src/components/Search/index.tsx | 81 ++++++++++++++++----------------- src/libs/SearchUtils.ts | 11 +++-- 2 files changed, 47 insertions(+), 45 deletions(-) diff --git a/src/components/Search/index.tsx b/src/components/Search/index.tsx index dbe7ae940e7..c9900d93387 100644 --- a/src/components/Search/index.tsx +++ b/src/components/Search/index.tsx @@ -177,33 +177,6 @@ function Search({queryJSON, policyIDs, isCustomQuery}: SearchProps) { const shouldShowLoadingState = !isOffline && !isDataLoaded; const shouldShowLoadingMoreItems = !shouldShowLoadingState && searchResults?.search?.isLoading && searchResults?.search?.offset > 0; - const toggleTransaction = (item: TransactionListItemType | ReportListItemType) => { - if (SearchUtils.isTransactionListItemType(item)) { - if (!item.keyForList) { - return; - } - - setSelectedTransactions(prepareTransactionsList(item, selectedTransactions)); - return; - } - - if (item.transactions.every((transaction) => selectedTransactions[transaction.keyForList]?.isSelected)) { - const reducedSelectedTransactions: SelectedTransactions = {...selectedTransactions}; - - item.transactions.forEach((transaction) => { - delete reducedSelectedTransactions[transaction.keyForList]; - }); - - setSelectedTransactions(reducedSelectedTransactions); - return; - } - - setSelectedTransactions({ - ...selectedTransactions, - ...Object.fromEntries(item.transactions.map(mapTransactionItemToSelectedEntry)), - }); - }; - if (shouldShowLoadingState) { return ( <> @@ -217,7 +190,19 @@ function Search({queryJSON, policyIDs, isCustomQuery}: SearchProps) { ); } - const shouldShowEmptyState = !isDataLoaded || SearchUtils.isSearchResultsEmpty(searchResults); + const type = SearchUtils.getSearchType(searchResults?.search); + + if (searchResults === undefined || type === undefined) { + Log.alert('[Search] Undefined search type'); + return null; + } + + const ListItem = SearchUtils.getListItem(type); + const data = SearchUtils.getSections(searchResults.data, searchResults.search, type); + const sortedData = SearchUtils.getSortedSections(type, data, sortBy, sortOrder); + const sortedSelectedData = sortedData.map((item) => mapToItemWithSelectionInfo(item, selectedTransactions)); + + const shouldShowEmptyState = !isDataLoaded || SearchUtils.isSearchResultsEmpty(data); if (shouldShowEmptyState) { return ( @@ -232,6 +217,33 @@ function Search({queryJSON, policyIDs, isCustomQuery}: SearchProps) { ); } + const toggleTransaction = (item: TransactionListItemType | ReportListItemType) => { + if (SearchUtils.isTransactionListItemType(item)) { + if (!item.keyForList) { + return; + } + + setSelectedTransactions(prepareTransactionsList(item, selectedTransactions)); + return; + } + + if (item.transactions.every((transaction) => selectedTransactions[transaction.keyForList]?.isSelected)) { + const reducedSelectedTransactions: SelectedTransactions = {...selectedTransactions}; + + item.transactions.forEach((transaction) => { + delete reducedSelectedTransactions[transaction.keyForList]; + }); + + setSelectedTransactions(reducedSelectedTransactions); + return; + } + + setSelectedTransactions({ + ...selectedTransactions, + ...Object.fromEntries(item.transactions.map(mapTransactionItemToSelectedEntry)), + }); + }; + const openReport = (item: TransactionListItemType | ReportListItemType) => { let reportID = SearchUtils.isTransactionListItemType(item) ? item.transactionThreadReportID : item.reportID; @@ -255,19 +267,6 @@ function Search({queryJSON, policyIDs, isCustomQuery}: SearchProps) { setOffset(offset + CONST.SEARCH.RESULTS_PAGE_SIZE); }; - const type = SearchUtils.getSearchType(searchResults?.search); - - if (type === undefined) { - Log.alert('[Search] Undefined search type'); - return null; - } - - const ListItem = SearchUtils.getListItem(type); - - const data = SearchUtils.getSections(searchResults?.data ?? {}, searchResults?.search ?? {}, type); - const sortedData = SearchUtils.getSortedSections(type, data, sortBy, sortOrder); - const sortedSelectedData = sortedData.map((item) => mapToItemWithSelectionInfo(item, selectedTransactions)); - const toggleAllTransactions = () => { const areItemsOfReportType = searchResults?.search.type === CONST.SEARCH.DATA_TYPES.REPORT; const flattenedItems = areItemsOfReportType ? (data as ReportListItemType[]).flatMap((item) => item.transactions) : data; diff --git a/src/libs/SearchUtils.ts b/src/libs/SearchUtils.ts index d267e942f6f..b44700248a8 100644 --- a/src/libs/SearchUtils.ts +++ b/src/libs/SearchUtils.ts @@ -8,7 +8,6 @@ import ONYXKEYS from '@src/ONYXKEYS'; import type {SearchAdvancedFiltersForm} from '@src/types/form'; import INPUT_IDS from '@src/types/form/SearchAdvancedFiltersForm'; import type * as OnyxTypes from '@src/types/onyx'; -import type SearchResults from '@src/types/onyx/SearchResults'; import type {SearchAccountDetails, SearchDataTypes, SearchPersonalDetails, SearchTransaction, SearchTypeToItemMap, SectionsType} from '@src/types/onyx/SearchResults'; import DateUtils from './DateUtils'; import getTopmostCentralPaneRoute from './Navigation/getTopmostCentralPaneRoute'; @@ -76,7 +75,11 @@ function isSearchDataType(type: string): type is SearchDataTypes { return searchDataTypes.includes(type); } -function getSearchType(search: OnyxTypes.SearchResults['search']): SearchDataTypes | undefined { +function getSearchType(search: OnyxTypes.SearchResults['search'] | undefined): SearchDataTypes | undefined { + if (!search) { + return undefined; + } + if (!isSearchDataType(search.type)) { return undefined; } @@ -318,8 +321,8 @@ function getCurrentSearchParams() { return topmostCentralPaneRoute?.params as AuthScreensParamList['Search_Central_Pane']; } -function isSearchResultsEmpty(searchResults: SearchResults) { - return !Object.keys(searchResults?.data).some((key) => key.startsWith(ONYXKEYS.COLLECTION.TRANSACTION)); +function isSearchResultsEmpty(data: SectionsType) { + return data.length === 0; } function getQueryHashFromString(query: SearchQueryString): number {