Skip to content

Commit 55f53d1

Browse files
authored
fix(render): pass renderer.render to default render function (#940)
1 parent 8b737cb commit 55f53d1

File tree

8 files changed

+100
-54
lines changed

8 files changed

+100
-54
lines changed

examples/react-instantsearch-hooks/src/components/Autocomplete.tsx

Lines changed: 2 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -1,10 +1,9 @@
11
import type { SearchClient } from 'algoliasearch/lite';
22
import type { BaseItem } from '@algolia/autocomplete-core';
3-
import type { AutocompleteOptions } from '@algolia/autocomplete-js';
3+
import type { AutocompleteOptions, Render } from '@algolia/autocomplete-js';
44

55
import {
66
createElement,
7-
ReactElement,
87
Fragment,
98
useEffect,
109
useMemo,
@@ -228,13 +227,7 @@ export function Autocomplete({
228227
});
229228
}
230229
},
231-
renderer: {
232-
createElement,
233-
Fragment,
234-
},
235-
render({ children }, root) {
236-
render(children as ReactElement, root);
237-
},
230+
renderer: { createElement, Fragment, render: render as Render },
238231
});
239232

240233
return () => autocompleteInstance.destroy();

examples/react-instantsearch/src/Autocomplete.js

Lines changed: 1 addition & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -14,10 +14,7 @@ export function Autocomplete(props) {
1414

1515
const search = autocomplete({
1616
container: containerRef.current,
17-
renderer: { createElement, Fragment },
18-
render({ children }, root) {
19-
render(children, root);
20-
},
17+
renderer: { createElement, Fragment, render },
2118
...props,
2219
});
2320

examples/vue-instantsearch/src/Autocomplete.vue

Lines changed: 1 addition & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -244,9 +244,7 @@ export default {
244244
renderer: {
245245
createElement,
246246
Fragment,
247-
},
248-
render({ children }, root) {
249-
render(children, root);
247+
render,
250248
},
251249
});
252250
},

examples/vue/src/App.vue

Lines changed: 1 addition & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -53,9 +53,7 @@ export default {
5353
renderer: {
5454
createElement,
5555
Fragment,
56-
},
57-
render({ children }, root) {
58-
render(children, root);
56+
render,
5957
},
6058
});
6159
});

packages/autocomplete-js/src/__tests__/renderer.test.ts

Lines changed: 91 additions & 31 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,5 @@
11
import { warnCache } from '@algolia/autocomplete-shared';
2+
import { fireEvent, waitFor } from '@testing-library/dom';
23
import {
34
createElement as preactCreateElement,
45
Fragment as PreactFragment,
@@ -17,6 +18,8 @@ describe('renderer', () => {
1718
});
1819

1920
test('defaults to the Preact implementation', () => {
21+
expect.assertions(3);
22+
2023
const container = document.createElement('div');
2124
const panelContainer = document.createElement('div');
2225

@@ -47,19 +50,14 @@ describe('renderer', () => {
4750
expect(Fragment).toBe(PreactFragment);
4851
expect(render).toBe(preactRender);
4952

50-
render(createElement(Fragment, null, 'testSource'), root);
51-
},
52-
renderNoResults({ createElement, Fragment, render }, root) {
53-
expect(createElement).toBe(preactCreateElement);
54-
expect(Fragment).toBe(PreactFragment);
55-
expect(render).toBe(preactRender);
56-
5753
render(createElement(Fragment, null, 'testSource'), root);
5854
},
5955
});
6056
});
6157

6258
test('accepts a custom renderer', () => {
59+
expect.assertions(6);
60+
6361
const container = document.createElement('div');
6462
const panelContainer = document.createElement('div');
6563
const CustomFragment = (props: any) => props.children;
@@ -106,26 +104,6 @@ describe('renderer', () => {
106104
expect.any(Object)
107105
);
108106
},
109-
renderNoResults(
110-
{ children, createElement, Fragment, render, html },
111-
root
112-
) {
113-
expect(createElement).toBe(mockCreateElement);
114-
expect(Fragment).toBe(CustomFragment);
115-
expect(render).toBe(mockRender);
116-
expect(mockCreateElement).toHaveBeenCalled();
117-
118-
mockCreateElement.mockClear();
119-
120-
render(html`<div>${children}</div>`, root);
121-
122-
expect(mockCreateElement).toHaveBeenCalledTimes(1);
123-
expect(mockCreateElement).toHaveBeenLastCalledWith(
124-
'div',
125-
null,
126-
expect.any(Object)
127-
);
128-
},
129107
renderer: {
130108
createElement: mockCreateElement,
131109
Fragment: CustomFragment,
@@ -135,6 +113,8 @@ describe('renderer', () => {
135113
});
136114

137115
test('defaults `render` when not specified in the renderer', () => {
116+
expect.assertions(1);
117+
138118
const container = document.createElement('div');
139119
const panelContainer = document.createElement('div');
140120
const CustomFragment = (props: any) => props.children;
@@ -168,16 +148,96 @@ describe('renderer', () => {
168148

169149
preactRender(createElement(Fragment, null, 'testSource'), root);
170150
},
171-
renderNoResults({ createElement, Fragment, render }, root) {
172-
expect(render).toBe(preactRender);
151+
renderer: {
152+
createElement: mockCreateElement,
153+
Fragment: CustomFragment,
154+
},
155+
});
156+
});
173157

174-
preactRender(createElement(Fragment, null, 'testSource'), root);
158+
test('uses a custom `render` via `renderer`', async () => {
159+
const container = document.createElement('div');
160+
const panelContainer = document.createElement('div');
161+
162+
document.body.appendChild(panelContainer);
163+
164+
const CustomFragment = (props: any) => props.children;
165+
const mockCreateElement = jest.fn(preactCreateElement);
166+
const mockRender = jest.fn().mockImplementation(preactRender);
167+
168+
autocomplete<{ label: string }>({
169+
container,
170+
panelContainer,
171+
id: 'autocomplete-0',
172+
getSources() {
173+
return [
174+
{
175+
sourceId: 'testSource',
176+
getItems() {
177+
return [{ label: '1' }];
178+
},
179+
templates: {
180+
item({ item }) {
181+
return item.label;
182+
},
183+
},
184+
},
185+
];
175186
},
176187
renderer: {
177-
createElement: mockCreateElement,
178188
Fragment: CustomFragment,
189+
render: mockRender,
190+
createElement: mockCreateElement,
179191
},
180192
});
193+
194+
const input = container.querySelector<HTMLInputElement>('.aa-Input');
195+
196+
fireEvent.input(input, { target: { value: 'apple' } });
197+
198+
await waitFor(() => {
199+
expect(
200+
panelContainer.querySelector<HTMLElement>('.aa-Panel')
201+
).toBeInTheDocument();
202+
expect(mockRender).toHaveBeenCalled();
203+
expect(panelContainer).toMatchInlineSnapshot(`
204+
<div>
205+
<div
206+
class="aa-Panel"
207+
data-testid="panel"
208+
style="top: 0px; left: 0px; right: 0px; max-width: unset;"
209+
>
210+
<div
211+
class="aa-PanelLayout aa-Panel--scrollable"
212+
>
213+
<section
214+
class="aa-Source"
215+
data-autocomplete-source-id="testSource"
216+
>
217+
<ul
218+
aria-labelledby="autocomplete-0-label"
219+
class="aa-List"
220+
id="autocomplete-0-list"
221+
role="listbox"
222+
>
223+
<li
224+
aria-selected="false"
225+
class="aa-Item"
226+
id="autocomplete-0-item-0"
227+
role="option"
228+
>
229+
1
230+
</li>
231+
</ul>
232+
</section>
233+
</div>
234+
<div
235+
class="aa-GradientBottom"
236+
/>
237+
</div>
238+
</div>
239+
`);
240+
});
181241
});
182242

183243
test('warns about renderer mismatch when specifying an incomplete renderer', () => {

packages/autocomplete-js/src/getDefaultOptions.ts

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -54,11 +54,11 @@ const defaultClassNames: AutocompleteClassNames = {
5454
submitButton: 'aa-SubmitButton',
5555
};
5656

57-
const defaultRender: AutocompleteRender<any> = ({ children }, root) => {
57+
const defaultRender: AutocompleteRender<any> = ({ children, render }, root) => {
5858
render(children, root);
5959
};
6060

61-
const defaultRenderer: AutocompleteRenderer = {
61+
const defaultRenderer: Required<AutocompleteRenderer> = {
6262
createElement: preactCreateElement,
6363
Fragment: PreactFragment,
6464
render,

packages/autocomplete-js/src/render.tsx

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -27,7 +27,7 @@ type RenderProps<TItem extends BaseItem> = {
2727
panelContainer: HTMLElement;
2828
propGetters: AutocompletePropGetters<TItem>;
2929
state: AutocompleteState<TItem>;
30-
renderer: AutocompleteRenderer;
30+
renderer: Required<AutocompleteRenderer>;
3131
};
3232

3333
export function renderSearchBox<TItem extends BaseItem>({

packages/autocomplete-js/src/types/AutocompleteRender.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -20,7 +20,7 @@ export type AutocompleteRender<TItem extends BaseItem> = (
2020
createElement: Pragma;
2121
Fragment: PragmaFrag;
2222
html: HTMLTemplate;
23-
render?: Render;
23+
render: Render;
2424
},
2525
root: HTMLElement
2626
) => void;

0 commit comments

Comments
 (0)