You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

subscriber.web.js 2.3KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869
  1. // @flow
  2. import _ from 'lodash';
  3. import { getCurrentConference } from '../conference';
  4. import { getMultipleVideoSupportFeatureFlag } from '../config';
  5. import { StateListenerRegistry } from '../redux';
  6. import { createVirtualScreenshareParticipant, participantLeft } from './actions';
  7. StateListenerRegistry.register(
  8. /* selector */ state => state['features/base/tracks'],
  9. /* listener */(tracks, store) => _updateScreenshareParticipants(store)
  10. );
  11. /**
  12. * Handles creating and removing virtual screenshare participants.
  13. *
  14. * @param {*} store - The redux store.
  15. * @returns {void}
  16. */
  17. function _updateScreenshareParticipants({ getState, dispatch }) {
  18. const state = getState();
  19. if (!getMultipleVideoSupportFeatureFlag(state)) {
  20. return;
  21. }
  22. const conference = getCurrentConference(state);
  23. const tracks = state['features/base/tracks'];
  24. const { sortedRemoteVirtualScreenshareParticipants, localScreenShare } = state['features/base/participants'];
  25. const previousScreenshareSourceNames = [ ...sortedRemoteVirtualScreenshareParticipants.keys() ];
  26. let newLocalSceenshareSourceName;
  27. const currentScreenshareSourceNames = tracks.reduce((acc, track) => {
  28. if (track.videoType === 'desktop' && !track.jitsiTrack.isMuted()) {
  29. const sourceName = track.jitsiTrack.getSourceName();
  30. if (track.local) {
  31. newLocalSceenshareSourceName = sourceName;
  32. } else {
  33. acc.push(sourceName);
  34. }
  35. }
  36. return acc;
  37. }, []);
  38. if (!localScreenShare && newLocalSceenshareSourceName) {
  39. dispatch(createVirtualScreenshareParticipant(newLocalSceenshareSourceName, true));
  40. }
  41. if (localScreenShare && !newLocalSceenshareSourceName) {
  42. dispatch(participantLeft(localScreenShare.id, conference));
  43. }
  44. const removedScreenshareSourceNames = _.difference(previousScreenshareSourceNames, currentScreenshareSourceNames);
  45. const addedScreenshareSourceNames = _.difference(currentScreenshareSourceNames, previousScreenshareSourceNames);
  46. if (removedScreenshareSourceNames.length) {
  47. removedScreenshareSourceNames.forEach(id => dispatch(participantLeft(id, conference)));
  48. }
  49. if (addedScreenshareSourceNames.length) {
  50. addedScreenshareSourceNames.forEach(id => dispatch(createVirtualScreenshareParticipant(id, false)));
  51. }
  52. }