mirror of
https://github.com/facebook/docusaurus.git
synced 2025-06-17 02:02:38 +02:00
fix(v2): Algolia: allow contextualSearch + facetFilters (#3804)
* remove contextualSearch facetFilters merging security * update doc
This commit is contained in:
parent
b6cd303354
commit
f1bed8dd69
5 changed files with 16 additions and 36 deletions
|
@ -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"`,
|
|
||||||
);
|
|
||||||
});
|
|
||||||
});
|
});
|
||||||
|
|
|
@ -14,7 +14,7 @@ import Link from '@docusaurus/Link';
|
||||||
import Head from '@docusaurus/Head';
|
import Head from '@docusaurus/Head';
|
||||||
import useSearchQuery from '@theme/hooks/useSearchQuery';
|
import useSearchQuery from '@theme/hooks/useSearchQuery';
|
||||||
import {DocSearchButton, useDocSearchKeyboardEvents} from '@docsearch/react';
|
import {DocSearchButton, useDocSearchKeyboardEvents} from '@docsearch/react';
|
||||||
import {useAlgoliaContextualSearchParameters} from '../../utils/algoliaSearchUtils';
|
import useAlgoliaContextualFacetFilters from '@theme/hooks/useAlgoliaContextualFacetFilters';
|
||||||
|
|
||||||
let DocSearchModal = null;
|
let DocSearchModal = null;
|
||||||
|
|
||||||
|
@ -35,12 +35,20 @@ function ResultsFooter({state, onClose}) {
|
||||||
function DocSearch({contextualSearch, ...props}) {
|
function DocSearch({contextualSearch, ...props}) {
|
||||||
const {siteMetadata} = useDocusaurusContext();
|
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
|
// we let user override default searchParameters if he wants to
|
||||||
const searchParameters = {
|
const searchParameters = {
|
||||||
...(contextualSearch ? contextualSearchParameters : {}),
|
|
||||||
...props.searchParameters,
|
...props.searchParameters,
|
||||||
|
facetFilters,
|
||||||
};
|
};
|
||||||
|
|
||||||
const {withBaseUrl} = useBaseUrlUtils();
|
const {withBaseUrl} = useBaseUrlUtils();
|
||||||
|
|
|
@ -7,13 +7,13 @@
|
||||||
|
|
||||||
import useContextualSearchFilters from '@theme/hooks/useContextualSearchFilters';
|
import useContextualSearchFilters from '@theme/hooks/useContextualSearchFilters';
|
||||||
|
|
||||||
// Translate search-engine agnostic seach filters to Algolia search filters
|
// Translate search-engine agnostic search filters to Algolia search filters
|
||||||
export function useAlgoliaContextualSearchParameters() {
|
export default function useAlgoliaContextualFacetFilters() {
|
||||||
const {language, tags} = useContextualSearchFilters();
|
const {language, tags} = useContextualSearchFilters();
|
||||||
|
|
||||||
const languageFilter = `language:${language}`;
|
const languageFilter = `language:${language}`;
|
||||||
|
|
||||||
const tagsFilter = tags.map((tag) => `docusaurus_tag:${tag}`);
|
const tagsFilter = tags.map((tag) => `docusaurus_tag:${tag}`);
|
||||||
|
|
||||||
return {facetFilters: [languageFilter, tagsFilter]};
|
return [languageFilter, tagsFilter];
|
||||||
}
|
}
|
|
@ -41,17 +41,5 @@ exports.validateThemeConfig = function validateThemeConfig({
|
||||||
validate,
|
validate,
|
||||||
themeConfig,
|
themeConfig,
|
||||||
}) {
|
}) {
|
||||||
const normalizedThemeConfig = validate(Schema, themeConfig);
|
return 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;
|
|
||||||
};
|
};
|
||||||
|
|
|
@ -74,7 +74,7 @@ module.exports = {
|
||||||
|
|
||||||
:::caution
|
:::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`.
|
||||||
|
|
||||||
:::
|
:::
|
||||||
|
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue