Spaces:
Running
Running
import React, { useState, useRef, useEffect } from 'react'; | |
import { ChatInputFormProps } from '@/lib/types'; | |
import { Button } from '@/components/ui/button'; | |
import { Input } from '@/components/ui/input'; | |
const ChatInputForm: React.FC<ChatInputFormProps> = ({ onSendMessage, isLoading }) => { | |
const [input, setInput] = useState(''); | |
const inputRef = useRef<HTMLInputElement>(null); | |
// Focus input on component mount | |
useEffect(() => { | |
if (inputRef.current) { | |
inputRef.current.focus(); | |
} | |
}, []); | |
const handleSubmit = (e: React.FormEvent) => { | |
e.preventDefault(); | |
const message = input.trim(); | |
if (!message || isLoading) return; | |
onSendMessage(message); | |
setInput(''); | |
}; | |
const handleClear = () => { | |
setInput(''); | |
if (inputRef.current) { | |
inputRef.current.focus(); | |
} | |
}; | |
return ( | |
<form onSubmit={handleSubmit} className="flex items-center space-x-2"> | |
<div className="relative flex-1"> | |
<Input | |
ref={inputRef} | |
type="text" | |
value={input} | |
onChange={(e) => setInput(e.target.value)} | |
placeholder="Type your message here..." | |
className="w-full py-3 px-4 bg-gray-100 rounded-full focus:outline-none focus:ring-2 focus:ring-primary focus:bg-white" | |
disabled={isLoading} | |
/> | |
{input && ( | |
<button | |
type="button" | |
onClick={handleClear} | |
className="absolute right-3 top-1/2 transform -translate-y-1/2 text-gray-400 hover:text-gray-600" | |
aria-label="Clear input" | |
> | |
<svg xmlns="http://www.w3.org/2000/svg" className="h-5 w-5" viewBox="0 0 20 20" fill="currentColor"> | |
<path fillRule="evenodd" d="M10 18a8 8 0 100-16 8 8 0 000 16zM8.707 7.293a1 1 0 00-1.414 1.414L8.586 10l-1.293 1.293a1 1 0 101.414 1.414L10 11.414l1.293 1.293a1 1 0 001.414-1.414L11.414 10l1.293-1.293a1 1 0 00-1.414-1.414L10 8.586 8.707 7.293z" clipRule="evenodd" /> | |
</svg> | |
</button> | |
)} | |
</div> | |
<Button | |
type="submit" | |
disabled={isLoading || !input.trim()} | |
className="bg-primary text-white p-3 rounded-full hover:bg-primary-600 focus:outline-none focus:ring-2 focus:ring-primary focus:ring-offset-2 transition-colors duration-200" | |
> | |
<svg xmlns="http://www.w3.org/2000/svg" className="h-5 w-5" viewBox="0 0 20 20" fill="currentColor"> | |
<path d="M10.894 2.553a1 1 0 00-1.788 0l-7 14a1 1 0 001.169 1.409l5-1.429A1 1 0 009 15.571V11a1 1 0 112 0v4.571a1 1 0 00.725.962l5 1.428a1 1 0 001.17-1.408l-7-14z" /> | |
</svg> | |
</Button> | |
</form> | |
); | |
}; | |
export default ChatInputForm; | |