import { DocSearchModal, useDocSearchKeyboardEvents } from '@docsearch/react'; import { SearchIcon } from '@heroicons/react/solid'; import Head from 'next/head'; import Link from 'next/link'; import { useRouter } from 'next/router'; import { useCallback, useEffect, useRef, useState } from 'react'; import { createPortal } from 'react-dom'; const ACTION_KEY_DEFAULT = ['Ctrl ', 'Control']; const ACTION_KEY_APPLE = ['⌘', 'Command']; // TODO@ben: remove replace pattern when Algolia is updated function Hit({ hit, children }) { return ( {children} ); } export function AlgoliaSearch() { const router = useRouter(); const [isOpen, setIsOpen] = useState(false); const searchButtonRef = useRef(null); const [initialQuery, setInitialQuery] = useState(null); 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( (e) => { setIsOpen(true); setInitialQuery(e.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 ( <> {isOpen && createPortal( { return items.map((item) => { // We transform the absolute URL into a relative URL to // leverage Next's preloading. const a = document.createElement('a'); a.href = item.url; const hash = a.hash === '#content-wrapper' ? '' : a.hash; return { ...item, url: `${a.pathname}${hash}`, }; }); }} />, document.body )} ); }