Spaces:
Build error
Build error
| import { useState } from 'react'; | |
| export default function ChatInput({ onSendMessage, disabled }) { | |
| const [input, setInput] = useState(''); | |
| const handleSubmit = (e) => { | |
| e.preventDefault(); | |
| if (input.trim() && !disabled) { | |
| onSendMessage(input.trim()); | |
| setInput(''); | |
| } | |
| }; | |
| const handleKeyPress = (e) => { | |
| if (e.key === 'Enter' && !e.shiftKey) { | |
| e.preventDefault(); | |
| handleSubmit(e); | |
| } | |
| }; | |
| return ( | |
| <form onSubmit={handleSubmit} className="flex space-x-2"> | |
| <div className="flex-1 relative"> | |
| <textarea | |
| value={input} | |
| onChange={(e) => setInput(e.target.value)} | |
| onKeyPress={handleKeyPress} | |
| placeholder="Type your message..." | |
| disabled={disabled} | |
| className="w-full px-4 py-3 border border-gray-300 rounded-2xl focus:ring-2 focus:ring-primary-500 focus:border-transparent resize-none disabled:opacity-50 disabled:cursor-not-allowed" | |
| rows={1} | |
| style={{ | |
| minHeight: '48px', | |
| maxHeight: '120px', | |
| height: 'auto' | |
| onInput={(e) => { | |
| e.target.style.height = 'auto'; | |
| e.target.style.height = Math.min(e.target.scrollHeight, 120) + 'px'; | |
| /> | |
| </div> | |
| <button | |
| type="submit" | |
| disabled={!input.trim() || disabled} | |
| className="px-6 py-3 bg-primary-500 text-white rounded-2xl hover:bg-primary-600 focus:ring-2 focus:ring-primary-500 focus:ring-offset-2 disabled:opacity-50 disabled:cursor-not-allowed transition-colors duration-200 font-medium" | |
| > | |
| {disabled ? ( | |
| <svg className="animate-spin h-5 w-5" viewBox="0 0 24 24"> | |
| <circle className="opacity-25" cx="12" cy="12" r="10" stroke="currentColor" strokeWidth="4" fill="none" /> | |
| <path className="opacity-75" fill="currentColor" d="M4 12a8 8 0 018-8V0C5.373 0 0 5.373 0 12h4zm2 5.291A7.962 7.962 0 014 12H0c0 3.042 1.135 5.824 3 7.938l3-2.647z" /> | |
| </svg> | |
| ) : ( | |
| 'Send' | |
| )} | |
| </button> | |
| </form> | |
| ); | |
| } |