import React, { useEffect, useState } from 'react'; import styled from 'styled-components'; import type { SearchFacet, SearchFacetCount, SearchFilterItem } from '@redocly/theme/core/types'; import { useThemeHooks } from '@redocly/theme/core/hooks'; import { Select } from '@redocly/theme/components/Select/Select'; import { CounterTag } from '@redocly/theme/components/Tags/CounterTag'; type SearchFilterFieldSelectProps = { className?: string; facet: SearchFacet; filter: SearchFilterItem[]; query: string; selectedValues: string[]; onChange: (value: string | string[]) => void; }; export function SearchFilterFieldSelect({ facet, filter, query, selectedValues, onChange, }: SearchFilterFieldSelectProps) { const MAX_SELECT_OPTIONS = 20; const { useFacetQuery, useTranslate } = useThemeHooks(); const { translate } = useTranslate(); const { searchFacet, setSearchFacet, setSearchFacetQuery } = useFacetQuery(facet.field); /* eslint-disable-next-line @typescript-eslint/no-explicit-any */ const [selectOptions, setSelectOptions] = useState([]); const isMultiple = facet.type === 'multi-select'; useEffect(() => { setSelectOptions(getSelectOptions()); // eslint-disable-next-line react-hooks/exhaustive-deps }, [searchFacet, facet]); const onSearch = (value: string | null) => { if (value === null) { setSearchFacet(null); setSearchFacetQuery(null); } else if (typeof value === 'string') { setSearchFacetQuery({ query, filter, facetQuery: value, }); } }; const getSelectOptions = () => { return searchFacet ? searchFacet.values.map(facetValueToSelectOption) : facet.values.map(facetValueToSelectOption); }; const facetValueToSelectOption = (facetValue?: SearchFacetCount | string) => { if (!facetValue) { return { element: null, value: '' }; } if (typeof facetValue === 'string') { return { element: ( {facetValue} ), value: facetValue, }; } else { const { value, count, isCounterVisible } = facetValue as SearchFacetCount; return { element: ( {value} {isCounterVisible && {count}} ), value: value, }; } }; return (