Spaces:
Sleeping
Sleeping
'use client'; | |
import type { KeyboardEvent } from 'react'; | |
import { useState } from 'react'; | |
interface ChatInputProps { | |
onSendMessage: (message: string) => void; | |
disabled?: boolean; | |
} | |
export default function ChatInput({ onSendMessage, disabled = false }: ChatInputProps) { | |
const [message, setMessage] = useState(''); | |
const handleSubmit = () => { | |
if (message.trim() && !disabled) { | |
onSendMessage(message); | |
setMessage(''); | |
} | |
}; | |
const handleKeyPress = (e: KeyboardEvent<HTMLTextAreaElement>) => { | |
// Check if it's an Enter key from IME (Input Method Editor) | |
if (e.key === 'Enter' && !e.shiftKey && !e.nativeEvent.isComposing) { | |
e.preventDefault(); | |
handleSubmit(); | |
} | |
}; | |
return ( | |
<div className="border-t bg-white p-4"> | |
<div className="mx-auto flex gap-4"> | |
<textarea | |
className="flex-1 resize-none rounded-lg border border-gray-200 p-3 focus:outline-none focus:ring-2 focus:ring-blue-500" | |
disabled={disabled} | |
onChange={(e) => setMessage(e.target.value)} | |
onCompositionEnd={(e) => { | |
// After IME composition ends, if it's an Enter key, don't trigger send | |
if (e.data === '\n') { | |
e.preventDefault(); | |
} | |
}} | |
onKeyDown={handleKeyPress} | |
placeholder="Message Second Me..." | |
rows={1} | |
value={message} | |
/> | |
<button | |
className={`px-4 py-2 rounded-lg ${ | |
!message.trim() || disabled | |
? 'bg-gray-100 text-gray-400' | |
: 'bg-blue-600 text-white hover:bg-blue-700' | |
} transition-colors`} | |
disabled={!message.trim() || disabled} | |
onClick={handleSubmit} | |
> | |
Send | |
</button> | |
</div> | |
</div> | |
); | |
} | |