Skip to content

Commit b643508

Browse files
feat(autocomplete): deduplicate recent searches/suggestions (#6824)
* feat(autocomplete): deduplicate recent searches/suggestions * bundlesize * tests * revert hidden and replace with aria-hidden
1 parent 6056518 commit b643508

File tree

7 files changed

+35
-14
lines changed

7 files changed

+35
-14
lines changed

bundlesize.config.json

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -10,19 +10,19 @@
1010
},
1111
{
1212
"path": "./packages/instantsearch.js/dist/instantsearch.production.min.js",
13-
"maxSize": "90.75 kB"
13+
"maxSize": "91 kB"
1414
},
1515
{
1616
"path": "./packages/instantsearch.js/dist/instantsearch.development.js",
17-
"maxSize": "193.25 kB"
17+
"maxSize": "193.5 kB"
1818
},
1919
{
2020
"path": "packages/react-instantsearch-core/dist/umd/ReactInstantSearchCore.min.js",
2121
"maxSize": "53.75 kB"
2222
},
2323
{
2424
"path": "packages/react-instantsearch/dist/umd/ReactInstantSearch.min.js",
25-
"maxSize": "72.25 kB"
25+
"maxSize": "72.5 kB"
2626
},
2727
{
2828
"path": "packages/vue-instantsearch/vue2/umd/index.js",

packages/instantsearch-ui-components/src/components/autocomplete/AutocompletePanel.tsx

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -27,6 +27,7 @@ export function createAutocompletePanelComponent({ createElement }: Renderer) {
2727
return (
2828
<div
2929
{...props}
30+
aria-hidden={hidden}
3031
className={cx(
3132
'ais-AutocompletePanel',
3233
!hidden && 'ais-AutocompletePanel--open',

packages/instantsearch.js/src/widgets/autocomplete/autocomplete.tsx

Lines changed: 13 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -24,6 +24,7 @@ import { component } from '../../lib/suit';
2424
import { prepareTemplateProps } from '../../lib/templating';
2525
import {
2626
createDocumentationMessageGenerator,
27+
find,
2728
getContainerNode,
2829
walkIndex,
2930
} from '../../lib/utils';
@@ -366,12 +367,23 @@ function AutocompleteWrapper<TItem extends BaseHit>({
366367
const elementId =
367368
indexName === showSuggestions?.indexName ? 'suggestions' : indexName;
368369

370+
const filteredHits =
371+
elementId === 'suggestions' && showRecent
372+
? hits.filter(
373+
(suggestionHit) =>
374+
!find(
375+
storageHits,
376+
(storageHit) => storageHit.query === suggestionHit.query
377+
)
378+
)
379+
: hits;
380+
369381
elements[elementId] = (
370382
<AutocompleteIndex
371383
key={indexId}
372384
HeaderComponent={headerComponent}
373385
ItemComponent={itemComponent}
374-
items={hits.map((item) => ({
386+
items={filteredHits.map((item) => ({
375387
...item,
376388
__indexName: indexId,
377389
}))}

packages/react-instantsearch/src/widgets/Autocomplete.tsx

Lines changed: 11 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -313,21 +313,31 @@ function InnerAutocomplete<TItem extends BaseHit = BaseHit>({
313313
}}
314314
items={storageHits}
315315
getItemProps={getItemProps}
316+
key="recentSearches"
316317
/>
317318
);
318319
}
319320

320321
indices.forEach(({ indexId, indexName, hits }, i) => {
321322
const elementId =
322323
indexName === showSuggestions?.indexName ? 'suggestions' : indexName;
324+
const filteredHits =
325+
elementId === 'suggestions' && showRecent
326+
? hits.filter(
327+
(suggestionHit) =>
328+
!storageHits.find(
329+
(storageHit) => storageHit.query === suggestionHit.query
330+
)
331+
)
332+
: hits;
323333
elements[elementId] = (
324334
<AutocompleteIndex
325335
key={indexId}
326336
// @ts-expect-error - there seems to be problems with React.ComponentType and this, but it's actually correct
327337
HeaderComponent={indicesConfig[i].headerComponent}
328338
// @ts-expect-error - there seems to be problems with React.ComponentType and this, but it's actually correct
329339
ItemComponent={indicesConfig[i].itemComponent}
330-
items={hits.map((item) => ({
340+
items={filteredHits.map((item) => ({
331341
...item,
332342
__indexName: indexId,
333343
}))}

packages/react-instantsearch/src/widgets/__tests__/Autocomplete.test.tsx

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -166,6 +166,7 @@ describe('Autocomplete', () => {
166166
expect(container.querySelector('.ais-AutocompletePanel'))
167167
.toMatchInlineSnapshot(`
168168
<div
169+
aria-hidden="true"
169170
aria-labelledby="autocomplete:r0:input"
170171
class="ais-AutocompletePanel"
171172
id="autocomplete:r0:panel"
@@ -247,6 +248,7 @@ describe('Autocomplete', () => {
247248
expect(container.querySelector('.ais-AutocompletePanel'))
248249
.toMatchInlineSnapshot(`
249250
<div
251+
aria-hidden="true"
250252
aria-labelledby="autocomplete:r1:input"
251253
class="ais-AutocompletePanel"
252254
id="autocomplete:r1:panel"

tests/common/widgets/autocomplete/options.tsx

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -228,7 +228,7 @@ export function createOptionsTests(
228228

229229
// click the hello combo box suggestion
230230
await act(async () => {
231-
screen.getAllByText('hello')[0].click();
231+
screen.getByText('hello').click();
232232
await wait(0);
233233
});
234234

@@ -238,6 +238,9 @@ export function createOptionsTests(
238238
expect(recentSearches).toHaveLength(1);
239239
expect(recentSearches[0]).toHaveTextContent('hello');
240240

241+
// It should not be duplicated in suggestions
242+
expect(screen.getAllByText('hello').length).toBe(1);
243+
241244
await act(async () => {
242245
screen
243246
.getByRole('button', {

tests/common/widgets/autocomplete/templates.tsx

Lines changed: 1 addition & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -208,6 +208,7 @@ export function createTemplatesTests(
208208
normalizeSnapshot('P484'),
209209
`
210210
<div
211+
aria-hidden="false"
211212
aria-labelledby="autocompleteP484input"
212213
class="ais-AutocompletePanel ais-AutocompletePanel--open"
213214
id="autocompleteP484panel"
@@ -291,14 +292,6 @@ export function createTemplatesTests(
291292
class="ais-AutocompleteIndexItem ais-AutocompleteSuggestionsItem"
292293
id="autocompleteP484item:indexName2:0"
293294
role="row"
294-
>
295-
hello
296-
</li>
297-
<li
298-
aria-selected="false"
299-
class="ais-AutocompleteIndexItem ais-AutocompleteSuggestionsItem"
300-
id="autocompleteP484item:indexName2:1"
301-
role="row"
302295
>
303296
world
304297
</li>

0 commit comments

Comments
 (0)