import { useState, useRef } from 'react' const PROVIDER_ICONS = { groq: '⚡', google: '🌐', mistral: '💫', huggingface: '🤗', nvidia: '◆', openrouter: '🔀', } export default function Composer({ onSend, onUpload, attachments, onRemoveAttachment, provider, model, registry, agentMode, onToggleAgent, onOpenModelPicker, disabled, onClickDisabled }) { const [text, setText] = useState('') const [isDrag, setIsDrag] = useState(false) const fileInputRef = useRef(null) const textareaRef = useRef(null) const handleInput = (e) => { setText(e.target.value) if (textareaRef.current) { textareaRef.current.style.height = 'auto' textareaRef.current.style.height = Math.min(textareaRef.current.scrollHeight, 180) + 'px' } } const handleDrop = (e) => { e.preventDefault(); setIsDrag(false) if (disabled) { onClickDisabled(); return } if (e.dataTransfer.files?.length) onUpload(e.dataTransfer.files) } const handleDragOver = (e) => { e.preventDefault(); setIsDrag(true) } const handleDragLeave = (e) => { e.preventDefault(); setIsDrag(false) } const handleKey = (e) => { if (e.key === 'Enter' && !e.shiftKey) { e.preventDefault() if (disabled) onClickDisabled() else if (text.trim() || attachments.length > 0) { onSend(text) setText('') if (textareaRef.current) textareaRef.current.style.height = '36px' } } } const handleSendClick = () => { if (disabled) onClickDisabled() else { onSend(text) setText('') if (textareaRef.current) textareaRef.current.style.height = '36px' } } const handleFileChange = (e) => { if (disabled) { onClickDisabled(); return } if (e.target.files?.length) { onUpload(e.target.files) e.target.value = '' } } const provRegistry = registry[provider] || { label: 'Unknown', models: [] } const modData = provRegistry.models?.find(m => m.id === model) || { name: model } return (
{/* Attachments strip */} {attachments.length > 0 && (
{attachments.map((a, i) => (
📎 {a.filename}
))}
)} {/* Main input row */}