优化
This commit is contained in:
@@ -1,3 +1,5 @@
|
||||
import { createIconElement, createTextElement, textValue } from '../../shared/dom.js';
|
||||
|
||||
const DEFAULT_NETWORK_QUALITY = {
|
||||
label: '\u672a\u77e5',
|
||||
statusIconClass: 'fas fa-question-circle text-gray-400',
|
||||
@@ -50,18 +52,18 @@ const NETWORK_QUALITY_DISPLAY = {
|
||||
}
|
||||
};
|
||||
|
||||
function getRoleTagMarkup(user, role) {
|
||||
function getRoleTagMeta(user, role) {
|
||||
if (role === 'local') {
|
||||
return user.isHost
|
||||
? '<span class="text-xs bg-indigo-500 px-1.5 rounded ml-1">\u4e3b\u6301\u4eba</span>'
|
||||
: '<span class="text-xs bg-purple-500 px-1.5 rounded ml-1">\u53c2\u4e0e\u8005</span>';
|
||||
? { className: 'text-xs bg-indigo-500 px-1.5 rounded ml-1', label: '\u4e3b\u6301\u4eba' }
|
||||
: { className: 'text-xs bg-purple-500 px-1.5 rounded ml-1', label: '\u53c2\u4e0e\u8005' };
|
||||
}
|
||||
|
||||
if (role === 'participant') {
|
||||
return '<span class="text-xs bg-purple-500 px-1.5 rounded ml-1">\u53c2\u4e0e\u8005</span>';
|
||||
return { className: 'text-xs bg-purple-500 px-1.5 rounded ml-1', label: '\u53c2\u4e0e\u8005' };
|
||||
}
|
||||
|
||||
return '<span class="text-xs bg-indigo-500 px-1.5 rounded ml-1">\u4e3b\u6301\u4eba</span>';
|
||||
return { className: 'text-xs bg-indigo-500 px-1.5 rounded ml-1', label: '\u4e3b\u6301\u4eba' };
|
||||
}
|
||||
|
||||
function getDatasetUserId(role, id) {
|
||||
@@ -79,34 +81,55 @@ function getDatasetUserId(role, id) {
|
||||
}
|
||||
}
|
||||
|
||||
function getAvatarMarkup(user, role) {
|
||||
if (role === 'local') {
|
||||
return `<img src="${user.avatar}" class="w-10 h-10 rounded-full object-cover">`;
|
||||
}
|
||||
|
||||
return `
|
||||
<div class="relative">
|
||||
<img src="${user.avatar}" class="w-10 h-10 rounded-full object-cover">
|
||||
<div class="absolute -bottom-1 -right-1 w-3 h-3 bg-green-500 rounded-full border-2 border-slate-900"></div>
|
||||
</div>
|
||||
`;
|
||||
function createAvatarImage(user) {
|
||||
const image = document.createElement('img');
|
||||
image.src = textValue(user.avatar);
|
||||
image.alt = textValue(user.name, '\u7528\u6237');
|
||||
image.className = 'w-10 h-10 rounded-full object-cover';
|
||||
return image;
|
||||
}
|
||||
|
||||
function getRightMarkup(mediaState, role, muteIconMarkup) {
|
||||
if (role !== 'participant') {
|
||||
return muteIconMarkup;
|
||||
function createAvatarElement(user, role) {
|
||||
if (role === 'local') {
|
||||
return createAvatarImage(user);
|
||||
}
|
||||
|
||||
const speakingMarkup = (mediaState.isSpeaking && mediaState.audio)
|
||||
? '<div class="audio-wave w-6"><span></span><span></span><span></span><span></span><span></span></div>'
|
||||
: '';
|
||||
const wrapper = document.createElement('div');
|
||||
wrapper.className = 'relative';
|
||||
wrapper.appendChild(createAvatarImage(user));
|
||||
|
||||
return `
|
||||
<div class="flex items-center gap-2">
|
||||
${muteIconMarkup}
|
||||
${speakingMarkup}
|
||||
</div>
|
||||
`;
|
||||
const statusDot = document.createElement('div');
|
||||
statusDot.className = 'absolute -bottom-1 -right-1 w-3 h-3 bg-green-500 rounded-full border-2 border-slate-900';
|
||||
wrapper.appendChild(statusDot);
|
||||
|
||||
return wrapper;
|
||||
}
|
||||
|
||||
function createAudioWaveElement() {
|
||||
const wave = document.createElement('div');
|
||||
wave.className = 'audio-wave w-6';
|
||||
for (let i = 0; i < 5; i += 1) {
|
||||
wave.appendChild(document.createElement('span'));
|
||||
}
|
||||
return wave;
|
||||
}
|
||||
|
||||
function createRightElement(mediaState, role, muteIcon) {
|
||||
if (role !== 'participant') {
|
||||
return muteIcon;
|
||||
}
|
||||
|
||||
const right = document.createElement('div');
|
||||
right.className = 'flex items-center gap-2';
|
||||
|
||||
if (muteIcon) {
|
||||
right.appendChild(muteIcon);
|
||||
}
|
||||
if (mediaState.isSpeaking && mediaState.audio) {
|
||||
right.appendChild(createAudioWaveElement());
|
||||
}
|
||||
|
||||
return right.childNodes.length > 0 ? right : null;
|
||||
}
|
||||
|
||||
export function getCallTitle(connectionId) {
|
||||
@@ -163,27 +186,40 @@ export function buildUserCountLabel(userCount) {
|
||||
export function createUserEntryElement({ user, role, id }) {
|
||||
const entry = document.createElement('div');
|
||||
const mediaMeta = getMediaStatusMeta(user.mediaState);
|
||||
const muteIconMarkup = mediaMeta.showMuteIcon
|
||||
? `<i class="${mediaMeta.muteIconClass}"></i>`
|
||||
const muteIcon = mediaMeta.showMuteIcon
|
||||
? createIconElement(mediaMeta.muteIconClass)
|
||||
: '';
|
||||
const baseClass = 'flex items-center gap-3 p-2 rounded-lg';
|
||||
const dataFieldAttr = role === 'local' ? ' data-field="localUser.mediaStatus"' : '';
|
||||
|
||||
entry.className = role === 'local'
|
||||
? `${baseClass} hover:bg-white/5`
|
||||
: `${baseClass} bg-white/5`;
|
||||
entry.dataset.userId = getDatasetUserId(role, id);
|
||||
entry.innerHTML = `
|
||||
${getAvatarMarkup(user, role)}
|
||||
<div class="flex-1">
|
||||
<div class="text-sm font-medium">
|
||||
${user.name}
|
||||
${getRoleTagMarkup(user, role)}
|
||||
</div>
|
||||
<div class="${mediaMeta.className}"${dataFieldAttr}>${mediaMeta.text}</div>
|
||||
</div>
|
||||
${getRightMarkup(user.mediaState, role, muteIconMarkup)}
|
||||
`;
|
||||
|
||||
entry.appendChild(createAvatarElement(user, role));
|
||||
|
||||
const details = document.createElement('div');
|
||||
details.className = 'flex-1';
|
||||
|
||||
const nameRow = document.createElement('div');
|
||||
nameRow.className = 'text-sm font-medium';
|
||||
nameRow.appendChild(document.createTextNode(textValue(user.name)));
|
||||
const roleTag = getRoleTagMeta(user, role);
|
||||
nameRow.appendChild(createTextElement('span', roleTag.className, roleTag.label));
|
||||
details.appendChild(nameRow);
|
||||
|
||||
const mediaStatus = createTextElement('div', mediaMeta.className, mediaMeta.text);
|
||||
if (role === 'local') {
|
||||
mediaStatus.dataset.field = 'localUser.mediaStatus';
|
||||
}
|
||||
details.appendChild(mediaStatus);
|
||||
|
||||
entry.appendChild(details);
|
||||
|
||||
const right = createRightElement(user.mediaState, role, muteIcon || null);
|
||||
if (right) {
|
||||
entry.appendChild(right);
|
||||
}
|
||||
|
||||
return entry;
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user