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.any.js 2.8KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100
  1. // @flow
  2. import { getCurrentConference } from '../base/conference';
  3. import { PIN_PARTICIPANT, pinParticipant, getPinnedParticipant } from '../base/participants';
  4. import { MiddlewareRegistry, StateListenerRegistry } from '../base/redux';
  5. import { SET_DOCUMENT_EDITING_STATUS } from '../etherpad';
  6. import { SET_TILE_VIEW } from './actionTypes';
  7. import { setTileView } from './actions';
  8. import './subscriber';
  9. let previousTileViewEnabled;
  10. /**
  11. * Middleware which intercepts actions and updates tile view related state.
  12. *
  13. * @param {Store} store - The redux store.
  14. * @returns {Function}
  15. */
  16. MiddlewareRegistry.register(store => next => action => {
  17. const result = next(action);
  18. switch (action.type) {
  19. // Actions that temporarily clear the user preferred state of tile view,
  20. // then re-set it when needed.
  21. case PIN_PARTICIPANT: {
  22. const pinnedParticipant = getPinnedParticipant(store.getState());
  23. if (pinnedParticipant) {
  24. _storeTileViewStateAndClear(store);
  25. } else {
  26. _restoreTileViewState(store);
  27. }
  28. break;
  29. }
  30. case SET_DOCUMENT_EDITING_STATUS:
  31. if (action.editing) {
  32. _storeTileViewStateAndClear(store);
  33. } else {
  34. _restoreTileViewState(store);
  35. }
  36. break;
  37. // Things to update when tile view state changes
  38. case SET_TILE_VIEW:
  39. if (action.enabled && getPinnedParticipant(store)) {
  40. store.dispatch(pinParticipant(null));
  41. }
  42. }
  43. return result;
  44. });
  45. /**
  46. * Set up state change listener to perform maintenance tasks when the conference
  47. * is left or failed.
  48. */
  49. StateListenerRegistry.register(
  50. state => getCurrentConference(state),
  51. (conference, { dispatch }, previousConference) => {
  52. if (conference !== previousConference) {
  53. // conference changed, left or failed...
  54. // Clear tile view state.
  55. dispatch(setTileView());
  56. }
  57. });
  58. /**
  59. * Respores tile view state, if it wasn't updated since then.
  60. *
  61. * @param {Object} store - The Redux Store.
  62. * @returns {void}
  63. */
  64. function _restoreTileViewState({ dispatch, getState }) {
  65. const { tileViewEnabled } = getState()['features/video-layout'];
  66. if (tileViewEnabled === undefined && previousTileViewEnabled !== undefined) {
  67. dispatch(setTileView(previousTileViewEnabled));
  68. }
  69. previousTileViewEnabled = undefined;
  70. }
  71. /**
  72. * Stores the current tile view state and clears it.
  73. *
  74. * @param {Object} store - The Redux Store.
  75. * @returns {void}
  76. */
  77. function _storeTileViewStateAndClear({ dispatch, getState }) {
  78. const { tileViewEnabled } = getState()['features/video-layout'];
  79. if (tileViewEnabled !== undefined) {
  80. previousTileViewEnabled = tileViewEnabled;
  81. dispatch(setTileView(undefined));
  82. }
  83. }