11import React from 'react' ;
22import ReactDOM from 'react-dom' ;
33import cx from 'classnames' ;
4- import { filter } from 'lodash' ;
4+ import filter from 'lodash/filter ' ;
55
66import RefinementList from '../../components/RefinementList/RefinementList.js' ;
77import connectRefinementList from '../../connectors/refinement-list/connectRefinementList.js' ;
8+ import defaultTemplates from './defaultTemplates.js' ;
9+ import getShowMoreConfig from '../../lib/show-more/getShowMoreConfig.js' ;
10+
811import {
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
1718const 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+
1877const usage = `Usage:
1978refinementList({
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