DocuChat / frontend /src /components /ChatInput.tsx
Prateet Mishra
Fix Railway deployment: add built frontend/dist, fix railway.toml
0e78e4d
Raw
History Blame Contribute Delete
1.66 kB
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>
)
}