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, }); };