import { useState, useImperativeHandle } from 'react' import BLOG from '@/blog.config' import algoliasearch from 'algoliasearch' import replaceSearchResult from '@/components/Mark' /** * 结合 Algolia 实现的弹出式搜索框 * 打开方式 cRef.current.openSearch() * https://www.algolia.com/doc/api-reference/search-api-parameters/ */ export default function AlgoliaSearchModal({ cRef }) { const [searchResults, setSearchResults] = useState([]) const [isModalOpen, setIsModalOpen] = useState(false) /** * 对外暴露方法 */ useImperativeHandle(cRef, () => { return { openSearch: () => { setIsModalOpen(true) } } }) if (!BLOG.ALGOLIA_APP_ID) { return <> } const client = algoliasearch(BLOG.ALGOLIA_APP_ID, BLOG.ALGOLIA_SEARCH_ONLY_APP_KEY) const index = client.initIndex(BLOG.ALGOLIA_INDEX) const handleSearch = async (query) => { try { const res = await index.search(query) console.log(res) const { hits } = res setSearchResults(hits) const doms = document.getElementById('search-wrapper').getElementsByClassName('replace') replaceSearchResult({ doms, search: query, target: { element: 'span', className: 'text-blue-600 border-b border-dashed' } }) } catch (error) { console.error('Algolia search error:', error) } } const closeModal = () => { setIsModalOpen(false) } return (
{/* 内容 */}
搜索
handleSearch(e.target.value)} className="bg-gray-50 dark:bg-gray-600 outline-blue-500 w-full px-4 my-2 py-1 mb-4 border rounded-md" /> {/* 标签组 */}
Algolia 提供搜索服务
{/* 遮罩 */}
) }