import { SearchIcon, theme, XIcon } from '@expo/styleguide'; import { Command } from 'cmdk'; import { useEffect, useState } from 'react'; import type { Dispatch, SetStateAction } from 'react'; import { BarLoader } from './BarLoader'; import { CommandFooter } from './CommandFooter'; import { RNDirectoryItem, RNDocsItem, ExpoDocsItem, ExpoItem } from './Items'; import { entries } from './expoEntries'; import { searchIconStyle, closeIconStyle } from './styles'; import type { ExpoItemType, RNDirectoryItemType, AlgoliaItemType } from './types'; import { getExpoDocsResults, getRNDocsResults, getDirectoryResults, getItemsAsync } from './utils'; import { CALLOUT } from '~/ui/components/Text'; type Props = { version: string; open: boolean; setOpen: Dispatch>; }; export const CommandMenu = ({ version, open, setOpen }: Props) => { const [initialized, setInitialized] = useState(false); const [loading, setLoading] = useState(false); const [query, setQuery] = useState(''); const [expoDocsItems, setExpoDocsItems] = useState([]); const [expoItems, setExpoItems] = useState([]); const [rnDocsItems, setRnDocsItems] = useState([]); const [directoryItems, setDirectoryItems] = useState([]); const getExpoDocsItems = async () => getItemsAsync(query, getExpoDocsResults, setExpoDocsItems, version); const getRNDocsItems = async () => getItemsAsync(query, getRNDocsResults, setRnDocsItems); const getDirectoryItems = async () => getItemsAsync(query, getDirectoryResults, setDirectoryItems); const getExpoItems = async () => { setExpoItems(entries.filter(entry => entry.label.toLowerCase().includes(query.toLowerCase()))); }; const dismiss = () => setOpen(false); const fetchData = (callback: () => void) => { Promise.all([getExpoDocsItems(), getRNDocsItems(), getDirectoryItems(), getExpoItems()]).then( callback ); }; const onQueryChange = () => { if (open) { setLoading(true); const inputTimeout = setTimeout(() => fetchData(() => setLoading(false)), 150); return () => clearTimeout(inputTimeout); } }; const onMenuOpen = () => { if (open && !initialized) { fetchData(() => { setInitialized(true); setLoading(false); }); } }; useEffect(onMenuOpen, [open]); useEffect(onQueryChange, [query]); const totalCount = expoDocsItems.length + rnDocsItems.length + directoryItems.length + expoItems.length; return ( setOpen(false)} /> {initialized && ( <> {expoDocsItems.length > 0 && ( {expoDocsItems.map(item => ( ))} )} {expoItems.length > 0 && ( {expoItems.map((item: ExpoItemType) => ( ))} )} {rnDocsItems.length > 0 && ( {rnDocsItems.map(item => ( ))} )} {directoryItems.length > 0 && ( {directoryItems.map(item => ( ))} )} {!loading && totalCount === 0 && ( No results found. )} )} ); };