import React, { useState, useEffect, useRef } from "react"; import Input from "../Layout/Input"; import { useAuth } from "../../context/AuthContext"; import { useSocket } from "../../context/SocketContext"; import Button, { ToggleButton } from "../Layout/Button"; import AuthModal from "../Auth/AuthModal"; interface ChatMessage { chatter_username: string; message: string; time_sent: string; } interface ChatPanelProps { streamId: number; } const ChatPanel: React.FC = ({ streamId }) => { const { socket, isConnected } = useSocket(); const [messages, setMessages] = useState([]); const [inputMessage, setInputMessage] = useState(""); const chatContainerRef = useRef(null); const { isLoggedIn, username } = useAuth(); // Join chat room when component mounts useEffect(() => { if (socket && isConnected) { // Add username check socket.emit("join", { username: username ? username : "Guest", stream_id: streamId, }); // Handle beforeunload event const handleBeforeUnload = () => { socket.emit("leave", { stream_id: streamId }); socket.disconnect(); }; window.addEventListener("beforeunload", handleBeforeUnload); // Load initial chat history fetch(`/api/chat/${streamId}`) .then((response) => { if (!response.ok) throw new Error("Failed to fetch chat history"); return response.json(); }) .then((data) => { if (data.chat_history) { setMessages(data.chat_history); } }) .catch((error) => { console.error("Error loading chat history:", error); }); // Handle incoming messages socket.on("new_message", (data: ChatMessage) => { console.log("New message:", data); setMessages((prev) => [...prev, data]); }); // Cleanup function return () => { window.removeEventListener("beforeunload", handleBeforeUnload); socket.emit("leave", { stream_id: streamId }); socket.disconnect(); }; } }, [socket, isConnected, username, streamId]); // Auto-scroll to bottom when new messages arrive useEffect(() => { if (chatContainerRef.current) { chatContainerRef.current.scrollTop = chatContainerRef.current.scrollHeight; } }, [messages]); const sendChat = () => { if (!inputMessage.trim() || !socket || !isConnected) { console.log("Invalid message or socket not connected"); return; } socket.emit("send_message", { username: username, stream_id: streamId, message: inputMessage.trim(), }); setInputMessage(""); }; const handleKeyPress = (e: React.KeyboardEvent) => { if (e.key === "Enter" && !e.shiftKey) { e.preventDefault(); sendChat(); } }; //added to show login/reg if not const [showAuthModal, setShowAuthModal] = useState(false); useEffect(() => { if (showAuthModal) { document.body.style.overflow = "hidden"; } else { document.body.style.overflow = "unset"; } return () => { document.body.style.overflow = "unset"; }; }, [showAuthModal]); return ( <>

Stream Chat

{messages.map((msg, index) => (
{" "} {msg.chatter_username}:{" "} {msg.message} {new Date(msg.time_sent).toLocaleTimeString()}
))}
{isLoggedIn ? ( <> setInputMessage(e.target.value)} onKeyDown={handleKeyPress} placeholder={isLoggedIn ? "Type a message..." : "Login to chat"} disabled={!isLoggedIn} extraClasses="flex-grow focus:w-[20vw]" onClick={() => !isLoggedIn && setShowAuthModal(true)} /> ) : ( )}
{showAuthModal && (
setShowAuthModal(false)} />
)}
); }; export default ChatPanel;