Skip to content

Commit 9ca8369

Browse files
committed
feat(urls): ability to create an URL from a set of params
Fix #372 BREAKING CHANGE: the instantsearch.createURL method is now taking a simple JS object and not a SearchParameter instance anymore.
1 parent 0512662 commit 9ca8369

File tree

4 files changed

+37
-6
lines changed

4 files changed

+37
-6
lines changed

lib/InstantSearch.js

+10-3
Original file line numberDiff line numberDiff line change
@@ -59,9 +59,9 @@ Usage: instantsearch({
5959

6060
if (this.urlSync) {
6161
let syncWidget = urlSyncWidget(this.urlSync);
62-
this.createURL = syncWidget.createURL.bind(syncWidget);
62+
this._createURL = syncWidget.createURL.bind(syncWidget);
6363
this.widgets.push(syncWidget);
64-
} else this.createURL = defaultCreateURL;
64+
} else this._createURL = defaultCreateURL;
6565

6666
this.searchParameters = this.widgets.reduce(enhanceConfiguration, this.searchParameters);
6767

@@ -79,6 +79,13 @@ Usage: instantsearch({
7979
helper.search();
8080
}
8181

82+
createURL(params) {
83+
if (!this._createURL) {
84+
throw new Error('You need to call start() before calling createURL()');
85+
}
86+
return this._createURL(this.helper.state.setQueryParameters(params));
87+
}
88+
8289
_render(helper, results, state) {
8390
forEach(this.widgets, function(widget) {
8491
if (!widget.render) {
@@ -89,7 +96,7 @@ Usage: instantsearch({
8996
results,
9097
state,
9198
helper,
92-
createURL: this.createURL
99+
createURL: this._createURL
93100
});
94101
}, this);
95102
this.emit('render');

lib/__tests__/InstantSearch-test.js

+15-3
Original file line numberDiff line numberDiff line change
@@ -4,10 +4,14 @@ import EventEmitter from 'events';
44
import expect from 'expect';
55
import range from 'lodash/utility/range';
66
import sinon from 'sinon';
7+
import jsdom from 'mocha-jsdom';
78

9+
import SearchParameters from 'algoliasearch-helper/src/SearchParameters';
810
import InstantSearch from '../InstantSearch';
911

1012
describe('InstantSearch lifecycle', () => {
13+
jsdom({useEach: true});
14+
1115
var algoliasearch;
1216
var algoliasearchHelper;
1317
var client;
@@ -23,7 +27,10 @@ describe('InstantSearch lifecycle', () => {
2327
helper = new EventEmitter();
2428

2529
helper.search = sinon.spy();
26-
helper.state = 'state';
30+
helper.getState = sinon.stub().returns({});
31+
helper.state = {
32+
setQueryParameters: function(params) { return new SearchParameters(params); }
33+
};
2734

2835
algoliasearch = sinon.stub().returns(client);
2936
algoliasearchHelper = sinon.stub().returns(helper);
@@ -41,7 +48,8 @@ describe('InstantSearch lifecycle', () => {
4148
appId: appId,
4249
apiKey: apiKey,
4350
indexName: indexName,
44-
searchParameters: searchParameters
51+
searchParameters: searchParameters,
52+
urlSync: {}
4553
});
4654
});
4755

@@ -122,7 +130,7 @@ describe('InstantSearch lifecycle', () => {
122130
expect(widget.render.calledOnce).toBe(true, 'widget.render called once');
123131
expect(widget.render.args[0])
124132
.toEqual([{
125-
createURL: search.createURL,
133+
createURL: search._createURL,
126134
results,
127135
state: helper.state,
128136
helper,
@@ -180,6 +188,10 @@ describe('InstantSearch lifecycle', () => {
180188
search.start();
181189
});
182190

191+
it('creates a URL', () => {
192+
expect(search.createURL({hitsPerPage: 42})).toEqual('?q=&hPP=42&idx=&p=0');
193+
});
194+
183195
it('emits render when all render are done (using on)', () => {
184196
var onRender = sinon.spy();
185197
search.on('render', onRender);

lib/__tests__/main-test.js

+9
Original file line numberDiff line numberDiff line change
@@ -18,6 +18,15 @@ describe('instantsearch()', () => {
1818
expect(instantsearch.version).toEqual(pkg.version);
1919
});
2020

21+
it('statically creates a URL', () => {
22+
expect(instantsearch.createQueryString({hitsPerPage: 42})).toEqual('hPP=42');
23+
});
24+
25+
it('statically creates a complex URL', () => {
26+
expect(instantsearch.createQueryString({hitsPerPage: 42, facetsRefinements: {category: 'Home'}}))
27+
.toEqual('hPP=42&fR[category]=Home');
28+
});
29+
2130
it('includes the widget functions', () => {
2231
var forEach = require('lodash/collection/forEach');
2332
forEach(instantsearch.widgets, function(widget) {

lib/main.js

+3
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,7 @@ var toFactory = require('to-factory');
55

66
var InstantSearch = require('./InstantSearch');
77
var instantsearch = toFactory(InstantSearch);
8+
var algoliasearchHelper = require('algoliasearch-helper');
89

910
instantsearch.widgets = {
1011
hierarchicalMenu: require('../widgets/hierarchical-menu/hierarchical-menu.js'),
@@ -23,4 +24,6 @@ instantsearch.widgets = {
2324

2425
instantsearch.version = require('./version.js');
2526

27+
instantsearch.createQueryString = algoliasearchHelper.url.getQueryStringFromState;
28+
2629
module.exports = instantsearch;

0 commit comments

Comments
 (0)