From f1bed8dd6973859b4e4c8f493648dc9f78e3b569 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?S=C3=A9bastien=20Lorber?= Date: Mon, 23 Nov 2020 19:43:38 +0100 Subject: [PATCH] fix(v2): Algolia: allow contextualSearch + facetFilters (#3804) * remove contextualSearch facetFilters merging security * update doc --- .../src/__tests__/validateThemeConfig.test.js | 16 ---------------- .../src/theme/SearchBar/index.js | 14 +++++++++++--- .../hooks/useAlgoliaContextualFacetFilters.js} | 6 +++--- .../src/validateThemeConfig.js | 14 +------------- website/docs/search.md | 2 +- 5 files changed, 16 insertions(+), 36 deletions(-) rename packages/docusaurus-theme-search-algolia/src/{utils/algoliaSearchUtils.js => theme/hooks/useAlgoliaContextualFacetFilters.js} (70%) diff --git a/packages/docusaurus-theme-search-algolia/src/__tests__/validateThemeConfig.test.js b/packages/docusaurus-theme-search-algolia/src/__tests__/validateThemeConfig.test.js index f9b53c5f2e..f6df87f5a1 100644 --- a/packages/docusaurus-theme-search-algolia/src/__tests__/validateThemeConfig.test.js +++ b/packages/docusaurus-theme-search-algolia/src/__tests__/validateThemeConfig.test.js @@ -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"`, - ); - }); }); diff --git a/packages/docusaurus-theme-search-algolia/src/theme/SearchBar/index.js b/packages/docusaurus-theme-search-algolia/src/theme/SearchBar/index.js index 010360216e..d0f2d0b585 100644 --- a/packages/docusaurus-theme-search-algolia/src/theme/SearchBar/index.js +++ b/packages/docusaurus-theme-search-algolia/src/theme/SearchBar/index.js @@ -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(); diff --git a/packages/docusaurus-theme-search-algolia/src/utils/algoliaSearchUtils.js b/packages/docusaurus-theme-search-algolia/src/theme/hooks/useAlgoliaContextualFacetFilters.js similarity index 70% rename from packages/docusaurus-theme-search-algolia/src/utils/algoliaSearchUtils.js rename to packages/docusaurus-theme-search-algolia/src/theme/hooks/useAlgoliaContextualFacetFilters.js index 45c0fb19ba..604f4ff46f 100644 --- a/packages/docusaurus-theme-search-algolia/src/utils/algoliaSearchUtils.js +++ b/packages/docusaurus-theme-search-algolia/src/theme/hooks/useAlgoliaContextualFacetFilters.js @@ -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]; } diff --git a/packages/docusaurus-theme-search-algolia/src/validateThemeConfig.js b/packages/docusaurus-theme-search-algolia/src/validateThemeConfig.js index 1ea99a34c3..951f745853 100644 --- a/packages/docusaurus-theme-search-algolia/src/validateThemeConfig.js +++ b/packages/docusaurus-theme-search-algolia/src/validateThemeConfig.js @@ -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); }; diff --git a/website/docs/search.md b/website/docs/search.md index d3334f8943..527002cfe7 100644 --- a/website/docs/search.md +++ b/website/docs/search.md @@ -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`. :::