Skip to content
This repository was archived by the owner on Dec 30, 2022. It is now read-only.

Commit 6f71d78

Browse files
fix(useInstantSearch): results is null when first search is stalled (#3597)
* fix(useSearchResults): results is null when first search is stalled * updated test and added context in comment * Update packages/react-instantsearch-hooks/src/lib/__tests__/useSearchResults.test.tsx Co-authored-by: Sarah Dayan <5370675+sarahdayan@users.noreply.github.com> * Update packages/react-instantsearch-hooks/src/lib/useSearchResults.ts Co-authored-by: Sarah Dayan <5370675+sarahdayan@users.noreply.github.com> Co-authored-by: Sarah Dayan <5370675+sarahdayan@users.noreply.github.com>
1 parent 925ad4e commit 6f71d78

File tree

2 files changed

+45
-4
lines changed

2 files changed

+45
-4
lines changed

packages/react-instantsearch-hooks/src/lib/__tests__/useSearchResults.test.tsx

Lines changed: 34 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,10 @@ import { AlgoliaSearchHelper, SearchResults } from 'algoliasearch-helper';
33
import React from 'react';
44
import { SearchBox } from 'react-instantsearch-hooks-web';
55

6+
import {
7+
createMultiSearchResponse,
8+
createSearchClient,
9+
} from '../../../../../test/mock';
610
import { createInstantSearchTestWrapper } from '../../../../../test/utils';
711
import { useSearchResults } from '../useSearchResults';
812

@@ -49,4 +53,34 @@ describe('useSearchResults', () => {
4953
});
5054
expect(result.current.results.__isArtificial).toBeUndefined();
5155
});
56+
57+
test('does not return `null` results when the first search is stalled', async () => {
58+
const wrapper = createInstantSearchTestWrapper({
59+
stalledSearchDelay: 0,
60+
searchClient: createSearchClient({
61+
search: async () => {
62+
// Simulate a stalled search
63+
await new Promise((resolve) => setTimeout(resolve, 50));
64+
65+
return createMultiSearchResponse();
66+
},
67+
}),
68+
});
69+
const { result, waitForNextUpdate } = renderHook(() => useSearchResults(), {
70+
wrapper: ({ children }) =>
71+
wrapper({
72+
children: (
73+
<>
74+
<SearchBox />
75+
{children}
76+
</>
77+
),
78+
}),
79+
});
80+
81+
await waitForNextUpdate();
82+
83+
// Update caused by <SearchBox>
84+
expect(result.current.results).not.toBeNull();
85+
});
5286
});

packages/react-instantsearch-hooks/src/lib/useSearchResults.ts

Lines changed: 11 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -21,10 +21,17 @@ export function useSearchResults(): SearchResultsApi {
2121

2222
useEffect(() => {
2323
function handleRender() {
24-
setSearchResults({
25-
results: searchIndex.getResults()!, // Results can't be `null` after the first render.
26-
scopedResults: searchIndex.getScopedResults(),
27-
});
24+
const results = searchIndex.getResults();
25+
26+
// Results can be `null` when the first search is stalled.
27+
// In this case, we skip the update.
28+
// See: https://github.com/algolia/instantsearch.js/blob/20996c7a159988c58e00ff24d2d2dc98af8b980f/src/widgets/index/index.ts#L652-L657
29+
if (results !== null) {
30+
setSearchResults({
31+
results,
32+
scopedResults: searchIndex.getScopedResults(),
33+
});
34+
}
2835
}
2936

3037
search.addListener('render', handleRender);

0 commit comments

Comments
 (0)