mirror of
https://gitcode.com/GitHub_Trending/ji/jitsi-meet.git
synced 2025-12-30 11:22:31 +00:00
prioritize participants with screen shares support local screen share track auto pin screen share support screen share for large video ensure fake screen share participants are sorted fix local screen share in vertical filmstrip fix local screen share in tile mode use FakeScreenShareParticipant component for screen share thumbnails ensure changes are behind feature flag and update jsdocs fix bug where local screen share was not rendering update receiver constraints to include SS source names remove fake ss participant creation on track update fix: handle screenshare muted change and track removal refactor: update key values for sortedFakeScreenShareParticipants address PR comments refactor getter for screenshare tracks rename state to sortedRemoteFakeScreenShareParticipants
121 lines
4.1 KiB
JavaScript
121 lines
4.1 KiB
JavaScript
// @flow
|
|
|
|
import { getSourceNameSignalingFeatureFlag } from '../base/config';
|
|
import { getFakeScreenShareParticipantOwnerId } from '../base/participants';
|
|
|
|
import { setRemoteParticipants } from './actions';
|
|
import { isReorderingEnabled } from './functions';
|
|
|
|
/**
|
|
* Computes the reorderd list of the remote participants.
|
|
*
|
|
* @param {*} store - The redux store.
|
|
* @param {string} participantId - The endpoint id of the participant that joined the call.
|
|
* @returns {void}
|
|
* @private
|
|
*/
|
|
export function updateRemoteParticipants(store: Object, participantId: ?number) {
|
|
const state = store.getState();
|
|
let reorderedParticipants = [];
|
|
|
|
const { sortedRemoteFakeScreenShareParticipants } = state['features/base/participants'];
|
|
|
|
if (!isReorderingEnabled(state) && !sortedRemoteFakeScreenShareParticipants.size) {
|
|
if (participantId) {
|
|
const { remoteParticipants } = state['features/filmstrip'];
|
|
|
|
reorderedParticipants = [ ...remoteParticipants, participantId ];
|
|
store.dispatch(setRemoteParticipants(reorderedParticipants));
|
|
}
|
|
|
|
return;
|
|
}
|
|
|
|
const {
|
|
fakeParticipants,
|
|
sortedRemoteParticipants,
|
|
sortedRemoteScreenshares,
|
|
speakersList
|
|
} = state['features/base/participants'];
|
|
const remoteParticipants = new Map(sortedRemoteParticipants);
|
|
const screenShares = new Map(sortedRemoteScreenshares);
|
|
const screenShareParticipants = sortedRemoteFakeScreenShareParticipants
|
|
? [ ...sortedRemoteFakeScreenShareParticipants.keys() ] : [];
|
|
const sharedVideos = fakeParticipants ? Array.from(fakeParticipants.keys()) : [];
|
|
const speakers = new Map(speakersList);
|
|
|
|
if (getSourceNameSignalingFeatureFlag(state)) {
|
|
for (const screenshare of screenShareParticipants) {
|
|
const ownerId = getFakeScreenShareParticipantOwnerId(screenshare);
|
|
|
|
remoteParticipants.delete(ownerId);
|
|
remoteParticipants.delete(screenshare);
|
|
|
|
speakers.delete(ownerId);
|
|
speakers.delete(screenshare);
|
|
}
|
|
} else {
|
|
for (const screenshare of screenShares.keys()) {
|
|
remoteParticipants.delete(screenshare);
|
|
speakers.delete(screenshare);
|
|
}
|
|
}
|
|
|
|
for (const sharedVideo of sharedVideos) {
|
|
remoteParticipants.delete(sharedVideo);
|
|
speakers.delete(sharedVideo);
|
|
}
|
|
for (const speaker of speakers.keys()) {
|
|
remoteParticipants.delete(speaker);
|
|
}
|
|
|
|
if (getSourceNameSignalingFeatureFlag(state)) {
|
|
// Always update the order of the thumnails.
|
|
const participantsWithScreenShare = screenShareParticipants.reduce((acc, screenshare) => {
|
|
const ownerId = getFakeScreenShareParticipantOwnerId(screenshare);
|
|
|
|
acc.push(ownerId);
|
|
acc.push(screenshare);
|
|
|
|
return acc;
|
|
}, []);
|
|
|
|
reorderedParticipants = [
|
|
...participantsWithScreenShare,
|
|
...sharedVideos,
|
|
...Array.from(speakers.keys()),
|
|
...Array.from(remoteParticipants.keys())
|
|
];
|
|
} else {
|
|
// Always update the order of the thumnails.
|
|
reorderedParticipants = [
|
|
...Array.from(screenShares.keys()),
|
|
...sharedVideos,
|
|
...Array.from(speakers.keys()),
|
|
...Array.from(remoteParticipants.keys())
|
|
];
|
|
}
|
|
|
|
store.dispatch(setRemoteParticipants(reorderedParticipants));
|
|
}
|
|
|
|
/**
|
|
* Private helper to calculate the reordered list of remote participants when a participant leaves.
|
|
*
|
|
* @param {*} store - The redux store.
|
|
* @param {string} participantId - The endpoint id of the participant leaving the call.
|
|
* @returns {void}
|
|
* @private
|
|
*/
|
|
export function updateRemoteParticipantsOnLeave(store: Object, participantId: ?string = null) {
|
|
if (!participantId) {
|
|
return;
|
|
}
|
|
const state = store.getState();
|
|
const { remoteParticipants } = state['features/filmstrip'];
|
|
const reorderedParticipants = new Set(remoteParticipants);
|
|
|
|
reorderedParticipants.delete(participantId)
|
|
&& store.dispatch(setRemoteParticipants(Array.from(reorderedParticipants)));
|
|
}
|