【m】修改渲染顺序
This commit is contained in:
@@ -157,7 +157,7 @@ window.addEventListener('DOMContentLoaded', async () => {
|
|||||||
//await store.init();
|
//await store.init();
|
||||||
|
|
||||||
// 初始化渲染器
|
// 初始化渲染器
|
||||||
new UIRenderer(store);
|
const renderer = new UIRenderer(store);
|
||||||
|
|
||||||
// 加入通话
|
// 加入通话
|
||||||
await store.joinCall(connectionId);
|
await store.joinCall(connectionId);
|
||||||
@@ -165,6 +165,8 @@ window.addEventListener('DOMContentLoaded', async () => {
|
|||||||
// 设置WebRTC连接
|
// 设置WebRTC连接
|
||||||
await store.setUp(connectionId);
|
await store.setUp(connectionId);
|
||||||
|
|
||||||
|
renderer.renderHeaderTitle();
|
||||||
|
|
||||||
// 绑定DOM事件
|
// 绑定DOM事件
|
||||||
bindDomEvents();
|
bindDomEvents();
|
||||||
|
|
||||||
|
|||||||
@@ -5,6 +5,7 @@
|
|||||||
import { formatTime, formatTimestamp, toggleElement, toggleButtonState } from './utils.js';
|
import { formatTime, formatTimestamp, toggleElement, toggleButtonState } from './utils.js';
|
||||||
import { mockCallSession } from './models.js';
|
import { mockCallSession } from './models.js';
|
||||||
import chatMessage from './chatmessage.js';
|
import chatMessage from './chatmessage.js';
|
||||||
|
import store from './store.js';
|
||||||
class UIRenderer {
|
class UIRenderer {
|
||||||
constructor(stateManager) {
|
constructor(stateManager) {
|
||||||
this.stateManager = stateManager;
|
this.stateManager = stateManager;
|
||||||
@@ -103,60 +104,74 @@ class UIRenderer {
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
// 渲染状态变化
|
/**
|
||||||
|
* 渲染方法 - 根据状态变化更新UI
|
||||||
|
* @param {Object} state - 当前应用状态
|
||||||
|
* @param {Object} changes - 状态变化对象
|
||||||
|
*/
|
||||||
render(state, changes) {
|
render(state, changes) {
|
||||||
|
// 根据变化类型执行不同的渲染操作
|
||||||
switch (changes.type) {
|
switch (changes.type) {
|
||||||
case 'INIT':
|
case 'INIT':
|
||||||
this.renderHeader(state.session);
|
// 初始化渲染 - 渲染所有UI元素
|
||||||
this.renderRemoteVideo(state.session.remoteUser);
|
this.renderRemoteVideo(state.session.remoteUser); // 渲染远程视频
|
||||||
this.renderLocalVideo(state.session.localUser, state.localStream);
|
this.renderLocalVideo(state.session.localUser, state.localStream); // 渲染本地视频
|
||||||
this.renderControlButtons(state.session.localUser.mediaState);
|
this.renderControlButtons(state.session.localUser.mediaState); // 渲染控制按钮
|
||||||
this.renderChatMessages(chatMessage.getMessageState().messages);
|
this.renderChatMessages(chatMessage.getMessageState().messages); // 渲染聊天消息
|
||||||
this.renderUserList(state.session.localUser, state.session.remoteUser);
|
this.renderUserList(state.session.localUser, state.session.remoteUser); // 渲染用户列表
|
||||||
|
this.renderHeader(state.session); // 渲染头部信息
|
||||||
// 初始化时检查远程流状态,显示或隐藏占位背景
|
// 初始化时检查远程流状态,显示或隐藏占位背景
|
||||||
if (this.elements.remoteVideoPlaceholder) {
|
if (this.elements.remoteVideoPlaceholder) {
|
||||||
if (state.remoteStream) {
|
if (state.remoteStream) {
|
||||||
this.elements.remoteVideoPlaceholder.classList.add('hidden');
|
this.elements.remoteVideoPlaceholder.classList.add('hidden'); // 有远程流时隐藏占位背景
|
||||||
} else {
|
} else {
|
||||||
this.elements.remoteVideoPlaceholder.classList.remove('hidden');
|
this.elements.remoteVideoPlaceholder.classList.remove('hidden'); // 无远程流时显示占位背景
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
case 'DURATION_UPDATE':
|
case 'DURATION_UPDATE':
|
||||||
|
// 通话时长更新 - 渲染通话时长
|
||||||
this.renderCallDuration(changes.duration);
|
this.renderCallDuration(changes.duration);
|
||||||
break;
|
break;
|
||||||
case 'LOCAL_MEDIA_CHANGE':
|
case 'LOCAL_MEDIA_CHANGE':
|
||||||
this.renderControlButtons(state.session.localUser.mediaState);
|
// 本地媒体状态变化 - 更新相关UI
|
||||||
this.renderLocalVideo(state.session.localUser, state.localStream);
|
this.renderControlButtons(state.session.localUser.mediaState); // 渲染控制按钮
|
||||||
this.renderLocalUserStatus(state.session.localUser);
|
this.renderLocalVideo(state.session.localUser, state.localStream); // 渲染本地视频
|
||||||
this.renderUserList(state.session.localUser, state.session.remoteUser);
|
this.renderLocalUserStatus(state.session.localUser); // 渲染本地用户状态
|
||||||
|
this.renderUserList(state.session.localUser, state.session.remoteUser); // 渲染用户列表
|
||||||
break;
|
break;
|
||||||
case 'LOCAL_STREAM_OBTAINED':
|
case 'LOCAL_STREAM_OBTAINED':
|
||||||
this.renderLocalStream(state.localStream);
|
// 本地流获取成功 - 更新本地视频显示
|
||||||
this.renderLocalVideo(state.session.localUser, state.localStream);
|
this.renderLocalStream(state.localStream); // 渲染本地流
|
||||||
|
this.renderLocalVideo(state.session.localUser, state.localStream); // 渲染本地视频
|
||||||
break;
|
break;
|
||||||
case 'REMOTE_STREAM_OBTAINED':
|
case 'REMOTE_STREAM_OBTAINED':
|
||||||
this.renderRemoteStream(state.remoteStream);
|
// 远程流获取成功 - 更新远程视频显示
|
||||||
|
this.renderRemoteStream(state.remoteStream); // 渲染远程流
|
||||||
// 当获取到远程流时,隐藏连接中提示
|
// 当获取到远程流时,隐藏连接中提示
|
||||||
if (this.elements.connectingOverlay) {
|
if (this.elements.connectingOverlay) {
|
||||||
this.elements.connectingOverlay.classList.add('hidden');
|
this.elements.connectingOverlay.classList.add('hidden');
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
case 'REMOTE_MEDIA_CHANGE':
|
case 'REMOTE_MEDIA_CHANGE':
|
||||||
this.renderRemoteVideo(state.session.remoteUser);
|
// 远程媒体状态变化 - 更新远程视频和用户列表
|
||||||
this.renderUserList(state.session.localUser, state.session.remoteUser);
|
this.renderRemoteVideo(state.session.remoteUser); // 渲染远程视频
|
||||||
|
this.renderUserList(state.session.localUser, state.session.remoteUser); // 渲染用户列表
|
||||||
break;
|
break;
|
||||||
case 'USER_LIST_UPDATE':
|
case 'USER_LIST_UPDATE':
|
||||||
|
// 用户列表更新 - 重新渲染用户列表
|
||||||
this.renderUserList(changes.localUser, changes.remoteUser);
|
this.renderUserList(changes.localUser, changes.remoteUser);
|
||||||
break;
|
break;
|
||||||
case 'NETWORK_CHANGE':
|
case 'NETWORK_CHANGE':
|
||||||
|
// 网络状态变化 - 渲染网络状态
|
||||||
this.renderNetworkStatus(changes.quality);
|
this.renderNetworkStatus(changes.quality);
|
||||||
break;
|
break;
|
||||||
case 'CALL_STATUS_CHANGE':
|
case 'CALL_STATUS_CHANGE':
|
||||||
|
// 通话状态变化 - 渲染通话状态
|
||||||
this.renderCallStatus(changes.status);
|
this.renderCallStatus(changes.status);
|
||||||
break;
|
break;
|
||||||
case 'CALL_ENDED':
|
case 'CALL_ENDED':
|
||||||
|
// 通话结束 - 渲染通话结束界面
|
||||||
this.renderCallEnded();
|
this.renderCallEnded();
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
@@ -175,15 +190,8 @@ class UIRenderer {
|
|||||||
|
|
||||||
// 渲染头部
|
// 渲染头部
|
||||||
renderHeader(session) {
|
renderHeader(session) {
|
||||||
if (this.elements.headerTitle) {
|
|
||||||
// 未连接时不显示红框部分
|
|
||||||
if (session.status === 'idle' || session.status === 'connecting') {
|
|
||||||
this.elements.headerTitle.textContent = '通话';
|
|
||||||
} else {
|
|
||||||
this.elements.headerTitle.textContent = `与 ${session.remoteUser.name} 的通话`;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
|
this.renderHeaderTitle();
|
||||||
if (this.elements.encryptionBadge) {
|
if (this.elements.encryptionBadge) {
|
||||||
toggleElement(this.elements.encryptionBadge, session.isEncrypted);
|
toggleElement(this.elements.encryptionBadge, session.isEncrypted);
|
||||||
}
|
}
|
||||||
@@ -198,6 +206,14 @@ class UIRenderer {
|
|||||||
|
|
||||||
this.renderCallDuration(session.duration);
|
this.renderCallDuration(session.duration);
|
||||||
}
|
}
|
||||||
|
renderHeaderTitle() {
|
||||||
|
if (this.elements.headerTitle) {
|
||||||
|
const connectionId = store.getConnectionId() || '';
|
||||||
|
// 未连接时不显示红框部分
|
||||||
|
this.elements.headerTitle.textContent = `通话 (${connectionId})`;
|
||||||
|
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
// 渲染通话时长
|
// 渲染通话时长
|
||||||
renderCallDuration(duration) {
|
renderCallDuration(duration) {
|
||||||
|
|||||||
@@ -182,33 +182,6 @@ class CallStateManager {
|
|||||||
const audioTracks = this.state.localStream.getAudioTracks();
|
const audioTracks = this.state.localStream.getAudioTracks();
|
||||||
console.log('New audio tracks:', audioTracks);
|
console.log('New audio tracks:', audioTracks);
|
||||||
|
|
||||||
// 更新视频轨道
|
|
||||||
if (videoTracks.length > 0) {
|
|
||||||
const newVideoTrack = videoTracks[0];
|
|
||||||
console.log('Using new video track:', newVideoTrack);
|
|
||||||
|
|
||||||
if (videoTransceivers.length > 0) {
|
|
||||||
// 替换现有的视频轨道
|
|
||||||
for (const transceiver of videoTransceivers) {
|
|
||||||
try {
|
|
||||||
console.log('Replacing video track in transceiver:', transceiver);
|
|
||||||
await transceiver.sender.replaceTrack(newVideoTrack);
|
|
||||||
console.log('Successfully replaced video track');
|
|
||||||
} catch (error) {
|
|
||||||
console.error('Error replacing video track:', error);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
} else {
|
|
||||||
// 添加新的视频收发器
|
|
||||||
try {
|
|
||||||
console.log('Adding new video transceiver');
|
|
||||||
const transceiver = this.renderstreaming.addTransceiver(newVideoTrack, { direction: 'sendonly' });
|
|
||||||
console.log('Added new video transceiver:', transceiver);
|
|
||||||
} catch (error) {
|
|
||||||
console.error('Error adding new video transceiver:', error);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
// 更新音频轨道
|
// 更新音频轨道
|
||||||
if (audioTracks.length > 0) {
|
if (audioTracks.length > 0) {
|
||||||
@@ -237,6 +210,35 @@ class CallStateManager {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
// 更新视频轨道
|
||||||
|
if (videoTracks.length > 0) {
|
||||||
|
const newVideoTrack = videoTracks[0];
|
||||||
|
console.log('Using new video track:', newVideoTrack);
|
||||||
|
|
||||||
|
if (videoTransceivers.length > 0) {
|
||||||
|
// 替换现有的视频轨道
|
||||||
|
for (const transceiver of videoTransceivers) {
|
||||||
|
try {
|
||||||
|
console.log('Replacing video track in transceiver:', transceiver);
|
||||||
|
await transceiver.sender.replaceTrack(newVideoTrack);
|
||||||
|
console.log('Successfully replaced video track');
|
||||||
|
} catch (error) {
|
||||||
|
console.error('Error replacing video track:', error);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
// 添加新的视频收发器
|
||||||
|
try {
|
||||||
|
console.log('Adding new video transceiver');
|
||||||
|
const transceiver = this.renderstreaming.addTransceiver(newVideoTrack, { direction: 'sendonly' });
|
||||||
|
console.log('Added new video transceiver:', transceiver);
|
||||||
|
} catch (error) {
|
||||||
|
console.error('Error adding new video transceiver:', error);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
// 延迟设置编解码器偏好,确保收发器已完全创建
|
// 延迟设置编解码器偏好,确保收发器已完全创建
|
||||||
setTimeout(() => {
|
setTimeout(() => {
|
||||||
@@ -294,6 +296,7 @@ class CallStateManager {
|
|||||||
// 设置状态为连接中
|
// 设置状态为连接中
|
||||||
this.state.session.status = 'connecting';
|
this.state.session.status = 'connecting';
|
||||||
this.notify({ type: 'CALL_STATUS_CHANGE', status: 'connecting' });
|
this.notify({ type: 'CALL_STATUS_CHANGE', status: 'connecting' });
|
||||||
|
|
||||||
// 确保本地流已经初始化
|
// 确保本地流已经初始化
|
||||||
if (!this.state.localStream) {
|
if (!this.state.localStream) {
|
||||||
console.log('Local stream not available, waiting for initialization...');
|
console.log('Local stream not available, waiting for initialization...');
|
||||||
|
|||||||
Reference in New Issue
Block a user