"use client" import * as React from "react" import { Check, ChevronsUpDown } from "lucide-react" import { cn } from "@/lib/utils" import { Button } from "@/components/ui/button" import { useDebouncedCallback } from 'use-debounce' import { useTranslation } from 'react-i18next' import { Command, CommandEmpty, CommandGroup, CommandInput, CommandItem, CommandList, } from "@/components/ui/command" import { Popover, PopoverContent, PopoverTrigger, } from "@/components/ui/popover" export interface ComboboxProps { value?: string setValue: (value: string) => void dataList: { value: string; label: string }[] placeholder?: string notFoundText?: string onOpenChange?: () => void className?: string onKeyWordChange?: (keyword: string) => void keyword?: string isLoading?: boolean } export function Combobox({ value, setValue, dataList, placeholder, notFoundText, onOpenChange, className, keyword, onKeyWordChange, isLoading }: ComboboxProps) { const { t } = useTranslation() const [open, setOpen] = React.useState(false) const debounced = useDebouncedCallback( (v) => { onKeyWordChange && onKeyWordChange(v as string); }, 500, ); const defaultPlaceholder = t('selector.common.placeholder') const defaultNotFoundText = t('selector.common.notFound') const loadingText = t('selector.common.loading') return ( { onOpenChange && onOpenChange() setOpen(open)}}> debounced(v)} placeholder={placeholder || defaultPlaceholder} /> {isLoading ? loadingText : (notFoundText || defaultNotFoundText)} {dataList.map((item) => ( { setValue(currentValue === value ? "" : currentValue) setOpen(false) }} > {item.label} ))} ) }