//connectAutoFiltering.js
// util function to set the query parameter (step 2)
function setAutoFiltering(value, helper) {
return helper.setQueryParameter('extensions', {
queryCategorization: {
enableAutoFiltering: value,
},
});
}
export function connectAutoFiltering(renderFn, unmountFn = () => {}) {
return function autoFiltering(widgetParams) {
const connectorState = {};
return {
$$type: 'algolia.beta.autoFiltering',
init(initOptions) {
const { instantSearchInstance } = initOptions;
renderFn(
{
...this.getWidgetRenderState(initOptions),
instantSearchInstance,
},
true
);
},
render(renderOptions) {
const { instantSearchInstance } = renderOptions;
renderFn(
{
...this.getWidgetRenderState(renderOptions),
instantSearchInstance,
},
false
);
},
dispose() {
unmountFn();
},
getWidgetSearchParameters(searchParameters) {
return searchParameters;
},
getRenderState(renderState, renderOptions) {
return {
...renderState,
autoFiltering: this.getWidgetRenderState(renderOptions),
};
},
// this is where the logic happens
getWidgetRenderState({ results, helper, state }) {
if (!connectorState.cancelAutoFiltering) {
// exposing a function to disable autofiltering
connectorState.cancelAutoFiltering = () => {
// Disable auto filtering for next search
setAutoFiltering(false, helper);
helper.search();
// storing in the state the disabled query
connectorState.disabledQuery = helper.getQuery().query;
};
}
// empty results case
if (!results) {
return {
appliedFilters: [],
cancelAutoFiltering: () => {},
widgetParams,
};
}
// enabling back auto filtering if the query has changed (step 3)
if (
// "state" stores the current query parameters
state.extensions &&
state.extensions.queryCategorization.enableAutoFiltering === false &&
connectorState.disabledQuery &&
results.query !== connectorState.disabledQuery
) {
setAutoFiltering(true, helper);
if (
results.extensions &&
results.extensions.queryCategorization.normalizedQuery
) {
// if the current query has predicted categories, we refine the search with autofiltering enabled
helper.search();
}
}
// Retrieving the applied filters (step 1)
const facetFilters =
(results.extensions &&
results.extensions.queryCategorization.autofiltering &&
results.extensions.queryCategorization.autofiltering
.facetFilters) ||
[];
return {
appliedFilters:
facetFilters.map((facetFilter) => ({
name: facetFilter.split(':')[0],
value: facetFilter.split(':')[1],
})),
cancelAutoFiltering: connectorState.cancelAutoFiltering,
widgetParams,
};
},
};
};
}