import * as React from "react"; import { MenuItem } from "@blueprintjs/core"; import { ItemRenderer, Suggest } from "@blueprintjs/select"; import * as GQL from "../../core/generated-graphql"; import { StashService } from "../../core/StashService"; import { HTMLInputProps } from "../../models"; const InternalSuggest = Suggest.ofType(); interface IProps extends HTMLInputProps { scraperId: string; onSelectPerformer: (query: GQL.ScrapePerformerListScrapePerformerList) => void; } export const ScrapePerformerSuggest: React.FunctionComponent = (props: IProps) => { const [query, setQuery] = React.useState(""); const [selectedItem, setSelectedItem] = React.useState(); const [debouncedQuery, setDebouncedQuery] = React.useState(""); const { data, error, loading } = StashService.useScrapePerformerList(props.scraperId, debouncedQuery); React.useEffect(() => { const handler = setTimeout(() => { setDebouncedQuery(query); }, 500); return () => { clearTimeout(handler); }; }, [query]) const performerNames = !!data && !!data.scrapePerformerList ? data.scrapePerformerList : []; const renderInputValue = (performer: GQL.ScrapePerformerListScrapePerformerList) => performer.name || ""; const renderItem: ItemRenderer = (performer, itemProps) => { if (!itemProps.modifiers.matchesPredicate) { return null; } return ( ); }; function renderLoadingError() { if (error) { return (); } if (loading) { return (); } if (debouncedQuery && data && !!data.scrapePerformerList && data.scrapePerformerList.length === 0) { return (); } } return ( { props.onSelectPerformer(item); setSelectedItem(item); }} onQueryChange={(newQuery) => { setQuery(newQuery); }} activeItem={null} selectedItem={selectedItem} noResults={renderLoadingError()} popoverProps={{position: "bottom"}} /> ); };