From f1623ea6b64c563cfe2469629864ceae0497635f Mon Sep 17 00:00:00 2001
From: Dhaya <154633+dhayab@users.noreply.github.com>
Date: Mon, 4 Apr 2022 15:23:19 +0200
Subject: [PATCH] fix(multi-index): correctly set prop in multi-index result
states
---
.../createInstantSearchManager.derived.js | 68 +++++++++++++++++++
.../src/core/createInstantSearchManager.js | 7 +-
2 files changed, 74 insertions(+), 1 deletion(-)
diff --git a/packages/react-instantsearch-core/src/core/__tests__/createInstantSearchManager.derived.js b/packages/react-instantsearch-core/src/core/__tests__/createInstantSearchManager.derived.js
index 1aac0ffa7b..e46a8b7fae 100644
--- a/packages/react-instantsearch-core/src/core/__tests__/createInstantSearchManager.derived.js
+++ b/packages/react-instantsearch-core/src/core/__tests__/createInstantSearchManager.derived.js
@@ -627,4 +627,72 @@ describe('createInstantSearchManager with multi index', () => {
})
);
});
+
+ it('sets state with correct value for `searching` property', async () => {
+ //
+ //
+ //
+ //
+ // ;
+
+ const searchClient = createSearchClient({});
+
+ const ism = createInstantSearchManager({
+ indexName: 'first',
+ initialState: {},
+ searchParameters: {},
+ searchClient,
+ });
+
+ //
+ ism.widgetsManager.registerWidget({
+ getSearchParameters: (params) => params.setQuery('first query 1'),
+ props: {},
+ });
+
+ //
+ ism.widgetsManager.registerWidget({
+ getSearchParameters: (x) => x.setIndex('first'),
+ props: {
+ indexName: 'first',
+ indexId: 'first',
+ },
+ });
+
+ //
+ ism.widgetsManager.registerWidget({
+ getSearchParameters: (x) => x.setIndex('second'),
+ props: {
+ indexName: 'second',
+ indexId: 'second',
+ },
+ });
+
+ //
+ ism.widgetsManager.registerWidget({
+ getSearchParameters: (x) => x.setIndex('third'),
+ props: {
+ indexName: 'third',
+ indexId: 'third',
+ },
+ });
+
+ const setStateSpy = jest.spyOn(ism.store, 'setState');
+
+ await wait(0);
+
+ expect(setStateSpy.mock.calls).toHaveLength(4);
+ expect(setStateSpy.mock.calls[0][0]).toEqual(
+ expect.objectContaining({ searching: true })
+ );
+ expect(setStateSpy.mock.calls[1][0]).toEqual(
+ expect.objectContaining({ searching: true })
+ );
+ expect(setStateSpy.mock.calls[2][0]).toEqual(
+ expect.objectContaining({ searching: true })
+ );
+ expect(setStateSpy.mock.calls[3][0]).toEqual(
+ expect.objectContaining({ searching: false })
+ );
+ });
});
diff --git a/packages/react-instantsearch-core/src/core/createInstantSearchManager.js b/packages/react-instantsearch-core/src/core/createInstantSearchManager.js
index d9dec2a65a..9ca808ae02 100644
--- a/packages/react-instantsearch-core/src/core/createInstantSearchManager.js
+++ b/packages/react-instantsearch-core/src/core/createInstantSearchManager.js
@@ -96,6 +96,7 @@ export default function createInstantSearchManager({
let skip = false;
let stalledSearchTimer = null;
let initialSearchParameters = helper.state;
+ let searchCounter;
const widgetsManager = createWidgetsManager(onWidgetsUpdate);
@@ -215,6 +216,8 @@ export default function createInstantSearchManager({
helper.state
);
+ searchCounter = derivedParameters.length + 1;
+
// We have to call `slice` because the method `detach` on the derived
// helpers mutates the value `derivedHelpers`. The `forEach` loop does
// not iterate on each value and we're not able to correctly clear the
@@ -253,6 +256,8 @@ export default function createInstantSearchManager({
function handleSearchSuccess({ indexId }) {
return (event) => {
+ searchCounter--;
+
const state = store.getState();
const isDerivedHelpersEmpty = !helper.derivedHelpers.length;
@@ -283,7 +288,7 @@ export default function createInstantSearchManager({
...partialState,
results,
isSearchStalled: nextIsSearchStalled,
- searching: false,
+ searching: searchCounter > 0,
error: null,
});
};