Spaces:
Sleeping
Sleeping
| import { useState, useRef, useEffect } from 'react' | |
| import { ArrowUp } from 'lucide-react' | |
| interface ChatInputProps { | |
| onSend: (message: string) => void | |
| disabled?: boolean | |
| } | |
| export function ChatInput({ onSend, disabled }: ChatInputProps) { | |
| const [value, setValue] = useState('') | |
| const textareaRef = useRef<HTMLTextAreaElement>(null) | |
| // Auto-resize textarea | |
| useEffect(() => { | |
| const el = textareaRef.current | |
| if (!el) return | |
| el.style.height = 'auto' | |
| el.style.height = Math.min(el.scrollHeight, 160) + 'px' | |
| }, [value]) | |
| const handleKeyDown = (e: React.KeyboardEvent<HTMLTextAreaElement>) => { | |
| if (e.key === 'Enter' && !e.shiftKey) { | |
| e.preventDefault() | |
| handleSend() | |
| } | |
| } | |
| const handleSend = () => { | |
| const trimmed = value.trim() | |
| if (!trimmed || disabled) return | |
| onSend(trimmed) | |
| setValue('') | |
| } | |
| return ( | |
| <div className="chat-input"> | |
| <div className="chat-input__wrapper"> | |
| <textarea | |
| ref={textareaRef} | |
| className="chat-input__textarea" | |
| placeholder="Ask anything from your uploaded files" | |
| value={value} | |
| onChange={(e) => setValue(e.target.value)} | |
| onKeyDown={handleKeyDown} | |
| disabled={disabled} | |
| rows={1} | |
| /> | |
| <button | |
| className="chat-input__send" | |
| onClick={handleSend} | |
| disabled={disabled || !value.trim()} | |
| aria-label="Send message" | |
| > | |
| <ArrowUp size={18} /> | |
| </button> | |
| </div> | |
| <p className="chat-input__hint"> | |
| Press <kbd>Enter</kbd> to send, <kbd>Shift + Enter</kbd> for new line | |
| </p> | |
| </div> | |
| ) | |
| } | |