import { useEffect, useState } from 'preact/hooks'; import { httpGet } from '../../lib/http'; type PageType = { url: string; title: string; group: string; }; const defaultPages: PageType[] = [ { url: '/', title: 'Home', group: 'Pages' }, { url: '/profile', title: 'Account', group: 'Pages' }, { url: '/roadmaps', title: 'Roadmaps', group: 'Pages' }, { url: '/best-practices', title: 'Best Practices', group: 'Pages' }, { url: '/guides', title: 'Guides', group: 'Pages' }, { url: '/videos', title: 'Videos', group: 'Pages' }, ]; export function CommandMenu() { const [isActive, setIsActive] = useState(true); const [allPages, setAllPages] = useState([]); const [searchResults, setSearchResults] = useState(defaultPages); const [searchedText, setSearchedText] = useState(''); const [activeCounter, setActiveCounter] = useState(0); async function getAllPages() { if (allPages.length > 0) { return allPages; } const { error, response } = await httpGet(`/pages.json`); if (!response) { return defaultPages; } setAllPages([...defaultPages, ...response]); return response; } useEffect(() => { if (!searchedText) { setSearchResults(defaultPages); return; } const normalizedSearchText = searchedText.trim().toLowerCase(); getAllPages().then((unfilteredPages = defaultPages) => { const filteredPages = unfilteredPages.filter((currPage: PageType) => { return ( currPage.title.toLowerCase().indexOf(normalizedSearchText) !== -1 ); }); setActiveCounter(0); setSearchResults(filteredPages); }); }, [searchedText]); if (!isActive) { return null; } return (
{ const value = (e.target as HTMLInputElement).value.trim(); setSearchedText(value); }} onKeyDown={(e) => { if (e.key === 'ArrowDown') { const canGoNext = activeCounter < searchResults.length - 1; setActiveCounter(canGoNext ? activeCounter + 1 : 0); } else if (e.key === 'ArrowUp') { const canGoPrev = activeCounter > 0; setActiveCounter( canGoPrev ? activeCounter - 1 : searchResults.length - 1 ); } else if (e.key === 'Tab') { e.preventDefault(); } else if (e.key === 'Enter') { const activePage = searchResults[activeCounter]; if (activePage) { window.location.href = activePage.url; } } }} />
); }