Nevar pievienot vairāk kā 25 tēmas Tēmai ir jāsākas ar burtu vai ciparu, tā var saturēt domu zīmes ('-') un var būt līdz 35 simboliem gara.

subscriber.ts 2.8KB

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