Du kan inte välja fler än 25 ämnen Ämnen måste starta med en bokstav eller siffra, kan innehålla bindestreck ('-') och vara max 35 tecken långa.

middleware.js 3.8KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128
  1. // @flow
  2. import { CONFERENCE_JOINED } from '../base/conference';
  3. import { updateConfig } from '../base/config';
  4. import { SET_AUDIO_MUTED, SET_VIDEO_MUTED } from '../base/media';
  5. import { MiddlewareRegistry } from '../base/redux';
  6. import { updateSettings } from '../base/settings';
  7. import {
  8. getLocalTracks,
  9. replaceLocalTrack,
  10. TRACK_ADDED,
  11. TRACK_NO_DATA_FROM_SOURCE
  12. } from '../base/tracks';
  13. import { PREJOIN_START_CONFERENCE } from './actionTypes';
  14. import {
  15. setDeviceStatusOk,
  16. setDeviceStatusWarning,
  17. setPrejoinPageVisibility
  18. } from './actions';
  19. import { PREJOIN_SCREEN_STATES } from './constants';
  20. import { isPrejoinPageVisible } from './functions';
  21. declare var APP: Object;
  22. /**
  23. * The redux middleware for {@link PrejoinPage}.
  24. *
  25. * @param {Store} store - The redux store.
  26. * @returns {Function}
  27. */
  28. MiddlewareRegistry.register(store => next => async action => {
  29. switch (action.type) {
  30. case PREJOIN_START_CONFERENCE: {
  31. const { getState, dispatch } = store;
  32. const state = getState();
  33. const { userSelectedSkipPrejoin } = state['features/prejoin'];
  34. let localTracks = getLocalTracks(state['features/base/tracks']);
  35. const { options } = action;
  36. options && store.dispatch(updateConfig(options));
  37. userSelectedSkipPrejoin && dispatch(updateSettings({
  38. userSelectedSkipPrejoin
  39. }));
  40. // Do not signal audio/video tracks if the user joins muted.
  41. for (const track of localTracks) {
  42. if (track.muted) {
  43. await dispatch(replaceLocalTrack(track.jitsiTrack, null));
  44. }
  45. }
  46. // Re-fetch the local tracks after muted tracks have been removed above.
  47. // This is needed, because the tracks are effectively disposed by the replaceLocalTrack and should not be used
  48. // anymore.
  49. localTracks = getLocalTracks(getState()['features/base/tracks']);
  50. const jitsiTracks = localTracks.map(t => t.jitsiTrack);
  51. dispatch(setPrejoinPageVisibility(PREJOIN_SCREEN_STATES.LOADING));
  52. APP.conference.prejoinStart(jitsiTracks);
  53. break;
  54. }
  55. case SET_AUDIO_MUTED: {
  56. if (isPrejoinPageVisible(store.getState())) {
  57. store.dispatch(updateSettings({
  58. startWithAudioMuted: Boolean(action.muted)
  59. }));
  60. }
  61. break;
  62. }
  63. case SET_VIDEO_MUTED: {
  64. if (isPrejoinPageVisible(store.getState())) {
  65. store.dispatch(updateSettings({
  66. startWithVideoMuted: Boolean(action.muted)
  67. }));
  68. }
  69. break;
  70. }
  71. case TRACK_ADDED:
  72. case TRACK_NO_DATA_FROM_SOURCE: {
  73. const state = store.getState();
  74. if (isPrejoinPageVisible(state)) {
  75. const { track: { jitsiTrack: track } } = action;
  76. const { deviceStatusType, deviceStatusText } = state['features/prejoin'];
  77. if (!track.isAudioTrack()) {
  78. break;
  79. }
  80. if (track.isReceivingData()) {
  81. if (deviceStatusType === 'warning'
  82. && deviceStatusText === 'prejoin.audioDeviceProblem') {
  83. store.dispatch(setDeviceStatusOk('prejoin.lookGood'));
  84. }
  85. } else if (deviceStatusType === 'ok') {
  86. store.dispatch(setDeviceStatusWarning('prejoin.audioDeviceProblem'));
  87. }
  88. }
  89. break;
  90. }
  91. case CONFERENCE_JOINED:
  92. return _conferenceJoined(store, next, action);
  93. }
  94. return next(action);
  95. });
  96. /**
  97. * Handles cleanup of prejoin state when a conference is joined.
  98. *
  99. * @param {Object} store - The Redux store.
  100. * @param {Function} next - The Redux next function.
  101. * @param {Object} action - The Redux action.
  102. * @returns {Object}
  103. */
  104. function _conferenceJoined({ dispatch }, next, action) {
  105. dispatch(setPrejoinPageVisibility(PREJOIN_SCREEN_STATES.HIDDEN));
  106. return next(action);
  107. }