import { useEffect, useState, useRef, useMemo } from '@wordpress/element' import { __ } from '@wordpress/i18n' import classNames from 'classnames' import Fuse from 'fuse.js' import { useTemplatesStore } from '../state/Templates' import { useUserStore } from '../state/User' const searchMemo = new Map() export default function SiteTypeSelector({ value, setValue, terms }) { const preferredOptionsHistory = useUserStore( (state) => state.preferredOptionsHistory?.siteType?.filter((t) => t.slug) ?? {}, ) const searchParams = useTemplatesStore((state) => state.searchParams) const [expanded, setExpanded] = useState(false) const searchRef = useRef() const [fuzzy, setFuzzy] = useState({}) const [tempValue, setTempValue] = useState('') const [visibleChoices, setVisibleChoices] = useState([]) const examples = useMemo(() => { return terms .filter((t) => t?.featured) .sort((a, b) => { if (a.slug < b.slug) return -1 if (a.slug > b.slug) return 1 return 0 }) }, [terms]) const updateSearch = (term) => { setTempValue(term) filter(term) } const filter = (term = '') => { if (searchMemo.has(term)) { setVisibleChoices(searchMemo.get(term)) return } const results = fuzzy.search(term) searchMemo.set( term, results?.length ? results.map((t) => t.item) : examples, ) setVisibleChoices(searchMemo.get(term)) } const showRecent = () => visibleChoices === examples && Object.keys(preferredOptionsHistory).length > 0 const unknown = value.slug === 'unknown' || !value?.slug useEffect(() => { setFuzzy( new Fuse(terms, { keys: ['slug', 'title', 'keywords'], minMatchCharLength: 2, threshold: 0.3, }), ) }, [terms]) useEffect(() => { if (!tempValue.length) setVisibleChoices(examples) }, [examples, tempValue]) useEffect(() => { expanded && searchRef.current.focus() }, [expanded]) const contentHeader = (description) => { return ( <> {__('Site Type', 'extendify')} {description} {unknown && !expanded && ( )} > ) } const choicesList = (choices, title = __('Suggestions', 'extendify')) => { if (choices === examples) { title = __('Examples', 'extendify') } return ( <>
{__('Nothing found...', 'extendify')}
)} {showRecent() && (