import { useDebounce } from "@uidotdev/usehooks" import { CommandLoading } from "cmdk" import { type Dispatch, type SetStateAction, useState } from "react" import { useQuery } from "urql" import { Badge } from "~/components/ui/badge" import { CommandGroup, CommandInput, CommandItem, CommandList, } from "~/components/ui/command" import { graphql } from "~/generated/gql" const QuestionsQuery = graphql(` query questions($query: String) { questions(query: $query) { questions { id docId categoryMajor categoryMedium categoryMinor question } } } `) type QuestionSearchProps = { question: string setOpen: Dispatch> setQuestion: Dispatch> } export function QuestionSearch({ question, setOpen, setQuestion, }: QuestionSearchProps) { const [query, setQuery] = useState(question) const debouncedQuery = useDebounce(query, 200) const [result, _reexecuteQuery] = useQuery({ query: QuestionsQuery, variables: { query: debouncedQuery }, }) const { data, error } = result return ( <> setQuery(search)} onKeyDown={(e) => { if ( e.key === "Enter" && !e.nativeEvent.isComposing && // For Safari IME composition bug e.keyCode !== 229 ) { setQuestion(debouncedQuery) setOpen(false) e.preventDefault() } }} placeholder="Type search..." /> {error ? ( Oh no... {error.message} ) : null} {0 < (data?.questions?.questions?.length ?? 0) && ( {data?.questions?.questions?.map((item) => ( { setQuestion(item.question) setOpen(false) }} > {item.question}
{item.categoryMajor}
))}
)}
) }