Skip to content
67 changes: 51 additions & 16 deletions src/components/Search/SearchAutocompleteList.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -294,9 +294,11 @@ function SearchAutocompleteList({

const autocompleteQueryWithoutFilters = getQueryWithoutFilters(autocompleteQueryValue);

const sortedRecentSearches = Object.values(recentSearches ?? {}).sort((a, b) => localeCompare(b.timestamp, a.timestamp));
const sortedRecentSearches = Object.entries(recentSearches ?? {}).sort(([, firstRecentSearch], [, secondRecentSearch]) =>
localeCompare(secondRecentSearch.timestamp, firstRecentSearch.timestamp),
);

const recentSearchesData = sortedRecentSearches?.slice(0, 5).map(({query, timestamp}) => {
const recentSearchesData = sortedRecentSearches?.slice(0, 5).map(([recentSearchHash, {query}]) => {
const searchQueryJSON = buildSearchQueryJSON(query);
return {
text: searchQueryJSON
Expand All @@ -317,7 +319,7 @@ function SearchAutocompleteList({
: query,
singleIcon: expensifyIcons.History,
searchQuery: query,
keyForList: timestamp,
keyForList: recentSearchHash,
searchItemType: CONST.SEARCH.SEARCH_ROUTER_ITEM_TYPE.SEARCH,
};
});
Expand Down Expand Up @@ -352,6 +354,12 @@ function SearchAutocompleteList({
debounceHandleSearch();
}, [autocompleteQueryWithoutFilters, debounceHandleSearch]);

const reasonAttributes: SkeletonSpanReasonAttributes = {
context: 'SearchAutocompleteList',
isRecentSearchesDataLoaded,
areOptionsInitialized,
};

/* Sections generation */
const {sections, styledRecentReports, suggestionsCount} = useMemo(() => {
const nextSections: Array<Section<AutocompleteListItem>> = [];
Expand Down Expand Up @@ -394,11 +402,31 @@ function SearchAutocompleteList({
} as AutocompleteListItem;
});

pushSection({
title: autocompleteQueryValue.trim() === '' ? translate('search.recentChats') : undefined,
data: nextStyledRecentReports,
sectionIndex: sectionIndex++,
});
if (areOptionsInitialized) {
pushSection({
title: autocompleteQueryValue.trim() === '' ? translate('search.recentChats') : undefined,
data: nextStyledRecentReports,
sectionIndex: sectionIndex++,
});
} else if (autocompleteQueryValue.trim() === '') {
pushSection({
title: translate('search.recentChats'),
data: [],
sectionIndex: sectionIndex++,
customHeader: (
<OptionsListSkeletonView
fixedNumItems={3}
shouldStyleAsTable
speed={CONST.TIMING.SKELETON_ANIMATION_SPEED}
reasonAttributes={{
context: 'SearchAutocompleteList',
isRecentSearchesDataLoaded,
areOptionsInitialized,
}}
/>
),
});
}

if (autocompleteSuggestions.length > 0) {
const autocompleteData: AutocompleteListItem[] = autocompleteSuggestions.map(({filterKey, text, autocompleteID, mapKey}) => {
Expand All @@ -417,12 +445,25 @@ function SearchAutocompleteList({
}

return {sections: nextSections, styledRecentReports: nextStyledRecentReports, suggestionsCount: nextSuggestionsCount};
}, [autocompleteQueryValue, autocompleteSuggestions, expensifyIcons, getAdditionalSections, recentReportsOptions, recentSearchesData, searchOptions, searchQueryItem, styles, translate]);
}, [
autocompleteQueryValue,
autocompleteSuggestions,
expensifyIcons,
getAdditionalSections,
recentReportsOptions,
recentSearchesData,
searchOptions,
searchQueryItem,
styles,
translate,
areOptionsInitialized,
isRecentSearchesDataLoaded,
]);

const sectionItemText = sections?.at(1)?.data?.[0]?.text ?? '';
const normalizedReferenceText = sectionItemText.toLowerCase();
const trimmedAutocompleteQueryValue = autocompleteQueryValue.trim();
const isLoading = !isRecentSearchesDataLoaded || !areOptionsInitialized;
const isLoading = !isRecentSearchesDataLoaded;
const suggestionsAnnouncement = suggestionsCount > 0 ? translate('search.suggestionsAvailable', {count: suggestionsCount}, trimmedAutocompleteQueryValue) : '';
useDebouncedAccessibilityAnnouncement(suggestionsAnnouncement, !!suggestionsAnnouncement, autocompleteQueryValue);

Expand Down Expand Up @@ -473,12 +514,6 @@ function SearchAutocompleteList({
}
}, [autocompleteQueryValue, onHighlightFirstItem, normalizedReferenceText]);

const reasonAttributes: SkeletonSpanReasonAttributes = {
context: 'SearchAutocompleteList',
isRecentSearchesDataLoaded,
areOptionsInitialized,
};

if (isLoading) {
return (
<OptionsListSkeletonView
Expand Down
Loading