fix(v2): Algolia: allow contextualSearch + facetFilters (#3804)

* remove contextualSearch facetFilters  merging security

* update doc
This commit is contained in:
Sébastien Lorber 2020-11-23 19:43:38 +01:00 committed by GitHub
parent b6cd303354
commit f1bed8dd69
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
5 changed files with 16 additions and 36 deletions

View file

@ -118,20 +118,4 @@ describe('validateThemeConfig', () => {
},
});
});
test('contextualSearch + searchParameters.facetFilters config', () => {
const algolia = {
indexName: 'index',
apiKey: 'apiKey',
contextualSearch: true,
searchParameters: {
facetFilters: ['version:1.0'],
},
};
expect(() =>
testValidateThemeConfig({algolia}),
).toThrowErrorMatchingInlineSnapshot(
`"If you are using algolia.contextualSearch: true, you should not provide algolia.searchParameters.facetFilters, as it is computed for you dynamically"`,
);
});
});

View file

@ -14,7 +14,7 @@ import Link from '@docusaurus/Link';
import Head from '@docusaurus/Head';
import useSearchQuery from '@theme/hooks/useSearchQuery';
import {DocSearchButton, useDocSearchKeyboardEvents} from '@docsearch/react';
import {useAlgoliaContextualSearchParameters} from '../../utils/algoliaSearchUtils';
import useAlgoliaContextualFacetFilters from '@theme/hooks/useAlgoliaContextualFacetFilters';
let DocSearchModal = null;
@ -35,12 +35,20 @@ function ResultsFooter({state, onClose}) {
function DocSearch({contextualSearch, ...props}) {
const {siteMetadata} = useDocusaurusContext();
const contextualSearchParameters = useAlgoliaContextualSearchParameters();
const contextualSearchFacetFilters = useAlgoliaContextualFacetFilters();
const configFacetFilters = props.searchParameters?.facetFilters ?? [];
const facetFilters = contextualSearch
? // Merge contextual search filters with config filters
[...contextualSearchFacetFilters, ...configFacetFilters]
: // ... or use config facetFilters
configFacetFilters;
// we let user override default searchParameters if he wants to
const searchParameters = {
...(contextualSearch ? contextualSearchParameters : {}),
...props.searchParameters,
facetFilters,
};
const {withBaseUrl} = useBaseUrlUtils();

View file

@ -7,13 +7,13 @@
import useContextualSearchFilters from '@theme/hooks/useContextualSearchFilters';
// Translate search-engine agnostic seach filters to Algolia search filters
export function useAlgoliaContextualSearchParameters() {
// Translate search-engine agnostic search filters to Algolia search filters
export default function useAlgoliaContextualFacetFilters() {
const {language, tags} = useContextualSearchFilters();
const languageFilter = `language:${language}`;
const tagsFilter = tags.map((tag) => `docusaurus_tag:${tag}`);
return {facetFilters: [languageFilter, tagsFilter]};
return [languageFilter, tagsFilter];
}

View file

@ -41,17 +41,5 @@ exports.validateThemeConfig = function validateThemeConfig({
validate,
themeConfig,
}) {
const normalizedThemeConfig = validate(Schema, themeConfig);
if (
normalizedThemeConfig &&
normalizedThemeConfig.algolia.contextualSearch &&
normalizedThemeConfig.algolia.searchParameters &&
normalizedThemeConfig.algolia.searchParameters.facetFilters
) {
throw new Error(
'If you are using algolia.contextualSearch: true, you should not provide algolia.searchParameters.facetFilters, as it is computed for you dynamically',
);
}
return normalizedThemeConfig;
return validate(Schema, themeConfig);
};

View file

@ -74,7 +74,7 @@ module.exports = {
:::caution
If you decide to use contextual search, you can't provide `algolia.searchParameters.facetFilters`, as we compute this `facetFilters` attribute for you dynamically.
When using `contextualSearch: true`, the contextual facet filters will be merged with the ones provided with `algolia.searchParameters.facetFilters`.
:::