book / src /components /Chatbot /ChatbotInterface.jsx
Ammar Ahmed Khan
Add Physical AI Humanoid Book Platform
e2eff86
import React, { useState, useEffect, useRef } from 'react';
import { useChatbot } from '../../contexts/ChatbotContext';
import './ChatbotInterface.css';
const ChatbotInterface = ({ isVisible, onClose }) => {
const { messages, isLoading, error, sendMessage } = useChatbot();
const [inputValue, setInputValue] = useState('');
const messagesEndRef = useRef(null);
const scrollToBottom = () => {
messagesEndRef.current?.scrollIntoView({ behavior: "smooth" });
};
useEffect(() => {
scrollToBottom();
}, [messages]);
const handleSend = () => {
if (!inputValue.trim() || isLoading) return;
sendMessage(inputValue);
setInputValue('');
};
const handleKeyPress = (e) => {
if (e.key === 'Enter' && !e.shiftKey) {
e.preventDefault();
handleSend();
}
};
if (!isVisible) return null;
return (
<div className="chatbot-container">
<div className="chatbot-header">
<h3 className="chatbot-title">AI Assistant</h3>
<button className="chatbot-close" onClick={onClose}>×</button>
</div>
<div className="chatbot-messages">
{messages.map((message) => (
<div
key={message.id}
className={`message ${message.sender === 'user' ? 'user-message' : 'bot-message'}`}
>
<div className="message-text">{message.text}</div>
</div>
))}
{isLoading && (
<div className="message bot-message">
<div className="message-text">
<div className="typing-indicator">
<span></span>
<span></span>
<span></span>
</div>
</div>
</div>
)}
{error && (
<div className="message bot-message">
<div className="message-text error">
{error}
</div>
</div>
)}
<div ref={messagesEndRef} />
</div>
<div className="chatbot-input">
<input
type="text"
value={inputValue}
onChange={(e) => setInputValue(e.target.value)}
onKeyPress={handleKeyPress}
placeholder="Ask a question about the book..."
disabled={isLoading}
/>
<button onClick={handleSend} disabled={isLoading}>
{isLoading ? 'Sending...' : 'Send'}
</button>
</div>
</div>
);
};
export default ChatbotInterface;