import { DocSearchModal, useDocSearchKeyboardEvents } from '@docsearch/react'; import { InternalDocSearchHit, StoredDocSearchHit, } from '@docsearch/react/dist/esm/types'; import { MagnifyingGlassIcon } from '@heroicons/react/24/solid'; import Head from 'next/head'; import Link from 'next/link'; import { useRouter } from 'next/navigation'; import { ReactNode, useCallback, useEffect, useRef, useState } from 'react'; import { createPortal } from 'react-dom'; const ACTION_KEY_DEFAULT = ['Ctrl ', 'Control']; const ACTION_KEY_APPLE = ['⌘', 'Command']; function Hit({ hit, children, }: { hit: InternalDocSearchHit | StoredDocSearchHit; children: ReactNode; }): JSX.Element { return ( {children} ); } export function AlgoliaSearch({ tiny = false, }: { tiny?: boolean; }): JSX.Element { const router = useRouter(); const [isOpen, setIsOpen] = useState(false); const searchButtonRef = useRef(null); const [initialQuery, setInitialQuery] = useState(''); const [browserDetected, setBrowserDetected] = useState(false); const [actionKey, setActionKey] = useState(ACTION_KEY_DEFAULT); const handleOpen = useCallback(() => { setIsOpen(true); }, [setIsOpen]); const handleClose = useCallback(() => { setIsOpen(false); }, [setIsOpen]); const handleInput = useCallback( (event: KeyboardEvent) => { setIsOpen(true); setInitialQuery(event.key); }, [setIsOpen, setInitialQuery] ); useDocSearchKeyboardEvents({ isOpen, onOpen: handleOpen, onClose: handleClose, onInput: handleInput, searchButtonRef, }); useEffect(() => { if (typeof navigator !== 'undefined') { if (/(Mac|iPhone|iPod|iPad)/i.test(navigator.platform)) { setActionKey(ACTION_KEY_APPLE); } else { setActionKey(ACTION_KEY_DEFAULT); } setBrowserDetected(true); } }, []); return ( <> {!tiny ? ( ) : ( )} {isOpen && createPortal( { return items.map((item, index) => { const a = document.createElement('a'); a.href = item.url; const hash = a.hash === '#content-wrapper' ? '' : a.hash; if (item.hierarchy?.lvl0) { item.hierarchy.lvl0 = item.hierarchy.lvl0.replace( /&/g, '&' ); } return { ...item, url: `${a.pathname}${hash}`, }; }); }} />, document.body )} ); }