Skip to content

Commit

Permalink
feat(core/lifecycle-event): emits render when render
Browse files Browse the repository at this point in the history
When all the widgets are finished rendering for each search response.
  • Loading branch information
Alexandre Stanislawski committed Oct 12, 2015
1 parent 200a7fe commit 7f03ae9
Show file tree
Hide file tree
Showing 6 changed files with 73 additions and 2 deletions.
4 changes: 4 additions & 0 deletions example/app.js
Original file line number Diff line number Diff line change
Expand Up @@ -159,4 +159,8 @@ search.addWidget(
})
);

search.once('render', function() {
document.querySelector('.search').className = 'row search search--visible';
});

search.start();
2 changes: 1 addition & 1 deletion example/index.html
Original file line number Diff line number Diff line change
Expand Up @@ -17,7 +17,7 @@
<h1>Instant search demo <small>using instantsearch.js</small></h1>
</div>

<div class="row">
<div class="row search search--hidden">
<div class="col-md-3">
<div class="panel panel-default" id="categories"></div>

Expand Down
12 changes: 12 additions & 0 deletions example/style.css
Original file line number Diff line number Diff line change
Expand Up @@ -8,6 +8,18 @@ body {
padding: 2em 0;
}

.search {
transition: opacity 200ms;
}

.search--hidden {
opacity: 0;
}

.search--visible {

}

/* Hits widget */
.hit + .hit {
margin-top: 1em;
Expand Down
6 changes: 5 additions & 1 deletion lib/InstantSearch.js
Original file line number Diff line number Diff line change
Expand Up @@ -5,14 +5,17 @@ var forEach = require('lodash/collection/forEach');
var merge = require('lodash/object/merge');
var union = require('lodash/array/union');

class InstantSearch {
var EventEmitter = require('events').EventEmitter;

class InstantSearch extends EventEmitter {
constructor({
appId = null,
apiKey = null,
indexName = null,
numberLocale = 'en-EN',
searchParameters = {}
}) {
super();
if (appId === null || apiKey === null || indexName === null) {
var usage = `
Usage: instantsearch({
Expand Down Expand Up @@ -92,6 +95,7 @@ Usage: instantsearch({
helper
});
}, this);
this.emit('render');
}

_init(state, helper) {
Expand Down
50 changes: 50 additions & 0 deletions lib/__tests__/InstantSearch-test.js
Original file line number Diff line number Diff line change
Expand Up @@ -176,4 +176,54 @@ describe('InstantSearch lifecycle', () => {
expect(algoliasearchHelper.args[0][2].values).toEqual([-2, -1, 0, 1, 3, 4, 2]);
});
});

context('when render happens', () => {
var render = sinon.spy();
beforeEach(() => {
render.reset();
var widgets = range(5).map(() => { return {render}; });

widgets.forEach(search.addWidget, search);

search.start();
});

it('emits render when all render are done (using on)', () => {
var onRender = sinon.spy();
search.on('render', onRender);

expect(render.callCount).toEqual(0);
expect(onRender.callCount).toEqual(0);

helper.emit('result', {}, helper.state);

expect(render.callCount).toEqual(5);
expect(onRender.callCount).toEqual(1);
expect(render.calledBefore(onRender)).toBe(true);

helper.emit('result', {}, helper.state);

expect(render.callCount).toEqual(10);
expect(onRender.callCount).toEqual(2);
});

it('emits render when all render are done (using once)', () => {
var onRender = sinon.spy();
search.once('render', onRender);

expect(render.callCount).toEqual(0);
expect(onRender.callCount).toEqual(0);

helper.emit('result', {}, helper.state);

expect(render.callCount).toEqual(5);
expect(onRender.callCount).toEqual(1);
expect(render.calledBefore(onRender)).toBe(true);

helper.emit('result', {}, helper.state);

expect(render.callCount).toEqual(10);
expect(onRender.callCount).toEqual(1);
});
});
});
1 change: 1 addition & 0 deletions package.json
Original file line number Diff line number Diff line change
Expand Up @@ -61,6 +61,7 @@
"algoliasearch": "^3.8.0",
"algoliasearch-helper": "^2.5.0",
"classnames": "^2.1.5",
"events": "^1.1.0",
"hogan.js": "^3.0.2",
"lodash": "^3.10.1",
"react": "^0.14.0",
Expand Down

0 comments on commit 7f03ae9

Please sign in to comment.