diff --git a/apps/agent/entrypoints/newtab/index/SearchSuggestions.tsx b/apps/agent/entrypoints/newtab/index/SearchSuggestions.tsx index 759a06d21..c5ee6a404 100644 --- a/apps/agent/entrypoints/newtab/index/SearchSuggestions.tsx +++ b/apps/agent/entrypoints/newtab/index/SearchSuggestions.tsx @@ -37,8 +37,10 @@ const SuggestionItemRenderer: FC<{ case 'search': return (
  • - - {item.query} + + + {item.query} +
  • ) @@ -64,9 +66,14 @@ const SuggestionItemRenderer: FC<{ case 'browseros': return (
  • - - Ask BrowserOS: - {item.message || 'Type a message...'} + + Ask BrowserOS: + + {item.message || 'Type a message...'} +
  • ) } diff --git a/apps/agent/entrypoints/newtab/index/lib/suggestions/useSuggestions.ts b/apps/agent/entrypoints/newtab/index/lib/suggestions/useSuggestions.ts index 72255674b..3a1b28a32 100644 --- a/apps/agent/entrypoints/newtab/index/lib/suggestions/useSuggestions.ts +++ b/apps/agent/entrypoints/newtab/index/lib/suggestions/useSuggestions.ts @@ -17,12 +17,40 @@ interface UseSuggestionsArgs { selectedTabs: chrome.tabs.Tab[] } +function buildSearchResults( + query: string, + searchResultsFromApi: string[] | undefined, +): string[] { + const orderedResults = [query.trim(), ...(searchResultsFromApi ?? [])] + const seen = new Set() + const dedupedResults: string[] = [] + + for (const item of orderedResults) { + const normalizedItem = item.trim() + if (!normalizedItem) { + continue + } + + const suggestionKey = normalizedItem.toLowerCase() + if (seen.has(suggestionKey)) { + continue + } + + seen.add(suggestionKey) + dedupedResults.push(normalizedItem) + } + + return dedupedResults +} + /** * @public */ export const useSuggestions = ({ query, selectedTabs }: UseSuggestionsArgs) => { const { provider } = useSearchProvider() const providerConfig = getProviderConfig(provider) + const trimmedQuery = query.trim() + const hasQuery = trimmedQuery.length > 0 const { data: searchResultsFromAPI } = useSearchSuggestions({ query, @@ -30,20 +58,16 @@ export const useSuggestions = ({ query, selectedTabs }: UseSuggestionsArgs) => { }) const searchResults: string[] = useMemo(() => { - const results = [...(searchResultsFromAPI ?? [])] - if (query && !results.includes(query)) { - results.unshift(query) - } - return results + return buildSearchResults(query, searchResultsFromAPI) }, [searchResultsFromAPI, query]) const aiTabResults = useAITabSuggestions({ selectedTabs, input: query }) - const browserOSResults = useBrowserOSSuggestions({ query }) + const browserOSResults = useBrowserOSSuggestions({ query: trimmedQuery }) const sections = useMemo(() => { const result: SuggestionSection[] = [] - if (query && browserOSResults.length > 0) { + if (hasQuery && browserOSResults.length > 0) { const browserOSItems: BrowserOSSuggestionItem[] = browserOSResults.map( (item, index) => ({ id: `browseros-${index}`, @@ -77,7 +101,7 @@ export const useSuggestions = ({ query, selectedTabs }: UseSuggestionsArgs) => { title: 'AI Actions', items: aiItems, }) - } else if (query && searchResults && searchResults.length > 0) { + } else if (hasQuery && searchResults.length > 0) { const searchItems: SearchSuggestionItem[] = searchResults.map( (item, index) => ({ id: `search-${index}`, @@ -94,7 +118,7 @@ export const useSuggestions = ({ query, selectedTabs }: UseSuggestionsArgs) => { return result }, [ - query, + hasQuery, browserOSResults, selectedTabs.length, aiTabResults,