import React, { useState, useEffect, useRef } from 'react'; import { Send, LogOut, Users, MessageCircle } from 'lucide-react'; import { User, Message, OnlineUser } from '../types'; import { messageAPI } from '../utils/api'; import { socketService } from '../utils/socket'; interface ChatProps { user: User; onLogout: () => void; } const Chat: React.FC = ({ user, onLogout }) => { const [messages, setMessages] = useState([]); const [newMessage, setNewMessage] = useState(''); const [onlineUsers, setOnlineUsers] = useState([]); const [loading, setLoading] = useState(true); const messagesEndRef = useRef(null); const scrollToBottom = () => { messagesEndRef.current?.scrollIntoView({ behavior: 'smooth' }); }; useEffect(() => { scrollToBottom(); }, [messages]); useEffect(() => { const initializeChat = async () => { try { // 获取历史消息 const historyMessages = await messageAPI.getMessages(); setMessages(historyMessages); // 连接Socket const token = localStorage.getItem('token'); if (token) { const socket = socketService.connect(token); // 监听新消息 socketService.onNewMessage((message: Message) => { setMessages(prev => [...prev, message]); }); // 监听用户上线 socketService.onUserJoined((userData) => { console.log(`${userData.username} 加入了聊天室`); }); // 监听用户下线 socketService.onUserLeft((userData) => { console.log(`${userData.username} 离开了聊天室`); }); // 监听在线用户列表 socketService.onOnlineUsers((users: OnlineUser[]) => { setOnlineUsers(users); }); } } catch (error) { console.error('初始化聊天失败:', error); } finally { setLoading(false); } }; initializeChat(); // 清理函数 return () => { socketService.offAllListeners(); socketService.disconnect(); }; }, []); const handleSendMessage = (e: React.FormEvent) => { e.preventDefault(); if (newMessage.trim()) { socketService.sendMessage(newMessage.trim()); setNewMessage(''); } }; const handleLogout = () => { socketService.disconnect(); onLogout(); }; const formatTime = (timestamp: Date) => { return new Date(timestamp).toLocaleTimeString('zh-CN', { hour: '2-digit', minute: '2-digit', }); }; if (loading) { return (
); } return (
{/* 侧边栏 */}
{/* 用户信息 */}
{user.username.charAt(0).toUpperCase()}

{user.username}

{user.email}

{/* 在线用户 */}

在线用户 ({onlineUsers.length})

{onlineUsers.map((onlineUser) => (
{onlineUser.username.charAt(0).toUpperCase()}
{onlineUser.username} {onlineUser.userId === user.id && ( (你) )}
))}
{/* 主聊天区域 */}
{/* 聊天头部 */}

聊天室

{/* 消息列表 */}
{messages.map((message) => (
{message.sender.id !== user.id && (
{message.sender.username}
)}
{message.content}
{formatTime(message.timestamp)}
))}
{/* 消息输入 */}
setNewMessage(e.target.value)} placeholder="输入消息..." className="flex-1 input-field" />
); }; export default Chat;