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 [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 = () => { Promise.all([getExpoDocsItems(), getRNDocsItems(), getDirectoryItems(), getExpoItems()]).then( () => setLoading(false) ); }; const onQueryChange = () => { setLoading(true); const inputTimeout = setTimeout(fetchData, 150); return () => clearTimeout(inputTimeout); }; useEffect(onQueryChange, [query]); const totalCount = expoDocsItems.length + rnDocsItems.length + directoryItems.length + expoItems.length; return ( setOpen(false)} /> {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 => ( ))} )} {totalCount === 0 && ( No results found. )} ); };