import ArrowRightAltIcon from "@mui/icons-material/ArrowRightAlt"; import ArrowUpwardIcon from "@mui/icons-material/ArrowUpward"; import GraphicEqIcon from "@mui/icons-material/GraphicEq"; import PersonIcon from "@mui/icons-material/Person"; import { Box, IconButton, InputBase, Menu, MenuItem } from "@mui/material"; import React, { useState, useContext, useEffect, useCallback } from "react"; import ReactMarkdown from "react-markdown"; import { useNavigate } from "react-router-dom"; import remarkGfm from "remark-gfm"; import { AuthContext } from "../../../context/AuthContext"; import useWebSocket from "../../../hooks/useTextWebhook"; import { ICreateConversationResponse } from "../../../interfaces/conversation"; import { logout } from "../../../services/api/authService"; import { createConversation } from "../../../services/api/chatService"; interface ChatScreenProps { isOpen: boolean; toggleSidebar: () => void; } const ChatScreen: React.FC = ({ isOpen, toggleSidebar }) => { const [input, setInput] = useState(""); const [anchorEl, setAnchorEl] = useState(null); const { messages, sendMessage, connectWebSocket } = useWebSocket(); const authContext = useContext(AuthContext); const navigate = useNavigate(); useEffect(() => { const initializeConversation = async () => { try { const conv = await createConversation({ modality: "text" }); const sessionData: ICreateConversationResponse = await conv.data; const conversationId = sessionData.conversation_id; connectWebSocket(conversationId); } catch (error) { console.error("Failed to initialize conversation:", error); } }; initializeConversation(); }, [connectWebSocket]); const handleSendMessage = useCallback(() => { if (input.trim()) { try { sendMessage(input.trim()); setInput(""); } catch (error) { console.error("Failed to send message:", error); } } }, [input, sendMessage]); const handleVoiceInput = useCallback(() => { navigate("/voice-to-voice"); }, [navigate]); const handleBotIconClick = useCallback((event: React.MouseEvent) => { setAnchorEl(event.currentTarget); }, []); const handleMenuClose = useCallback(() => { setAnchorEl(null); }, []); const handleLogout = useCallback(async () => { try { await logout(); } finally { authContext?.logout(); } }, [authContext]); return ( {!isOpen && ( )} Chat Bot Logout {messages.map((msg, index) => ( {msg.sender === "bot" && ( )} {msg.sender === "bot" ? ( {`${msg.text}${!msg.isComplete ? "▊" : ""}`} ) : ( msg.text )} ))} setInput(e.target.value)} onKeyDown={(e) => e.key === "Enter" && handleSendMessage()} placeholder="Type a message..." sx={{ flex: 1, px: 2, py: 1, border: "1px solid #ddd", borderRadius: "20px", bgcolor: "#f9f9f9", "& input::placeholder": { color: "#aaa", }, }} /> {input.length === 0 ? : } ); }; export default ChatScreen;