【m】开始尝试接入后端
This commit is contained in:
@@ -3,7 +3,7 @@
|
||||
* 负责将状态映射到DOM,与状态管理解耦
|
||||
*/
|
||||
import { formatTime, formatTimestamp, toggleElement, toggleButtonState } from './utils.js';
|
||||
|
||||
import {mockCallSession } from './models.js';
|
||||
class UIRenderer {
|
||||
constructor(stateManager) {
|
||||
this.stateManager = stateManager;
|
||||
@@ -40,14 +40,14 @@ class UIRenderer {
|
||||
userList: document.getElementById('userList'),
|
||||
localMediaStatus: document.getElementById('localMediaStatus'),
|
||||
localMuteIcon: document.querySelector('[data-field="localUser.muteIcon"]'),
|
||||
|
||||
// 控制按钮
|
||||
micBtn: document.getElementById('micBtn'),
|
||||
videoBtn: document.getElementById('videoBtn'),
|
||||
recordBtn: document.getElementById('recordBtn'),
|
||||
connectionQuality: document.getElementById('connectionQuality')
|
||||
};
|
||||
|
||||
// 订阅状态变化
|
||||
this.unsubscribe = stateManager.subscribe(this.render.bind(this));
|
||||
// 初始化渲染
|
||||
this.render(this.stateManager.getState(), { type: 'INIT' });
|
||||
}
|
||||
@@ -58,23 +58,27 @@ class UIRenderer {
|
||||
case 'INIT':
|
||||
this.renderHeader(state.session);
|
||||
this.renderRemoteVideo(state.session.remoteUser);
|
||||
this.renderLocalVideo(state.session.localUser);
|
||||
this.renderLocalVideo(state.session.localUser, state.localStream);
|
||||
this.renderControlButtons(state.session.localUser.mediaState);
|
||||
this.renderChatMessages(state.messages);
|
||||
this.renderUserList(state.session.localUser, state.session.remoteUser);
|
||||
break;
|
||||
case 'DURATION_UPDATE':
|
||||
this.renderCallDuration(changes.duration);
|
||||
break;
|
||||
case 'LOCAL_MEDIA_CHANGE':
|
||||
this.renderControlButtons(state.session.localUser.mediaState);
|
||||
this.renderLocalVideo(state.session.localUser);
|
||||
this.renderLocalVideo(state.session.localUser, state.localStream);
|
||||
this.renderLocalUserStatus(state.session.localUser);
|
||||
this.renderUserList(state.session.localUser, state.session.remoteUser);
|
||||
break;
|
||||
case 'LOCAL_STREAM_OBTAINED':
|
||||
this.renderLocalStream(state.localStream);
|
||||
this.renderLocalVideo(state.session.localUser, state.localStream);
|
||||
break;
|
||||
case 'REMOTE_MEDIA_CHANGE':
|
||||
this.renderRemoteVideo(state.session.remoteUser);
|
||||
this.renderUserList(state.session.localUser, state.session.remoteUser);
|
||||
break;
|
||||
case 'NEW_MESSAGE':
|
||||
this.renderChatMessages(state.messages);
|
||||
@@ -140,9 +144,11 @@ class UIRenderer {
|
||||
}
|
||||
|
||||
// 渲染本地视频
|
||||
renderLocalVideo(localUser) {
|
||||
renderLocalVideo(localUser, localStream) {
|
||||
if (this.elements.localVideoPlaceholder) {
|
||||
toggleElement(this.elements.localVideoPlaceholder, !localUser.mediaState.video);
|
||||
// 当没有视频流或视频关闭时显示占位符
|
||||
const shouldShowPlaceholder = !localStream || !localUser.mediaState.video;
|
||||
toggleElement(this.elements.localVideoPlaceholder, shouldShowPlaceholder);
|
||||
}
|
||||
|
||||
if (this.elements.localAudioWave) {
|
||||
@@ -192,6 +198,41 @@ class UIRenderer {
|
||||
}
|
||||
}
|
||||
|
||||
// 渲染侧边栏用户列表
|
||||
renderUserList(localUser, remoteUser) {
|
||||
if (!this.elements.userList) return;
|
||||
|
||||
// 渲染本地用户
|
||||
const localUserElement = this.elements.userList.querySelector('[data-user-id="local"]');
|
||||
if (localUserElement) {
|
||||
// 渲染本地用户头像
|
||||
const localAvatar = localUserElement.querySelector('img[data-field="localUser.avatar"]');
|
||||
if (localAvatar) {
|
||||
localAvatar.src = localUser.avatar;
|
||||
}
|
||||
// 渲染本地用户名字
|
||||
const localName = localUserElement.querySelector('[data-field="localUser.name"]');
|
||||
if (localName) {
|
||||
localName.textContent = localUser.name;
|
||||
}
|
||||
}
|
||||
|
||||
// 渲染远程用户
|
||||
const remoteUserElement = this.elements.userList.querySelector('[data-user-id="remote"]');
|
||||
if (remoteUserElement) {
|
||||
// 渲染远程用户头像
|
||||
const remoteAvatar = remoteUserElement.querySelector('img[data-field="remoteUser.avatar"]');
|
||||
if (remoteAvatar) {
|
||||
remoteAvatar.src = remoteUser.avatar;
|
||||
}
|
||||
// 渲染远程用户名字
|
||||
const remoteName = remoteUserElement.querySelector('[data-field="remoteUser.name"]');
|
||||
if (remoteName) {
|
||||
remoteName.textContent = remoteUser.name;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
// 渲染控制按钮
|
||||
renderControlButtons(mediaState) {
|
||||
if (this.elements.micBtn) {
|
||||
|
||||
Reference in New Issue
Block a user