78 lines
2.0 KiB
JavaScript
78 lines
2.0 KiB
JavaScript
export const DEFAULT_PARTICIPANT_NAME = '参与者';
|
|
export const DEFAULT_PARTICIPANT_AVATAR = '/images/p2.png';
|
|
|
|
const DEFAULT_MEDIA_STATE = Object.freeze({
|
|
audio: false,
|
|
video: true,
|
|
isSpeaking: false
|
|
});
|
|
|
|
function createParticipantRecord(current = {}, patch = {}) {
|
|
return {
|
|
id: '',
|
|
name: DEFAULT_PARTICIPANT_NAME,
|
|
avatar: DEFAULT_PARTICIPANT_AVATAR,
|
|
mediaState: { ...DEFAULT_MEDIA_STATE },
|
|
status: 'online',
|
|
...current,
|
|
...patch,
|
|
mediaState: {
|
|
...DEFAULT_MEDIA_STATE,
|
|
...(current.mediaState || {}),
|
|
...(patch.mediaState || {})
|
|
}
|
|
};
|
|
}
|
|
|
|
export function upsertParticipant(participants, participantId, patch = {}) {
|
|
if (!participantId) {
|
|
return null;
|
|
}
|
|
|
|
participants[participantId] = createParticipantRecord(participants[participantId], patch);
|
|
return participants[participantId];
|
|
}
|
|
|
|
export function removeParticipant(participants, participantId) {
|
|
if (!participantId || !participants[participantId]) {
|
|
return false;
|
|
}
|
|
|
|
delete participants[participantId];
|
|
return true;
|
|
}
|
|
|
|
export function omitParticipant(participants, excludedParticipantId) {
|
|
const filtered = {};
|
|
|
|
for (const [participantId, participant] of Object.entries(participants || {})) {
|
|
if (participantId !== excludedParticipantId) {
|
|
filtered[participantId] = participant;
|
|
}
|
|
}
|
|
|
|
return filtered;
|
|
}
|
|
|
|
export function buildParticipantsSyncData(localUser, participants) {
|
|
const memberList = {
|
|
host: {
|
|
id: localUser.id,
|
|
name: localUser.name,
|
|
avatar: localUser.avatar,
|
|
mediaState: { ...localUser.mediaState },
|
|
status: 'online',
|
|
role: 'host'
|
|
}
|
|
};
|
|
|
|
for (const [participantId, participant] of Object.entries(participants || {})) {
|
|
memberList[participantId] = {
|
|
...createParticipantRecord(participant),
|
|
role: 'participant'
|
|
};
|
|
}
|
|
|
|
return memberList;
|
|
}
|