diff --git a/src/lib/searchOnlyListOmnibox.ts b/src/lib/searchOnlyListOmnibox.ts index 23db977e..ef35f92b 100644 --- a/src/lib/searchOnlyListOmnibox.ts +++ b/src/lib/searchOnlyListOmnibox.ts @@ -2,7 +2,11 @@ * Degenerate omnibox for lists that only expose free-text search (B128: * organizações). Pure / client-safe. */ -import { type CampaignListOmniboxChip } from '@/lib/campaignListOmnibox' +import { + filterOmniboxSuggestionSeeds, + type CampaignListOmniboxChip, + type CampaignListOmniboxSuggestion, +} from '@/lib/campaignListOmnibox' export type SearchOnlyListState = { q?: string @@ -19,6 +23,9 @@ export const buildSearchOnlyOmniboxChips = ( state: SearchOnlyListState, ): CampaignListOmniboxChip[] => (state.q ? [{ id: 'q', label: chipLabel('Busca', state.q) }] : []) +export const buildSearchOnlyOmniboxSuggestions = (query: string): CampaignListOmniboxSuggestion[] => + filterOmniboxSuggestionSeeds([], query) + export const applySearchOnlyOmniboxSuggestion = ({ state, suggestionId, @@ -34,3 +41,28 @@ export const applySearchOnlyOmniboxSuggestion = ( } return { kind: 'url', state } } + +export const removeSearchOnlyOmniboxChip = ({ + state, + chipId, + withPageReset, +}: { + state: T + chipId: string + withPageReset: (next: T) => T +}): SearchOnlyOmniboxAction => { + if (chipId === 'q') { + return { kind: 'url', state: withPageReset({ ...state, q: undefined }) } + } + return { kind: 'url', state } +} + +export const clearSearchOnlyOmnibox = ({ + cleared, +}: { + state: T + cleared: T +}): SearchOnlyOmniboxAction => ({ + kind: 'clear', + state: cleared, +}) diff --git a/tests/unit/listOmniboxB128.unit.spec.ts b/tests/unit/listOmniboxB128.unit.spec.ts index 5f1f7a6f..69c4a944 100644 --- a/tests/unit/listOmniboxB128.unit.spec.ts +++ b/tests/unit/listOmniboxB128.unit.spec.ts @@ -3,6 +3,9 @@ import { describe, expect, it } from 'vitest' import { applySearchOnlyOmniboxSuggestion, buildSearchOnlyOmniboxChips, + buildSearchOnlyOmniboxSuggestions, + clearSearchOnlyOmnibox, + removeSearchOnlyOmniboxChip, } from '@/lib/searchOnlyListOmnibox' import { applyActivityOmniboxSuggestion, @@ -309,6 +312,21 @@ describe('list omnibox adapters (B128)', () => { withPageReset: (next) => ({ ...next, page: 1 }), }) expect(applied).toEqual({ kind: 'url', state: { page: 1, q: 'ana' } }) + + expect(buildSearchOnlyOmniboxSuggestions('x')[0]?.id).toBe('q:x') + + const removed = removeSearchOnlyOmniboxChip({ + state: { q: 'sindicato', page: 2 }, + chipId: 'q', + withPageReset: (next) => ({ ...next, page: 1 }), + }) + expect(removed).toEqual({ kind: 'url', state: { page: 1, q: undefined } }) + + const cleared = clearSearchOnlyOmnibox({ + state: { q: 'sindicato' }, + cleared: {}, + }) + expect(cleared).toEqual({ kind: 'clear', state: {} }) }) it('advisor toggles municipality portfolio filter and suggests by name', () => {