import { useState } from "react"; import { Check, ChevronsUpDown } from "lucide-react"; import { cn } from "@/lib/utils"; import { Button } from "@/components/ui/button"; import { Command, CommandEmpty, CommandGroup, CommandInput, CommandItem, CommandList, } from "@/components/ui/command"; import { Popover, PopoverContent, PopoverTrigger, } from "@/components/ui/popover"; import { useListCategories, getListCategoriesQueryKey } from "@workspace/api-client-react"; interface CategoryComboboxProps { value: string; onChange: (value: string) => void; placeholder?: string; } export function CategoryCombobox({ value, onChange, placeholder = "Select or type a category..." }: CategoryComboboxProps) { const [open, setOpen] = useState(false); const [inputValue, setInputValue] = useState(value); const categories = useListCategories({ query: { queryKey: getListCategoriesQueryKey(), refetchOnMount: "always", staleTime: 0, }, }); const known: string[] = categories.data ?? []; const filtered = inputValue.trim() ? known.filter((c) => c.toLowerCase().includes(inputValue.toLowerCase())) : known; const showCreateOption = inputValue.trim() !== "" && !known.some( (c) => c.toLowerCase() === inputValue.toLowerCase() ); function select(val: string) { onChange(val); setInputValue(val); setOpen(false); } return ( { setInputValue(v); onChange(v); }} data-testid="input-category-search" /> {filtered.length === 0 && !showCreateOption && ( No categories found. )} {filtered.length > 0 && ( {filtered.map((cat) => ( select(cat)} data-testid={`item-category-${cat}`} > {cat} ))} )} {showCreateOption && ( select(inputValue.trim())} data-testid="item-category-create-new" > + Create “{inputValue.trim()}” )} ); }