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.

middleware.native.js 2.2KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677
  1. // @flow
  2. import { setPictureInPictureDisabled } from '../../mobile/picture-in-picture/functions';
  3. import { setAudioOnly } from '../audio-only';
  4. import JitsiMeetJS from '../lib-jitsi-meet';
  5. import { MiddlewareRegistry } from '../redux';
  6. import { TOGGLE_SCREENSHARING } from '../tracks/actionTypes';
  7. import { destroyLocalDesktopTrackIfExists, replaceLocalTrack } from '../tracks/actions';
  8. import { getLocalVideoTrack, isLocalVideoTrackDesktop } from '../tracks/functions';
  9. import './middleware.any';
  10. MiddlewareRegistry.register(store => next => action => {
  11. switch (action.type) {
  12. case TOGGLE_SCREENSHARING: {
  13. _toggleScreenSharing(action.enabled, store);
  14. break;
  15. }
  16. }
  17. return next(action);
  18. });
  19. /**
  20. * Toggles screen sharing.
  21. *
  22. * @private
  23. * @param {boolean} enabled - The state to toggle screen sharing to.
  24. * @param {Store} store - The redux.
  25. * @returns {void}
  26. */
  27. function _toggleScreenSharing(enabled, store) {
  28. const { dispatch, getState } = store;
  29. const state = getState();
  30. if (enabled) {
  31. const isSharing = isLocalVideoTrackDesktop(state);
  32. if (!isSharing) {
  33. _startScreenSharing(dispatch, state);
  34. }
  35. } else {
  36. dispatch(destroyLocalDesktopTrackIfExists());
  37. }
  38. }
  39. /**
  40. * Creates desktop track and replaces the local one.
  41. *
  42. * @private
  43. * @param {Dispatch} dispatch - The redux {@code dispatch} function.
  44. * @param {Object} state - The redux state.
  45. * @returns {void}
  46. */
  47. function _startScreenSharing(dispatch, state) {
  48. setPictureInPictureDisabled(true);
  49. JitsiMeetJS.createLocalTracks({ devices: [ 'desktop' ] })
  50. .then(tracks => {
  51. const track = tracks[0];
  52. const currentLocalTrack = getLocalVideoTrack(state['features/base/tracks']);
  53. const currentJitsiTrack = currentLocalTrack && currentLocalTrack.jitsiTrack;
  54. dispatch(replaceLocalTrack(currentJitsiTrack, track));
  55. const { enabled: audioOnly } = state['features/base/audio-only'];
  56. if (audioOnly) {
  57. dispatch(setAudioOnly(false));
  58. }
  59. })
  60. .catch(error => {
  61. console.log('ERROR creating ScreeSharing stream ', error);
  62. setPictureInPictureDisabled(false);
  63. });
  64. }