'use client' import * as React from 'react' import { CheckIcon } from 'lucide-react' import { cn } from '@cdnmanager/ui/lib/utils' import { Autocomplete, AutocompleteContent, AutocompleteEmpty, AutocompleteInput, AutocompleteItem, AutocompleteList, } from '@/components/reui/autocomplete' import { TruncatedText } from '@/components/truncated-text' export interface AutoCompleteOption { value: string label: string /** Левый префикс (например флаг страны). */ leading?: React.ReactNode } interface AutoCompleteInputProps { id?: string value: string onChange: (value: string) => void options: AutoCompleteOption[] placeholder?: string searchPlaceholder?: string emptyText?: string className?: string /** Показывать ли выбранный leading в поле (например флаг). */ showLeadingInInput?: boolean /** Разрешать ли произвольный ввод (не только из списка). По умолчанию true. */ allowFreeText?: boolean disabled?: boolean } export function AutoCompleteInput({ id, value, onChange, options, placeholder = 'Выбрать…', searchPlaceholder, emptyText = 'Ничего не найдено', className, showLeadingInInput = true, allowFreeText = true, disabled = false, }: AutoCompleteInputProps) { const trimmedValue = value.trim() const selected = React.useMemo( () => options.find((o) => o.value.toLowerCase() === trimmedValue.toLowerCase()), [options, trimmedValue], ) const leading = showLeadingInInput ? selected?.leading : undefined const inputPlaceholder = searchPlaceholder ?? placeholder const handleValueChange = React.useCallback( (inputVal: string) => { const q = inputVal.trim() const match = options.find( (o) => o.label.toLowerCase() === q.toLowerCase() || o.value.toLowerCase() === q.toLowerCase(), ) if (match) { onChange(match.value) return } if (allowFreeText) { onChange(inputVal) } }, [options, onChange, allowFreeText], ) return ( item.label} mode="list" autoHighlight openOnInputClick disabled={disabled} >
{leading ? ( {leading} ) : null}
{emptyText} {(item) => { const isSelected = item.value.toLowerCase() === trimmedValue.toLowerCase() return ( {item.leading ? ( {item.leading} ) : null} {item.label} {isSelected ? ( ) : null} ) }}
) }