'use client'; import { useHello, useTRPC, useWebSocket, MessageType } from '@repo/client'; import { useQuery } from '@tanstack/react-query'; import { useRef, useState, useEffect } from 'react'; export default function WebSocketPage() { const trpc = useTRPC(); const [message, setMessage] = useState(''); const [roomId, setRoomId] = useState(''); const messagesEndRef = useRef(null); // 使用 WebSocket hook const { messages, currentRoom, connecting, joinRoom, leaveRoom, sendMessage } = useWebSocket(); // 滚动到底部 const scrollToBottom = () => { messagesEndRef.current?.scrollIntoView({ behavior: 'smooth' }); }; // 当消息更新时自动滚动到底部 useEffect(() => { scrollToBottom(); }, [messages]); const handleJoinRoom = async () => { const success = await joinRoom(roomId.trim()); if (success) { setRoomId(''); } }; const handleLeaveRoom = async () => { await leaveRoom(); }; const handleSendMessage = async () => { const success = await sendMessage({ text: message, type: MessageType.TEXT, }); if (success) { setMessage(''); } }; // 处理按回车发送消息 const handleKeyPress = (e: React.KeyboardEvent) => { if (e.key === 'Enter' && !e.shiftKey) { e.preventDefault(); handleSendMessage(); } }; // 处理房间ID输入框的回车事件 const handleRoomKeyPress = (e: React.KeyboardEvent) => { if (e.key === 'Enter' && !e.shiftKey) { e.preventDefault(); handleJoinRoom(); } }; return (

WebSocket 房间测试

{/* 房间管理 */}

房间管理

{!currentRoom ? (
setRoomId(e.target.value)} onKeyPress={handleRoomKeyPress} disabled={connecting} className="border border-gray-300 rounded px-3 py-2 flex-1" placeholder="输入房间ID..." />
) : (
当前房间: {currentRoom}
)}
{/* 消息显示区域 */} {currentRoom && (
{messages.map((msg, index) => (
{msg.data.type === MessageType.IMAGE && msg.data.fileUri && ( 图片消息 )} {msg.data.type === MessageType.FILE && msg.data.fileUri && ( 下载文件 )} {msg.data.text &&
{msg.data.text}
}
))}
setMessage(e.target.value)} onKeyPress={handleKeyPress} disabled={connecting} className="border border-gray-300 rounded px-3 py-2 flex-1" placeholder="输入消息..." />
)} {!currentRoom && (

提示: 请先加入一个房间开始聊天

打开多个浏览器窗口,输入相同的房间ID来测试房间内通信

)}
); }