import React, { useState, useRef, useEffect, useCallback } from 'react'; import { Bot, Send, User, Loader } from 'lucide-react'; import { createChat } from '../services/geminiService'; import type { Chat } from '@google/genai'; import { ChatMessage } from '../types'; const ChatBotView: React.FC = () => { const [chat, setChat] = useState(null); const [messages, setMessages] = useState([]); const [userInput, setUserInput] = useState(''); const [isLoading, setIsLoading] = useState(false); const messagesEndRef = useRef(null); useEffect(() => { setChat(createChat()); setMessages([{ role: 'model', parts: [{ text: 'Hello! I am the Codex Assistant. How can I help you today?' }] }]); }, []); const scrollToBottom = () => { messagesEndRef.current?.scrollIntoView({ behavior: "smooth" }); }; useEffect(() => { scrollToBottom(); }, [messages]); const handleSendMessage = useCallback(async () => { if (!userInput.trim() || !chat || isLoading) return; const newUserMessage: ChatMessage = { role: 'user', parts: [{ text: userInput }] }; setMessages(prev => [...prev, newUserMessage]); setUserInput(''); setIsLoading(true); try { const stream = await chat.sendMessageStream({ message: userInput }); let modelResponse = ''; setMessages(prev => [...prev, { role: 'model', parts: [{ text: '' }] }]); for await (const chunk of stream) { modelResponse += chunk.text; setMessages(prev => { const newMessages = [...prev]; newMessages[newMessages.length - 1].parts[0].text = modelResponse; return newMessages; }); } } catch (error) { console.error('Error sending message:', error); setMessages(prev => [...prev, { role: 'model', parts: [{ text: 'Sorry, I encountered an error. Please try again.' }] }]); } finally { setIsLoading(false); } }, [userInput, chat, isLoading]); const Message: React.FC<{ message: ChatMessage }> = ({ message }) => { const isModel = message.role === 'model'; return (
{isModel ? : }

{message.parts[0].text}

); }; return (

Codex Assistant

Engage in a conversation with a Gemini-powered chat bot.

{messages.map((msg, index) => )} {isLoading && (
)}
setUserInput(e.target.value)} onKeyPress={(e) => e.key === 'Enter' && handleSendMessage()} placeholder="Ask a question..." className="flex-1 bg-slate-800 border border-slate-700 rounded-lg px-4 py-3 focus:ring-2 focus:ring-indigo-500 focus:outline-none" disabled={isLoading} />
); }; export default ChatBotView;