| 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; |