Skip to content

Commit 48c080e

Browse files
authoredMar 24, 2021
fix(createURL): correctly remove page in state (#4679)
* fix(createURL): correctly remove page in state fixes algolia/vue-instantsearch#932 * undo stale state change in breadcrumb * test(ratingmenu): avoid testing details
1 parent f02416c commit 48c080e

File tree

9 files changed

+92
-65
lines changed

9 files changed

+92
-65
lines changed
 

‎src/connectors/breadcrumb/connectBreadcrumb.ts

+19-34
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,7 @@ import {
55
isEqual,
66
noop,
77
} from '../../lib/utils';
8-
import { SearchResults } from 'algoliasearch-helper';
8+
import { SearchParameters, SearchResults } from 'algoliasearch-helper';
99
import { Connector, TransformItems, CreateURL } from '../../types';
1010

1111
const withUsage = createDocumentationMessageGenerator({
@@ -107,6 +107,22 @@ const connectBreadcrumb: BreadcrumbConnector = function connectBreadcrumb(
107107

108108
const [hierarchicalFacetName] = attributes;
109109

110+
function getRefinedState(state: SearchParameters, facetValue: string) {
111+
if (!facetValue) {
112+
const breadcrumb = state.getHierarchicalFacetBreadcrumb(
113+
hierarchicalFacetName
114+
);
115+
if (breadcrumb.length > 0) {
116+
return state
117+
.resetPage()
118+
.toggleFacetRefinement(hierarchicalFacetName, breadcrumb[0]);
119+
}
120+
}
121+
return state
122+
.resetPage()
123+
.toggleFacetRefinement(hierarchicalFacetName, facetValue);
124+
}
125+
110126
return {
111127
$$type: 'ais.breadcrumb',
112128

@@ -166,44 +182,13 @@ const connectBreadcrumb: BreadcrumbConnector = function connectBreadcrumb(
166182

167183
if (!connectorState.createURL) {
168184
connectorState.createURL = facetValue => {
169-
if (!facetValue) {
170-
const breadcrumb = helper.getHierarchicalFacetBreadcrumb(
171-
hierarchicalFacetName
172-
);
173-
if (breadcrumb.length > 0) {
174-
return createURL(
175-
helper.state.toggleFacetRefinement(
176-
hierarchicalFacetName,
177-
breadcrumb[0]
178-
)
179-
);
180-
}
181-
}
182-
return createURL(
183-
helper.state.toggleFacetRefinement(
184-
hierarchicalFacetName,
185-
facetValue
186-
)
187-
);
185+
return createURL(getRefinedState(helper.state, facetValue));
188186
};
189187
}
190188

191189
if (!connectorState.refine) {
192190
connectorState.refine = facetValue => {
193-
if (!facetValue) {
194-
const breadcrumb = helper.getHierarchicalFacetBreadcrumb(
195-
hierarchicalFacetName
196-
);
197-
if (breadcrumb.length > 0) {
198-
helper
199-
.toggleRefinement(hierarchicalFacetName, breadcrumb[0])
200-
.search();
201-
}
202-
} else {
203-
helper
204-
.toggleRefinement(hierarchicalFacetName, facetValue)
205-
.search();
206-
}
191+
helper.setState(getRefinedState(helper.state, facetValue)).search();
207192
};
208193
}
209194

‎src/connectors/hierarchical-menu/connectHierarchicalMenu.js

+6-2
Original file line numberDiff line numberDiff line change
@@ -185,7 +185,9 @@ export default function connectHierarchicalMenu(renderFn, unmountFn = noop) {
185185
// Bind createURL to this specific attribute
186186
function _createURL(facetValue) {
187187
return createURL(
188-
state.toggleRefinement(hierarchicalFacetName, facetValue)
188+
state
189+
.resetPage()
190+
.toggleFacetRefinement(hierarchicalFacetName, facetValue)
189191
);
190192
}
191193

@@ -201,7 +203,9 @@ export default function connectHierarchicalMenu(renderFn, unmountFn = noop) {
201203
if (!this._refine) {
202204
this._refine = function(facetValue) {
203205
sendEvent('click', facetValue);
204-
helper.toggleRefinement(hierarchicalFacetName, facetValue).search();
206+
helper
207+
.toggleFacetRefinement(hierarchicalFacetName, facetValue)
208+
.search();
205209
};
206210
}
207211

‎src/connectors/hits-per-page/connectHitsPerPage.ts

+6-4
Original file line numberDiff line numberDiff line change
@@ -159,10 +159,12 @@ const connectHitsPerPage: HitsPerPageConnector = function connectHitsPerPage(
159159
},
160160
createURLFactory: ({ state, createURL }) => value =>
161161
createURL(
162-
state.setQueryParameter(
163-
'hitsPerPage',
164-
!value && value !== 0 ? undefined : value
165-
)
162+
state
163+
.resetPage()
164+
.setQueryParameter(
165+
'hitsPerPage',
166+
!value && value !== 0 ? undefined : value
167+
)
166168
),
167169
};
168170

‎src/connectors/menu/connectMenu.ts

+3-1
Original file line numberDiff line numberDiff line change
@@ -232,7 +232,9 @@ const connectMenu: MenuConnector = function connectMenu(
232232
if (!_createURL) {
233233
_createURL = (facetValue: string) =>
234234
createURL(
235-
helper.state.toggleFacetRefinement(attribute, facetValue)
235+
helper.state
236+
.resetPage()
237+
.toggleFacetRefinement(attribute, facetValue)
236238
);
237239
}
238240

‎src/connectors/rating-menu/connectRatingMenu.js

+13-12
Original file line numberDiff line numberDiff line change
@@ -199,27 +199,28 @@ ${
199199
}`;
200200
};
201201

202-
const toggleRefinement = (helper, facetValue) => {
203-
sendEvent('click', facetValue);
204-
const isRefined = getRefinedStar(helper.state) === Number(facetValue);
205-
helper.removeNumericRefinement(attribute);
202+
function getRefinedState(state, facetValue) {
203+
const isRefined = getRefinedStar(state) === Number(facetValue);
204+
205+
const emptyState = state.resetPage().removeNumericRefinement(attribute);
206+
206207
if (!isRefined) {
207-
helper
208+
return emptyState
208209
.addNumericRefinement(attribute, '<=', max)
209210
.addNumericRefinement(attribute, '>=', facetValue);
210211
}
211-
helper.search();
212+
return emptyState;
213+
}
214+
215+
const toggleRefinement = (helper, facetValue) => {
216+
sendEvent('click', facetValue);
217+
helper.setState(getRefinedState(helper.state, facetValue)).search();
212218
};
213219

214220
const connectorState = {
215221
toggleRefinementFactory: helper => toggleRefinement.bind(this, helper),
216222
createURLFactory: ({ state, createURL }) => value =>
217-
createURL(
218-
state
219-
.removeNumericRefinement(attribute)
220-
.addNumericRefinement(attribute, '<=', max)
221-
.addNumericRefinement(attribute, '>=', value)
222-
),
223+
createURL(getRefinedState(state, value)),
223224
};
224225

225226
return {

‎src/connectors/refinement-list/connectRefinementList.ts

+3-1
Original file line numberDiff line numberDiff line change
@@ -435,7 +435,9 @@ const connectRefinementList: RefinementListConnector = function connectRefinemen
435435

436436
return {
437437
createURL: facetValue =>
438-
createURL(state.toggleFacetRefinement(attribute, facetValue)),
438+
createURL(
439+
state.resetPage().toggleFacetRefinement(attribute, facetValue)
440+
),
439441
items,
440442
refine: triggerRefine,
441443
searchForItems: searchFacetValues,

‎src/connectors/toggle-refinement/connectToggleRefinement.js

+4-2
Original file line numberDiff line numberDiff line change
@@ -161,17 +161,19 @@ export default function connectToggleRefinement(renderFn, unmountFn = noop) {
161161

162162
const connectorState = {
163163
createURLFactory: (isRefined, { state, createURL }) => () => {
164+
state = state.resetPage();
165+
164166
const valuesToRemove = isRefined ? on : off;
165167
if (valuesToRemove) {
166168
valuesToRemove.forEach(v => {
167-
state.removeDisjunctiveFacetRefinement(attribute, v);
169+
state = state.removeDisjunctiveFacetRefinement(attribute, v);
168170
});
169171
}
170172

171173
const valuesToAdd = isRefined ? off : on;
172174
if (valuesToAdd) {
173175
valuesToAdd.forEach(v => {
174-
state.addDisjunctiveFacetRefinement(attribute, v);
176+
state = state.addDisjunctiveFacetRefinement(attribute, v);
175177
});
176178
}
177179

‎src/widgets/hierarchical-menu/__tests__/hierarchical-menu-test.js

+3-3
Original file line numberDiff line numberDiff line change
@@ -50,7 +50,7 @@ See documentation: https://www.algolia.com/doc/api-reference/widgets/hierarchica
5050
data = { data: [{ name: 'foo' }, { name: 'bar' }] };
5151
results = { getFacetValues: jest.fn(() => data) };
5252
helper = algoliasearchHelper({}, '');
53-
helper.toggleRefinement = jest.fn().mockReturnThis();
53+
helper.toggleFacetRefinement = jest.fn().mockReturnThis();
5454
helper.search = jest.fn();
5555
state = new SearchParameters();
5656
state.toggleRefinement = jest.fn();
@@ -174,8 +174,8 @@ See documentation: https://www.algolia.com/doc/api-reference/widgets/hierarchica
174174
const elementToggleRefinement = firstRender[0].props.toggleRefinement;
175175
elementToggleRefinement('mom');
176176

177-
expect(helper.toggleRefinement).toHaveBeenCalledTimes(1);
178-
expect(helper.toggleRefinement).toHaveBeenCalledWith('hello', 'mom');
177+
expect(helper.toggleFacetRefinement).toHaveBeenCalledTimes(1);
178+
expect(helper.toggleFacetRefinement).toHaveBeenCalledWith('hello', 'mom');
179179
expect(helper.search).toHaveBeenCalledTimes(1);
180180
});
181181

‎src/widgets/rating-menu/__tests__/rating-menu-test.js

+35-6
Original file line numberDiff line numberDiff line change
@@ -144,8 +144,18 @@ describe('ratingMenu()', () => {
144144
.getWidgetRenderState({ state: helper.state, helper, results, createURL })
145145
.refine('3');
146146

147-
expect(helper.removeNumericRefinement).toHaveBeenCalledTimes(1);
148-
expect(helper.addNumericRefinement).toHaveBeenCalledTimes(2);
147+
expect(helper.state).toEqual(
148+
new SearchParameters({
149+
index: '',
150+
disjunctiveFacets: ['anAttrName'],
151+
numericRefinements: {
152+
anAttrName: {
153+
'<=': [5],
154+
'>=': [3],
155+
},
156+
},
157+
})
158+
);
149159
expect(helper.search).toHaveBeenCalledTimes(1);
150160
});
151161

@@ -156,8 +166,17 @@ describe('ratingMenu()', () => {
156166
.getWidgetRenderState({ state: helper.state, helper, results, createURL })
157167
.refine('2');
158168

159-
expect(helper.removeNumericRefinement).toHaveBeenCalledTimes(1);
160-
expect(helper.addNumericRefinement).toHaveBeenCalledTimes(0);
169+
expect(helper.state).toEqual(
170+
new SearchParameters({
171+
index: '',
172+
disjunctiveFacets: ['anAttrName'],
173+
numericRefinements: {
174+
anAttrName: {
175+
'>=': [],
176+
},
177+
},
178+
})
179+
);
161180
expect(helper.search).toHaveBeenCalledTimes(1);
162181
});
163182

@@ -167,8 +186,18 @@ describe('ratingMenu()', () => {
167186
.getWidgetRenderState({ state: helper.state, helper, results, createURL })
168187
.refine('4');
169188

170-
expect(helper.removeNumericRefinement).toHaveBeenCalledTimes(1);
171-
expect(helper.addNumericRefinement).toHaveBeenCalledTimes(2);
189+
expect(helper.state).toEqual(
190+
new SearchParameters({
191+
index: '',
192+
disjunctiveFacets: ['anAttrName'],
193+
numericRefinements: {
194+
anAttrName: {
195+
'<=': [5],
196+
'>=': [4],
197+
},
198+
},
199+
})
200+
);
172201
expect(helper.search).toHaveBeenCalledTimes(1);
173202
});
174203

0 commit comments

Comments
 (0)
Please sign in to comment.