// @flow import { notifyKickedOut } from './actions'; import { appNavigate } from '../app'; import { CONFERENCE_JOINED, KICKED_OUT, VIDEO_QUALITY_LEVELS, conferenceLeft, getCurrentConference, setPreferredReceiverVideoQuality } from '../base/conference'; import { hideDialog, isDialogOpen } from '../base/dialog'; import { setActiveModalId } from '../base/modal'; import { pinParticipant } from '../base/participants'; import { SET_REDUCED_UI } from '../base/responsive-ui'; import { MiddlewareRegistry, StateListenerRegistry } from '../base/redux'; import { FeedbackDialog } from '../feedback'; import { setFilmstripEnabled } from '../filmstrip'; import { setToolboxEnabled } from '../toolbox'; MiddlewareRegistry.register(store => next => action => { const result = next(action); switch (action.type) { case CONFERENCE_JOINED: case SET_REDUCED_UI: { const { dispatch, getState } = store; const state = getState(); const { reducedUI } = state['features/base/responsive-ui']; dispatch(setToolboxEnabled(!reducedUI)); dispatch(setFilmstripEnabled(!reducedUI)); dispatch( setPreferredReceiverVideoQuality( reducedUI ? VIDEO_QUALITY_LEVELS.LOW : VIDEO_QUALITY_LEVELS.HIGH)); break; } case KICKED_OUT: { const { dispatch } = store; dispatch(notifyKickedOut( action.participant, () => { dispatch(conferenceLeft(action.conference)); dispatch(appNavigate(undefined)); } )); break; } } return result; }); /** * Set up state change listener to perform maintenance tasks when the conference * is left or failed, close all dialogs and unpin any pinned participants. */ StateListenerRegistry.register( state => getCurrentConference(state), (conference, { dispatch, getState }, prevConference) => { const { authRequired, passwordRequired } = getState()['features/base/conference']; if (conference !== prevConference) { // Unpin participant, in order to avoid the local participant // remaining pinned, since it's not destroyed across runs. dispatch(pinParticipant(null)); // XXX I wonder if there is a better way to do this. At this stage // we do know what dialogs we want to keep but the list of those // we want to hide is a lot longer. Thus we take a bit of a shortcut // and explicitly check. if (typeof authRequired === 'undefined' && typeof passwordRequired === 'undefined' && !isDialogOpen(getState(), FeedbackDialog)) { // Conference changed, left or failed... and there is no // pending authentication, nor feedback request, so close any // dialog we might have open. dispatch(hideDialog()); } // We want to close all modals. dispatch(setActiveModalId()); } });