mirror of
https://gitcode.com/GitHub_Trending/ji/jitsi-meet.git
synced 2025-12-30 11:22:31 +00:00
fix(large-video) Fix auto-pinning of SS in large meetings. (#16773)
Fix(large-video) Fox auto pinning of screenshare in large meetings
This commit is contained in:
@@ -33,7 +33,6 @@ import {
|
|||||||
isUserInteractionRequiredForUnmute,
|
isUserInteractionRequiredForUnmute,
|
||||||
setTrackMuted
|
setTrackMuted
|
||||||
} from './functions';
|
} from './functions';
|
||||||
import './subscriber';
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Middleware that captures LIB_DID_DISPOSE and LIB_DID_INIT actions and,
|
* Middleware that captures LIB_DID_DISPOSE and LIB_DID_INIT actions and,
|
||||||
|
|||||||
@@ -38,6 +38,7 @@ import {
|
|||||||
import { ITrack, ITrackOptions } from './types';
|
import { ITrack, ITrackOptions } from './types';
|
||||||
|
|
||||||
import './middleware.any';
|
import './middleware.any';
|
||||||
|
import './subscriber.web';
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Middleware that captures LIB_DID_DISPOSE and LIB_DID_INIT actions and,
|
* Middleware that captures LIB_DID_DISPOSE and LIB_DID_INIT actions and,
|
||||||
|
|||||||
@@ -1,40 +0,0 @@
|
|||||||
import { isEqual, sortBy } from 'lodash-es';
|
|
||||||
|
|
||||||
import { MEDIA_TYPE } from '../media/constants';
|
|
||||||
import { getScreenshareParticipantIds } from '../participants/functions';
|
|
||||||
import StateListenerRegistry from '../redux/StateListenerRegistry';
|
|
||||||
|
|
||||||
import { isLocalTrackMuted } from './functions';
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Notifies when the list of currently sharing participants changes.
|
|
||||||
*/
|
|
||||||
StateListenerRegistry.register(
|
|
||||||
/* selector */ state => getScreenshareParticipantIds(state),
|
|
||||||
/* listener */ (participantIDs, store, previousParticipantIDs) => {
|
|
||||||
if (typeof APP !== 'object') {
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (!isEqual(sortBy(participantIDs), sortBy(previousParticipantIDs))) {
|
|
||||||
APP.API.notifySharingParticipantsChanged(participantIDs);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
);
|
|
||||||
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Notifies when the local video mute state changes.
|
|
||||||
*/
|
|
||||||
StateListenerRegistry.register(
|
|
||||||
/* selector */ state => isLocalTrackMuted(state['features/base/tracks'], MEDIA_TYPE.VIDEO),
|
|
||||||
/* listener */ (muted, store, previousMuted) => {
|
|
||||||
if (typeof APP !== 'object') {
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (muted !== previousMuted) {
|
|
||||||
APP.API.notifyVideoMutedStatusChanged(muted);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
);
|
|
||||||
52
react/features/base/tracks/subscriber.web.ts
Normal file
52
react/features/base/tracks/subscriber.web.ts
Normal file
@@ -0,0 +1,52 @@
|
|||||||
|
import { isEqual, sortBy } from 'lodash-es';
|
||||||
|
|
||||||
|
// @ts-expect-error
|
||||||
|
import VideoLayout from '../../../../modules/UI/videolayout/VideoLayout';
|
||||||
|
import { getAutoPinSetting } from '../../video-layout/functions.any';
|
||||||
|
import { MEDIA_TYPE } from '../media/constants';
|
||||||
|
import { getScreenshareParticipantIds } from '../participants/functions';
|
||||||
|
import StateListenerRegistry from '../redux/StateListenerRegistry';
|
||||||
|
|
||||||
|
import { isLocalTrackMuted } from './functions';
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Notifies when the list of currently sharing participants changes.
|
||||||
|
*/
|
||||||
|
StateListenerRegistry.register(
|
||||||
|
/* selector */ state => getScreenshareParticipantIds(state),
|
||||||
|
/* listener */ (participantIDs, store, previousParticipantIDs) => {
|
||||||
|
if (getAutoPinSetting() && participantIDs !== previousParticipantIDs) {
|
||||||
|
const { participantId } = store.getState()['features/large-video'];
|
||||||
|
|
||||||
|
// Check if any new screenshare participants were added
|
||||||
|
const newParticipants = participantIDs.filter((id: string) => !previousParticipantIDs.includes(id));
|
||||||
|
|
||||||
|
// If the current large video participant is a new screensharer, update the display. This is needed when
|
||||||
|
// the track is created much later after the action for auto-pinning is dispatched. This usually happens in
|
||||||
|
// very large meetings if the screenshare was already ongoing when the participant joined. The track is
|
||||||
|
// signaled only after the receiver constraints with SS source id is processed by the bridge but the
|
||||||
|
// auto-pinning action is dispatched when the participant tile is created as soon as the presence is
|
||||||
|
// received.
|
||||||
|
if (participantId && newParticipants.includes(participantId)) {
|
||||||
|
VideoLayout.updateLargeVideo(participantId, true);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if (!isEqual(sortBy(participantIDs), sortBy(previousParticipantIDs))) {
|
||||||
|
APP.API.notifySharingParticipantsChanged(participantIDs);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
);
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Notifies when the local video mute state changes.
|
||||||
|
*/
|
||||||
|
StateListenerRegistry.register(
|
||||||
|
/* selector */ state => isLocalTrackMuted(state['features/base/tracks'], MEDIA_TYPE.VIDEO),
|
||||||
|
/* listener */ (muted, store, previousMuted) => {
|
||||||
|
if (muted !== previousMuted) {
|
||||||
|
APP.API.notifyVideoMutedStatusChanged(muted);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
);
|
||||||
Reference in New Issue
Block a user