diff --git a/WebApp/client/public/images/screenshot.png b/WebApp/client/public/images/screenshot.png new file mode 100644 index 0000000..914f009 Binary files /dev/null and b/WebApp/client/public/images/screenshot.png differ diff --git a/WebApp/client/public/onebyone/index.html b/WebApp/client/public/onebyone/index.html index 70aa3e9..48fc484 100644 --- a/WebApp/client/public/onebyone/index.html +++ b/WebApp/client/public/onebyone/index.html @@ -360,9 +360,11 @@ -->
- + + 5 * 1024 * 1024) { + showNotification('图片文件不能超过5MB', 3000); + return; + } + + // 读取图片文件 + const reader = new FileReader(); + reader.onload = function(e) { + const imageUrl = e.target.result; + sendImageMessage(imageUrl, file.name); + }; + reader.readAsDataURL(file); + + // 重置文件输入 + event.target.value = ''; + } + }; + + // 发送图片消息 + function sendImageMessage(imageUrl, fileName) { + const state = store.getState(); + const newMessage = { + id: generateId(), + senderId: state.session.localUser.id, + senderName: state.session.localUser.name, + senderAvatar: state.session.localUser.avatar, + content: imageUrl, + fileName: fileName, + type: 'file', + timestamp: new Date().toISOString(), + isSelf: true + }; + + store.addMessage(newMessage); + + // 发送消息到服务器 + // wsManager.send('send-message', newMessage); + } + // 键盘快捷键 document.addEventListener('keydown', (event) => { // 空格键静音 diff --git a/WebApp/client/public/onebyone/models.js b/WebApp/client/public/onebyone/models.js index b0d012d..969bc51 100644 --- a/WebApp/client/public/onebyone/models.js +++ b/WebApp/client/public/onebyone/models.js @@ -101,7 +101,7 @@ const mockMessages = [ id: "msg-001", senderId: "system", senderName: "系统", - senderAvatar: "https://via.placeholder.com/100", + senderAvatar: "/images/screenshot.png", content: "通话已建立连接", type: "system", timestamp: "2024-01-15T14:30:00.000Z", diff --git a/WebApp/client/public/onebyone/renderer.js b/WebApp/client/public/onebyone/renderer.js index fffc1a3..d9fd47c 100644 --- a/WebApp/client/public/onebyone/renderer.js +++ b/WebApp/client/public/onebyone/renderer.js @@ -38,6 +38,8 @@ class UIRenderer { sidebar: document.getElementById('sidebar'), chatContent: document.getElementById('chatContent'), userList: document.getElementById('userList'), + localMediaStatus: document.getElementById('localMediaStatus'), + localMuteIcon: document.querySelector('[data-field="localUser.muteIcon"]'), // 控制按钮 micBtn: document.getElementById('micBtn'), @@ -66,6 +68,7 @@ class UIRenderer { case 'LOCAL_MEDIA_CHANGE': this.renderControlButtons(state.session.localUser.mediaState); this.renderLocalVideo(state.session.localUser); + this.renderLocalUserStatus(state.session.localUser); break; case 'REMOTE_MEDIA_CHANGE': this.renderRemoteVideo(state.session.remoteUser); @@ -142,6 +145,36 @@ class UIRenderer { if (this.elements.localAudioWave) { toggleElement(this.elements.localAudioWave, localUser.mediaState.isSpeaking); } + + // 同时渲染本地用户状态 + this.renderLocalUserStatus(localUser); + } + + // 渲染本地用户状态 + renderLocalUserStatus(localUser) { + // 更新本地媒体状态文本 + if (this.elements.localMediaStatus) { + if (!localUser.mediaState.audio) { + this.elements.localMediaStatus.textContent = '静音中'; + this.elements.localMediaStatus.className = 'text-xs text-gray-500'; + } else if (!localUser.mediaState.video) { + this.elements.localMediaStatus.textContent = '视频关闭'; + this.elements.localMediaStatus.className = 'text-xs text-gray-500'; + } else { + this.elements.localMediaStatus.textContent = '在线'; + this.elements.localMediaStatus.className = 'text-xs text-green-400'; + } + } + + // 更新静音图标 + if (this.elements.localMuteIcon) { + if (!localUser.mediaState.audio) { + this.elements.localMuteIcon.classList.remove('hidden'); + this.elements.localMuteIcon.className = 'fas fa-microphone-slash text-gray-500 text-xs'; + } else { + this.elements.localMuteIcon.classList.add('hidden'); + } + } } // 渲染控制按钮 @@ -200,6 +233,24 @@ class UIRenderer { messageDiv.className = messageClass; messageDiv.dataset.messageId = message.id; + let contentHTML = ''; + if (message.type === 'file' && message.content.startsWith('data:image/')) { + // 图片消息 + contentHTML = ` +
+ ${message.fileName || '图片'} + ${message.fileName ? `
${message.fileName}
` : ''} +
+ `; + } else { + // 文本消息 + contentHTML = ` +
+ ${message.content} +
+ `; + } + messageDiv.innerHTML = `
@@ -209,7 +260,7 @@ class UIRenderer {
- ${message.content} + ${contentHTML}
`; diff --git a/WebApp/client/public/onebyone/style.css b/WebApp/client/public/onebyone/style.css index e40fb88..fd20bde 100644 --- a/WebApp/client/public/onebyone/style.css +++ b/WebApp/client/public/onebyone/style.css @@ -134,6 +134,30 @@ body { border-top-right-radius: 0; } +/* 图片消息样式 */ +.message-image-container { + display: flex; + flex-direction: column; + gap: 8px; +} + +.message-image { + max-width: 200px; + max-height: 200px; + border-radius: 8px; + object-fit: cover; +} + +.message-image-name { + font-size: 12px; + color: rgba(255, 255, 255, 0.7); + text-align: center; +} + +.message-text { + word-wrap: break-word; +} + .custom-scrollbar::-webkit-scrollbar { width: 6px; }