import { useState, useEffect } from "react"; import { useTranslation } from "react-i18next"; 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 }: CategoryComboboxProps) { const { t } = useTranslation(); const [open, setOpen] = useState(false); const [inputValue, setInputValue] = useState(value); useEffect(() => { setInputValue(value); }, [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() ); const resolvedPlaceholder = placeholder ?? t("category.placeholder"); function select(val: string) { onChange(val); setInputValue(val); setOpen(false); } return ( { setInputValue(v); onChange(v); }} data-testid="input-category-search" /> {filtered.length === 0 && !showCreateOption && ( {t("category.noCategories")} )} {filtered.length > 0 && ( {filtered.map((cat) => ( select(cat)} data-testid={`item-category-${cat}`} > {cat} ))} )} {showCreateOption && ( select(inputValue.trim())} data-testid="item-category-create-new" > {t("category.create")} “{inputValue.trim()}” )} ); }