From c6acbfd96394db74c7e113745776fef4617f440e Mon Sep 17 00:00:00 2001 From: MatrixSeven Date: Sat, 9 Aug 2025 23:00:23 +0800 Subject: [PATCH] =?UTF-8?q?feat:=E6=B7=BB=E5=8A=A0stun=E6=9C=8D=E5=8A=A1,?= =?UTF-8?q?=E4=BF=AE=E5=A4=8D=E6=96=87=E5=AD=97=E6=88=BF=E9=97=B4=E6=97=A0?= =?UTF-8?q?=E9=99=90=E5=B0=9D=E8=AF=95=E5=8A=A0=E5=85=A5bug?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../components/webrtc/WebRTCTextReceiver.tsx | 57 +++++++++++-------- .../hooks/webrtc/useSharedWebRTCManager.ts | 38 +++++++------ 2 files changed, 53 insertions(+), 42 deletions(-) diff --git a/chuan-next/src/components/webrtc/WebRTCTextReceiver.tsx b/chuan-next/src/components/webrtc/WebRTCTextReceiver.tsx index 81288fe..1ad7a22 100644 --- a/chuan-next/src/components/webrtc/WebRTCTextReceiver.tsx +++ b/chuan-next/src/components/webrtc/WebRTCTextReceiver.tsx @@ -15,25 +15,26 @@ interface WebRTCTextReceiverProps { onRestart?: () => void; } -export const WebRTCTextReceiver: React.FC = ({ - initialCode = '', +export const WebRTCTextReceiver: React.FC = ({ + initialCode = '', onPreviewImage, onRestart }) => { const { showToast } = useToast(); - + // 状态管理 const [pickupCode, setPickupCode] = useState(''); const [inputCode, setInputCode] = useState(initialCode); const [receivedText, setReceivedText] = useState(''); // 实时接收的文本内容 - const [receivedImages, setReceivedImages] = useState>([]); + const [receivedImages, setReceivedImages] = useState>([]); const [isTyping, setIsTyping] = useState(false); const [isValidating, setIsValidating] = useState(false); - + + // 创建共享连接 [需要优化] const connection = useSharedWebRTCManager(); - + // 使用共享连接创建业务层 const textTransfer = useTextTransferBusiness(connection); const fileTransfer = useFileTransferBusiness(connection); @@ -49,10 +50,11 @@ export const WebRTCTextReceiver: React.FC = ({ // 是否有任何连接 const hasAnyConnection = textTransfer.isConnected || fileTransfer.isConnected; - + // 是否正在连接 const isAnyConnecting = textTransfer.isConnecting || fileTransfer.isConnecting; + // 是否有任何错误 const hasAnyError = textTransfer.connectionError || fileTransfer.connectionError; @@ -60,20 +62,20 @@ export const WebRTCTextReceiver: React.FC = ({ const validatePickupCode = async (code: string): Promise => { try { setIsValidating(true); - + console.log('开始验证取件码:', code); const response = await fetch(`/api/room-info?code=${code}`); const data = await response.json(); - + console.log('验证响应:', { status: response.status, data }); - + if (!response.ok || !data.success) { const errorMessage = data.message || '取件码验证失败'; showToast(errorMessage, 'error'); console.log('验证失败:', errorMessage); return false; } - + console.log('取件码验证成功:', data.room); return true; } catch (error) { @@ -93,11 +95,11 @@ export const WebRTCTextReceiver: React.FC = ({ setReceivedText(''); setReceivedImages([]); setIsTyping(false); - + // 断开连接 textTransfer.disconnect(); fileTransfer.disconnect(); - + if (onRestart) { onRestart(); } @@ -106,7 +108,7 @@ export const WebRTCTextReceiver: React.FC = ({ // 加入房间 const joinRoom = useCallback(async (code: string) => { const trimmedCode = code.trim().toUpperCase(); - + if (!trimmedCode || trimmedCode.length !== 6) { showToast('请输入正确的6位取件码', "error"); return; @@ -124,15 +126,15 @@ export const WebRTCTextReceiver: React.FC = ({ try { console.log('=== 开始验证和连接房间 ===', trimmedCode); - + const isValid = await validatePickupCode(trimmedCode); if (!isValid) { return; } - + setPickupCode(trimmedCode); await connectAll(trimmedCode, 'receiver'); - + console.log('=== 房间连接成功 ===', trimmedCode); showToast(`成功加入消息房间: ${trimmedCode}`, "success"); } catch (error) { @@ -185,16 +187,23 @@ export const WebRTCTextReceiver: React.FC = ({ if (initialCode && initialCode.length === 6 && !hasAnyConnection && !isAnyConnecting) { console.log('=== 自动连接初始代码 ===', initialCode); setInputCode(initialCode); - + const timeoutId = setTimeout(() => { + console.log('=== setTimeout 触发,检查最新状态 ==='); + if (!hasAnyConnection && !isAnyConnecting) { + console.log('=== 最新状态检查通过,调用 joinRoom ===', initialCode); joinRoom(initialCode); } }, 500); - - return () => clearTimeout(timeoutId); + return () => { + console.log('=== 清理 setTimeout ==='); + clearTimeout(timeoutId); + }; } - }, [initialCode, hasAnyConnection, isAnyConnecting, joinRoom]); + // 注意:这里故意不包含 joinRoom 作为依赖, + // 因为我们要的是"一次性"的自动连接行为 + }, [initialCode, hasAnyConnection, isAnyConnecting]); return (
@@ -298,7 +307,7 @@ export const WebRTCTextReceiver: React.FC = ({ )}
- +