// 全局聊天悬浮窗 'use client'; import { useState, useEffect, useRef } from 'react'; import { MessageCircle, X, Send, Smile, Minimize2, Maximize2 } from 'lucide-react'; import { useWatchRoomContextSafe } from '@/components/WatchRoomProvider'; const EMOJI_LIST = ['😀', '😂', '😍', '🥰', '😎', '🤔', '👍', '👏', '🎉', '❤️', '🔥', '⭐']; export default function ChatFloatingWindow() { const watchRoom = useWatchRoomContextSafe(); const [isOpen, setIsOpen] = useState(false); const [isMinimized, setIsMinimized] = useState(false); const [message, setMessage] = useState(''); const [showEmojiPicker, setShowEmojiPicker] = useState(false); const messagesEndRef = useRef(null); // 自动滚动到底部 useEffect(() => { if (messagesEndRef.current && watchRoom?.currentRoom) { messagesEndRef.current.scrollIntoView({ behavior: 'smooth' }); } }, [watchRoom?.chatMessages, watchRoom?.currentRoom]); // 如果没有加入房间,不显示聊天按钮 if (!watchRoom?.currentRoom) { return null; } const { chatMessages, sendChatMessage, members, isOwner } = watchRoom; const handleSendMessage = () => { if (!message.trim()) return; sendChatMessage(message.trim(), 'text'); setMessage(''); setShowEmojiPicker(false); }; const handleSendEmoji = (emoji: string) => { sendChatMessage(emoji, 'emoji'); setShowEmojiPicker(false); }; const handleKeyDown = (e: React.KeyboardEvent) => { if (e.key === 'Enter' && !e.shiftKey) { e.preventDefault(); handleSendMessage(); } }; const formatTime = (timestamp: number) => { const date = new Date(timestamp); return date.toLocaleTimeString('zh-CN', { hour: '2-digit', minute: '2-digit', }); }; // 悬浮按钮 if (!isOpen) { return ( ); } // 最小化状态 if (isMinimized) { return (
聊天室
); } // 完整聊天窗口 return (
{/* 头部 */}

聊天室

{members.length} 人在线

{/* 消息列表 */}
{chatMessages.length === 0 ? (

还没有消息

发送第一条消息吧

) : ( <> {chatMessages.map((msg) => (
{msg.userName} {formatTime(msg.timestamp)}
{msg.content}
))}
)}
{/* 输入区域 */}
{/* 表情选择器 */} {showEmojiPicker && (
{EMOJI_LIST.map((emoji) => ( ))}
)}
setMessage(e.target.value)} onKeyDown={handleKeyDown} placeholder="输入消息..." className="flex-1 rounded-lg bg-gray-700 px-3 py-2 text-sm text-white placeholder-gray-400 focus:outline-none focus:ring-2 focus:ring-green-500" maxLength={200} />
{/* 房间信息提示 */}
{isOwner ? ( 👑 您是房主 ) : ( 房间: {watchRoom.currentRoom.name} )}
); }