Skip to content

Commit 1c6c3a5

Browse files
committed
feat(connectors): refinement-list widget (iteration2)
1 parent c67bf0b commit 1c6c3a5

File tree

1 file changed

+87
-54
lines changed

1 file changed

+87
-54
lines changed

src/widgets/refinement-list/refinement-list.js

Lines changed: 87 additions & 54 deletions
Original file line numberDiff line numberDiff line change
@@ -1,20 +1,79 @@
11
import React from 'react';
22
import ReactDOM from 'react-dom';
33
import cx from 'classnames';
4-
import {filter} from 'lodash';
4+
import filter from 'lodash/filter';
55

66
import RefinementList from '../../components/RefinementList/RefinementList.js';
77
import connectRefinementList from '../../connectors/refinement-list/connectRefinementList.js';
8+
import defaultTemplates from './defaultTemplates.js';
9+
import getShowMoreConfig from '../../lib/show-more/getShowMoreConfig.js';
10+
811
import {
912
bemHelper,
1013
prepareTemplateProps,
1114
getContainerNode,
1215
prefixKeys,
1316
} from '../../lib/utils.js';
14-
import defaultTemplates from './defaultTemplates.js';
15-
import getShowMoreConfig from '../../lib/show-more/getShowMoreConfig.js';
1617

1718
const bem = bemHelper('ais-refinement-list');
19+
20+
const renderer = ({
21+
containerNode,
22+
cssClasses,
23+
transformData,
24+
templates,
25+
renderState,
26+
collapsible,
27+
limitMax,
28+
limit,
29+
autoHideContainer,
30+
showMoreConfig,
31+
searchForFacetValues,
32+
}) => ({
33+
refine,
34+
items,
35+
createURL,
36+
searchForItems,
37+
isFromSearch,
38+
instantSearchInstance,
39+
canRefine,
40+
}, isFirstRendering) => {
41+
if (isFirstRendering) {
42+
renderState.templateProps = prepareTemplateProps({
43+
transformData,
44+
defaultTemplates,
45+
templatesConfig: instantSearchInstance.templatesConfig,
46+
templates,
47+
});
48+
return;
49+
}
50+
51+
// Pass count of currently selected items to the header template
52+
const headerFooterData = {
53+
header: {refinedFacetsCount: filter(items, {isRefined: true}).length},
54+
};
55+
56+
ReactDOM.render(
57+
<RefinementList
58+
collapsible={collapsible}
59+
createURL={createURL}
60+
cssClasses={cssClasses}
61+
facetValues={items}
62+
headerFooterData={headerFooterData}
63+
limitMax={limitMax}
64+
limitMin={limit}
65+
shouldAutoHideContainer={autoHideContainer && canRefine === false}
66+
showMore={showMoreConfig !== null}
67+
templateProps={renderState.templateProps}
68+
toggleRefinement={refine}
69+
searchFacetValues={searchForFacetValues && searchForItems}
70+
searchPlaceholder={searchForFacetValues.placeholder || 'Search for other...'}
71+
isFromSearch={isFromSearch}
72+
/>,
73+
containerNode
74+
);
75+
};
76+
1877
const usage = `Usage:
1978
refinementList({
2079
container,
@@ -99,6 +158,7 @@ export default function refinementList({
99158
const showMoreTemplates = showMoreConfig ? prefixKeys('show-more-', showMoreConfig.templates) : {};
100159
const searchForValuesTemplates = searchForFacetValues ? searchForFacetValues.templates : {};
101160
const allTemplates = {...templates, ...showMoreTemplates, ...searchForValuesTemplates};
161+
102162
const cssClasses = {
103163
root: cx(bem(null), userCssClasses.root),
104164
header: cx(bem('header'), userCssClasses.header),
@@ -112,56 +172,29 @@ export default function refinementList({
112172
count: cx(bem('count'), userCssClasses.count),
113173
};
114174

115-
let templateProps;
116-
117-
return connectRefinementList(({
118-
refine,
119-
items,
120-
createURL,
121-
searchForItems,
122-
isFromSearch,
123-
instantSearchInstance,
124-
canRefine,
125-
}, isFirstRendering) => {
126-
if (isFirstRendering) {
127-
templateProps = prepareTemplateProps({
128-
transformData,
129-
defaultTemplates,
130-
templatesConfig: instantSearchInstance.templatesConfig,
131-
templates: allTemplates,
132-
});
133-
134-
return;
135-
}
136-
137-
// Pass count of currently selected items to the header template
138-
const headerFooterData = {
139-
header: {refinedFacetsCount: filter(items, {isRefined: true}).length},
140-
};
141-
142-
ReactDOM.render(
143-
<RefinementList
144-
collapsible={collapsible}
145-
createURL={createURL}
146-
cssClasses={cssClasses}
147-
facetValues={items}
148-
headerFooterData={headerFooterData}
149-
limitMax={limitMax}
150-
limitMin={limit}
151-
shouldAutoHideContainer={autoHideContainer && canRefine === false}
152-
showMore={showMoreConfig !== null}
153-
templateProps={templateProps}
154-
toggleRefinement={refine}
155-
searchFacetValues={searchForFacetValues && searchForItems}
156-
searchPlaceholder={searchForFacetValues.placeholder || 'Search for other...'}
157-
isFromSearch={isFromSearch}
158-
/>,
159-
containerNode
160-
);
161-
})({
162-
attributeName,
163-
operator,
164-
limit: limitMax,
165-
sortBy,
175+
const specializedRenderer = renderer({
176+
containerNode,
177+
cssClasses,
178+
transformData,
179+
templates: allTemplates,
180+
renderState: {},
181+
collapsible,
182+
limitMax,
183+
limit,
184+
autoHideContainer,
185+
showMoreConfig,
186+
searchForFacetValues,
166187
});
188+
189+
try {
190+
const makeWidget = connectRefinementList(specializedRenderer);
191+
return makeWidget({
192+
attributeName,
193+
operator,
194+
limit: limitMax,
195+
sortBy,
196+
});
197+
} catch (e) {
198+
throw new Error(e);
199+
}
167200
}

0 commit comments

Comments
 (0)