/** @jsxImportSource react */ import { useState, useCallback, useRef } from 'react'; import { ALGOLIA } from '../../config'; import 'typesense-docsearch-react'; import './Search.css'; import { createPortal } from 'react-dom'; import * as docSearchReact from 'typesense-docsearch-react'; /** FIXME: This is still kinda nasty, but DocSearch is not ESM ready. */ const DocSearchModal = docSearchReact.DocSearchModal || (docSearchReact as any).default.DocSearchModal; const useDocSearchKeyboardEvents = docSearchReact.useDocSearchKeyboardEvents || (docSearchReact as any).default.useDocSearchKeyboardEvents; export default function Search() { const [isOpen, setIsOpen] = useState(false); const searchButtonRef = useRef(null); const [initialQuery, setInitialQuery] = useState(''); const onOpen = useCallback(() => { setIsOpen(true); }, [setIsOpen]); const onClose = useCallback(() => { setIsOpen(false); }, [setIsOpen]); const onInput = useCallback( (e) => { setIsOpen(true); setInitialQuery(e.key); }, [setIsOpen, setInitialQuery] ); useDocSearchKeyboardEvents({ isOpen, onOpen, onClose, onInput, searchButtonRef, }); const serverConfig = { apiKey: ALGOLIA.apiKey, nodes: [ { host: 'search.nextgraph.org', port: 443, protocol: 'https', }]}; const searchParams = {}; return ( <> {isOpen && createPortal( { return items.map((item) => { // We transform the absolute URL into a relative URL to // work better on localhost, preview URLS. const a = document.createElement('a'); a.href = item.url; const hash = a.hash === '#overview' ? '' : a.hash; return { ...item, url: `${a.pathname}${hash}`, }; }); }} />, document.body )} ); }