import { useState, useRef, KeyboardEvent } from 'react'; interface Props { label: string; values: string[]; onChange: (values: string[]) => void; suggestions?: string[]; placeholder?: string; } export function TokenInput({ label, values, onChange, suggestions = [], placeholder = 'Type and press Enter' }: Props) { const [draft, setDraft] = useState(''); const inputRef = useRef(null); const add = (val: string) => { const trimmed = val.trim().toLowerCase(); if (trimmed && !values.includes(trimmed)) { onChange([...values, trimmed]); } setDraft(''); }; const remove = (val: string) => { onChange(values.filter(v => v !== val)); }; const handleKey = (e: KeyboardEvent) => { if ((e.key === 'Enter' || e.key === ',') && draft.trim()) { e.preventDefault(); add(draft); } else if (e.key === 'Backspace' && !draft && values.length > 0) { remove(values[values.length - 1]); } }; const availableSuggestions = suggestions.filter(s => !values.includes(s)); return (
inputRef.current?.focus()} > {values.map(v => ( {v} ))} setDraft(e.target.value)} onKeyDown={handleKey} onBlur={() => { if (draft.trim()) add(draft); }} placeholder={values.length === 0 ? placeholder : ''} aria-label={label} />
{availableSuggestions.length > 0 && (
{availableSuggestions.map(s => ( ))}
)}
); }