Skip to content

Commit 44dab44

Browse files
authoredJun 11, 2021
feat(dynamicWidgets): add default attributesToRender & transformItems (#4776)
* feat(dynamicWidgets): add default attributesToRender & transformItems * update tests * write a new couple of tests * update dependencies * suppress ts error * remove superfluous tests
1 parent fba665d commit 44dab44

File tree

6 files changed

+213
-183
lines changed

6 files changed

+213
-183
lines changed
 

‎package.json

+3-3
Original file line numberDiff line numberDiff line change
@@ -55,7 +55,7 @@
5555
"dependencies": {
5656
"@types/googlemaps": "^3.39.6",
5757
"@types/hogan.js": "^3.0.0",
58-
"algoliasearch-helper": "^3.4.4",
58+
"algoliasearch-helper": "^3.4.5",
5959
"classnames": "^2.2.5",
6060
"events": "^1.1.0",
6161
"hogan.js": "^3.0.2",
@@ -64,7 +64,7 @@
6464
"qs": "^6.5.1"
6565
},
6666
"devDependencies": {
67-
"@algolia/client-search": "4.8.6",
67+
"@algolia/client-search": "4.9.2",
6868
"@babel/cli": "7.8.4",
6969
"@babel/core": "7.9.6",
7070
"@babel/plugin-proposal-class-properties": "7.8.3",
@@ -94,7 +94,7 @@
9494
"@wdio/selenium-standalone-service": "5.16.5",
9595
"@wdio/spec-reporter": "5.16.5",
9696
"@wdio/static-server-service": "5.16.5",
97-
"algoliasearch": "4.8.6",
97+
"algoliasearch": "4.9.2",
9898
"algoliasearch-v3": "npm:algoliasearch@3.35.1",
9999
"babel-eslint": "10.0.3",
100100
"babel-jest": "26.6.3",

‎src/connectors/dynamic-widgets/__tests__/connectDynamicWidgets-test.ts

+72-25
Original file line numberDiff line numberDiff line change
@@ -8,8 +8,12 @@ import {
88
} from '../../../../test/mock/createWidget';
99
import { wait } from '../../../../test/utils/wait';
1010
import { SearchParameters, SearchResults } from 'algoliasearch-helper';
11-
import { createMultiSearchResponse } from '../../../../test/mock/createAPIResponse';
11+
import {
12+
createMultiSearchResponse,
13+
createSingleSearchResponse,
14+
} from '../../../../test/mock/createAPIResponse';
1215
import connectHierarchicalMenu from '../../hierarchical-menu/connectHierarchicalMenu';
16+
import { DynamicWidgetsConnectorParams } from '../connectDynamicWidgets';
1317

1418
expect.addSnapshotSerializer(widgetSnapshotSerializer);
1519

@@ -38,30 +42,6 @@ describe('connectDynamicWidgets', () => {
3842
See documentation: https://www.algolia.com/doc/api-reference/widgets/dynamic-widgets/js/#connector"
3943
`);
4044
});
41-
42-
it('correct usage', () => {
43-
expect(() =>
44-
// @ts-expect-error
45-
EXPERIMENTAL_connectDynamicWidgets(() => {})({
46-
widgets: [],
47-
})
48-
).toThrowErrorMatchingInlineSnapshot(`
49-
"the \`transformItems\` option is required to be a function.
50-
51-
See documentation: https://www.algolia.com/doc/api-reference/widgets/dynamic-widgets/js/#connector"
52-
`);
53-
});
54-
55-
it('transformItems', () => {
56-
expect(() =>
57-
EXPERIMENTAL_connectDynamicWidgets(() => {})({
58-
widgets: [],
59-
transformItems(items, { results }) {
60-
return items.map(item => item + results.nbHits);
61-
},
62-
})
63-
).not.toThrow();
64-
});
6545
});
6646

6747
describe('init', () => {
@@ -552,6 +532,37 @@ describe('connectDynamicWidgets', () => {
552532
});
553533
});
554534

535+
it('returns widgetParams and attributesToRender (with results)', () => {
536+
const widgetParams = {
537+
widgets: [
538+
connectMenu(() => {})({ attribute: 'test1' }),
539+
connectHierarchicalMenu(() => {})({ attributes: ['test2', 'test3'] }),
540+
],
541+
};
542+
const dynamicWidgets = EXPERIMENTAL_connectDynamicWidgets(() => {})(
543+
widgetParams
544+
);
545+
546+
expect(
547+
dynamicWidgets.getWidgetRenderState(
548+
createRenderOptions({
549+
results: new SearchResults(new SearchParameters(), [
550+
createSingleSearchResponse({
551+
renderingContent: {
552+
facetOrdering: {
553+
facet: { order: ['test1', 'test2'] },
554+
},
555+
},
556+
}),
557+
]),
558+
})
559+
)
560+
).toEqual({
561+
attributesToRender: ['test1', 'test2'],
562+
widgetParams,
563+
});
564+
});
565+
555566
it('returns widgetParams and the result of transformItems render', () => {
556567
const widgetParams = {
557568
transformItems() {
@@ -573,6 +584,42 @@ describe('connectDynamicWidgets', () => {
573584
widgetParams,
574585
});
575586
});
587+
588+
it('returns widgetParams and the result of transformItems render (using result)', () => {
589+
const widgetParams: DynamicWidgetsConnectorParams = {
590+
transformItems(items) {
591+
return items.sort((a, b) => b.localeCompare(a));
592+
},
593+
widgets: [
594+
connectMenu(() => {})({ attribute: 'test1' }),
595+
connectHierarchicalMenu(() => {})({ attributes: ['test2', 'test3'] }),
596+
],
597+
};
598+
const dynamicWidgets = EXPERIMENTAL_connectDynamicWidgets(() => {})(
599+
widgetParams
600+
);
601+
602+
expect(
603+
dynamicWidgets.getWidgetRenderState(
604+
createRenderOptions(
605+
createRenderOptions({
606+
results: new SearchResults(new SearchParameters(), [
607+
createSingleSearchResponse({
608+
renderingContent: {
609+
facetOrdering: {
610+
facet: { order: ['test1', 'test2'] },
611+
},
612+
},
613+
}),
614+
]),
615+
})
616+
)
617+
)
618+
).toEqual({
619+
attributesToRender: ['test2', 'test1'],
620+
widgetParams,
621+
});
622+
});
576623
});
577624

578625
describe('getRenderState', () => {

‎src/connectors/dynamic-widgets/connectDynamicWidgets.ts

+8-13
Original file line numberDiff line numberDiff line change
@@ -18,7 +18,7 @@ export type DynamicWidgetsRenderState = {
1818

1919
export type DynamicWidgetsConnectorParams = {
2020
widgets: Widget[];
21-
transformItems(
21+
transformItems?(
2222
items: string[],
2323
metadata: { results: SearchResults }
2424
): string[];
@@ -44,7 +44,7 @@ const connectDynamicWidgets: DynamicWidgetsConnector = function connectDynamicWi
4444
checkRendering(renderFn, withUsage());
4545

4646
return widgetParams => {
47-
const { widgets, transformItems } = widgetParams;
47+
const { widgets, transformItems = items => items } = widgetParams;
4848

4949
if (
5050
!widgets ||
@@ -56,13 +56,6 @@ const connectDynamicWidgets: DynamicWidgetsConnector = function connectDynamicWi
5656
);
5757
}
5858

59-
// @TODO once the attributes are computed from the results, make this optional
60-
if (typeof transformItems !== 'function') {
61-
throw new Error(
62-
withUsage('the `transformItems` option is required to be a function.')
63-
);
64-
}
65-
6659
if (
6760
!widgets ||
6861
!Array.isArray(widgets) ||
@@ -157,11 +150,13 @@ const connectDynamicWidgets: DynamicWidgetsConnector = function connectDynamicWi
157150
return { attributesToRender: [], widgetParams };
158151
}
159152

160-
// @TODO: retrieve the facet order out of the results:
161-
// results.renderContext.facetOrder.map(facet => facet.attribute)
162-
const attributesToRender = transformItems([], { results });
153+
const attributesToRender =
154+
results.renderingContent?.facetOrdering?.facet?.order ?? [];
163155

164-
return { attributesToRender, widgetParams };
156+
return {
157+
attributesToRender: transformItems(attributesToRender, { results }),
158+
widgetParams,
159+
};
165160
},
166161
};
167162
};

‎src/widgets/dynamic-widgets/__tests__/dynamic-widgets-test.ts

+1-15
Original file line numberDiff line numberDiff line change
@@ -51,21 +51,7 @@ describe('dynamicWidgets()', () => {
5151
`);
5252
});
5353

54-
test('transformItems is required', () => {
55-
expect(() =>
56-
// @ts-expect-error
57-
EXPERIMENTAL_dynamicWidgets({
58-
container: document.createElement('div'),
59-
widgets: [],
60-
})
61-
).toThrowErrorMatchingInlineSnapshot(`
62-
"the \`transformItems\` option is required to be a function.
63-
64-
See documentation: https://www.algolia.com/doc/api-reference/widgets/dynamic-widgets/js/#connector"
65-
`);
66-
});
67-
68-
test('correct usage', () => {
54+
test('all options', () => {
6955
expect(() =>
7056
EXPERIMENTAL_dynamicWidgets({
7157
container: document.createElement('div'),

‎tsconfig.v3.json

+3-1
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,8 @@
1111
"src/middlewares/__tests__/createInsightsMiddleware.ts",
1212
"test/mock/createInsightsClient.ts",
1313
// v3 has a wrong definition for optionalWords (only accepts string[])
14-
"src/connectors/voice-search/__tests__/connectVoiceSearch-test.ts"
14+
"src/connectors/voice-search/__tests__/connectVoiceSearch-test.ts",
15+
// v3 does not have renderingContent (only errors in the test)
16+
"src/connectors/dynamic-widgets/__tests__/connectDynamicWidgets-test.ts"
1517
]
1618
}

0 commit comments

Comments
 (0)
Please sign in to comment.