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

Commit 0d718d5

Browse files
authored
fix(state-results): provide rendering variables for initial render (#1156)
fixes #1154 If there's results already available, we want to render them ASAP, not waiting for a render event, similar to how the error event is listened to "immediate"
1 parent 815a307 commit 0d718d5

File tree

3 files changed

+53
-50
lines changed

3 files changed

+53
-50
lines changed

src/components/StateResults.vue

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -56,6 +56,7 @@ export default {
5656
},
5757
created() {
5858
this.instantSearchInstance.addListener('render', this.renderFn);
59+
this.renderFn();
5960
},
6061
[isVue3 ? 'beforeUnmount' : 'beforeDestroy']() {
6162
if (this.widget) {

src/components/__tests__/StateResults.js

Lines changed: 26 additions & 42 deletions
Original file line numberDiff line numberDiff line change
@@ -1,27 +1,25 @@
11
import { mount } from '../../../test/utils';
22
import StateResults from '../StateResults.vue';
3-
import { __setState } from '../../mixins/widget';
3+
import { __setIndexHelper, __setIndexResults } from '../../mixins/widget';
44
jest.mock('../../mixins/widget');
55

66
it('renders explanation if no slot is used', () => {
7-
__setState({
8-
results: {
9-
query: 'this is the quer',
10-
hits: [{ objectID: '1', name: 'one' }, { objectID: '2', name: 'two' }],
11-
page: 1,
12-
},
7+
__setIndexResults({
8+
query: 'this is the quer',
9+
hits: [{ objectID: '1', name: 'one' }, { objectID: '2', name: 'two' }],
10+
page: 1,
11+
});
12+
__setIndexHelper({
1313
state: {
1414
query: 'this is the query',
1515
},
16-
status: 'idle',
17-
error: undefined,
1816
});
1917
const wrapper = mount(StateResults);
2018
expect(wrapper.html()).toMatchSnapshot();
2119
});
2220

2321
it("doesn't render if no results", () => {
24-
__setState({});
22+
__setIndexResults(null);
2523
const wrapper = mount(StateResults);
2624
expect(wrapper).toHaveEmptyHTML();
2725
});
@@ -38,12 +36,8 @@ it('gives state & results to default slot', () => {
3836
page: 1,
3937
};
4038

41-
__setState({
42-
state,
43-
results,
44-
status: 'idle',
45-
error: undefined,
46-
});
39+
__setIndexResults(results);
40+
__setIndexHelper({ state });
4741

4842
mount(StateResults, {
4943
scopedSlots: {
@@ -67,10 +61,8 @@ it('allows default slot to render whatever they want', () => {
6761
const state = {
6862
query: 'hi!',
6963
};
70-
__setState({
71-
state,
72-
results,
73-
});
64+
__setIndexResults(results);
65+
__setIndexHelper({ state });
7466

7567
const wrapper = mount({
7668
components: { StateResults },
@@ -106,10 +98,8 @@ it('allows default slot to render whatever they want (truthy query)', () => {
10698
const state = {
10799
query: 'hi!',
108100
};
109-
__setState({
110-
state,
111-
results,
112-
});
101+
__setIndexResults(results);
102+
__setIndexHelper({ state });
113103

114104
const wrapper = mount({
115105
components: { StateResults },
@@ -145,10 +135,8 @@ it('allows default slot to render whatever they want (falsy query)', () => {
145135
const state = {
146136
query: 'hi!',
147137
};
148-
__setState({
149-
state,
150-
results,
151-
});
138+
__setIndexResults(results);
139+
__setIndexHelper({ state });
152140

153141
const wrapper = mount({
154142
components: { StateResults },
@@ -177,14 +165,12 @@ it('allows default slot to render whatever they want (falsy query)', () => {
177165

178166
describe('legacy spread props', () => {
179167
it('allows default slot to render whatever they want (truthy query)', () => {
180-
__setState({
181-
results: {
182-
query: 'q',
183-
hits: [{ objectID: '1', name: 'one' }, { objectID: '2', name: 'two' }],
184-
page: 1,
185-
},
186-
state: {},
168+
__setIndexResults({
169+
query: 'q',
170+
hits: [{ objectID: '1', name: 'one' }, { objectID: '2', name: 'two' }],
171+
page: 1,
187172
});
173+
__setIndexHelper({ state: {} });
188174

189175
const wrapper = mount({
190176
components: { StateResults },
@@ -212,14 +198,12 @@ describe('legacy spread props', () => {
212198
});
213199

214200
it('allows default slot to render whatever they want (falsy query)', () => {
215-
__setState({
216-
results: {
217-
query: '',
218-
hits: [{ objectID: '1', name: 'one' }, { objectID: '2', name: 'two' }],
219-
page: 1,
220-
},
221-
state: {},
201+
__setIndexResults({
202+
query: '',
203+
hits: [{ objectID: '1', name: 'one' }, { objectID: '2', name: 'two' }],
204+
page: 1,
222205
});
206+
__setIndexHelper({ state: {} });
223207

224208
const wrapper = mount({
225209
components: { StateResults },

src/mixins/__mocks__/widget.js

Lines changed: 26 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,13 @@
11
let state = {};
22
let widget = {};
3+
let indexResults = null;
4+
let indexHelper = null;
5+
let instantSearchInstance = {
6+
status: 'idle',
7+
error: undefined,
8+
addListener: () => {},
9+
removeListener: () => {},
10+
};
311

412
// we need to have state given by `component` before it is mounted, otherwise
513
// we can't render it in most cases (items, hits, etc. are used in the template)
@@ -17,20 +25,30 @@ export function __setWidget(newWidget) {
1725
widget = newWidget;
1826
}
1927

28+
export function __setIndexResults(newResults) {
29+
indexResults = newResults;
30+
}
31+
32+
export function __setIndexHelper(newHelper) {
33+
indexHelper = newHelper;
34+
}
35+
36+
export function __overrideInstantSearchInstance(newInstantSearchInstance) {
37+
instantSearchInstance = Object.assign(
38+
instantSearchInstance,
39+
newInstantSearchInstance
40+
);
41+
}
42+
2043
export const createWidgetMixin = jest.fn(() => ({
2144
data() {
2245
return {
2346
state,
2447
widget,
25-
instantSearchInstance: {
26-
status: 'idle',
27-
error: undefined,
28-
addListener: () => {},
29-
removeListener: () => {},
30-
},
48+
instantSearchInstance,
3149
getParentIndex: () => ({
32-
getResults: () => null,
33-
getHelper: () => null,
50+
getResults: () => indexResults,
51+
getHelper: () => indexHelper,
3452
}),
3553
};
3654
},

0 commit comments

Comments
 (0)