ChatJio / frontend /src /components /ChatInput.jsx
sehscape's picture
deploy: initial ChatJio deployment for HuggingFace Spaces
f3269f9
Raw
History Blame Contribute Delete
1.71 kB
import { useState, useRef, useEffect } from 'react';
export default function ChatInput({ onSubmit, loading }) {
const [value, setValue] = useState('');
const textareaRef = useRef(null);
useEffect(() => {
if (textareaRef.current) {
textareaRef.current.style.height = 'auto';
textareaRef.current.style.height = `${Math.min(textareaRef.current.scrollHeight, 160)}px`;
}
}, [value]);
const handleKeyDown = (e) => {
if (e.key === 'Enter' && !e.shiftKey) {
e.preventDefault();
submit();
}
};
const submit = () => {
const trimmed = value.trim();
if (!trimmed || loading) return;
onSubmit(trimmed);
setValue('');
};
return (
<div className="input-wrapper">
<div className="input-box">
<textarea
ref={textareaRef}
className="input-textarea"
placeholder="Ask anything about your documents..."
value={value}
onChange={(e) => setValue(e.target.value)}
onKeyDown={handleKeyDown}
rows={1}
disabled={loading}
/>
<button
className={`send-btn ${value.trim() && !loading ? 'send-btn--active' : ''}`}
onClick={submit}
disabled={!value.trim() || loading}
aria-label="Send"
>
<svg width="18" height="18" viewBox="0 0 24 24" fill="none" stroke="currentColor" strokeWidth="2.5" strokeLinecap="round" strokeLinejoin="round">
<line x1="22" y1="2" x2="11" y2="13" />
<polygon points="22 2 15 22 11 13 2 9 22 2" />
</svg>
</button>
</div>
<p className="input-hint">Enter to send · Shift+Enter for new line</p>
</div>
);
}