12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394 |
- import { createOpenWhiteboardEvent } from '../analytics/AnalyticsEvents';
- import { sendAnalytics } from '../analytics/functions';
- import { IStore } from '../app/types';
- import { UPDATE_CONFERENCE_METADATA } from '../base/conference/actionTypes';
- import { getCurrentConference } from '../base/conference/functions';
- import MiddlewareRegistry from '../base/redux/MiddlewareRegistry';
- import StateListenerRegistry from '../base/redux/StateListenerRegistry';
-
- import { SET_WHITEBOARD_OPEN } from './actionTypes';
- import {
- notifyWhiteboardLimit,
- resetWhiteboard,
- restrictWhiteboard,
- setWhiteboardOpen,
- setupWhiteboard
- } from './actions';
- import { WHITEBOARD_ID } from './constants';
- import {
- generateCollabServerUrl,
- isWhiteboardOpen,
- shouldEnforceUserLimit,
- shouldNotifyUserLimit
- } from './functions';
-
- MiddlewareRegistry.register((store: IStore) => next => action => {
- const state = store.getState();
-
- switch (action.type) {
- case SET_WHITEBOARD_OPEN: {
- const enforceUserLimit = shouldEnforceUserLimit(state);
- const notifyUserLimit = shouldNotifyUserLimit(state);
-
- if (action.isOpen && !enforceUserLimit && !notifyUserLimit) {
- sendAnalytics(createOpenWhiteboardEvent());
-
- return next(action);
- }
-
- break;
- }
-
- case UPDATE_CONFERENCE_METADATA: {
- const { metadata } = action;
-
- if (metadata?.[WHITEBOARD_ID]) {
- store.dispatch(setupWhiteboard({
- collabDetails: metadata[WHITEBOARD_ID].collabDetails,
- collabServerUrl: generateCollabServerUrl(store.getState())
- }));
- store.dispatch(setWhiteboardOpen(true));
- }
-
- break;
- }
- }
-
- return next(action);
- });
-
- /**
- * Set up state change listener to perform maintenance tasks when the conference
- * is left or failed, e.g. Disable the whiteboard if it's left open.
- */
- StateListenerRegistry.register(
- state => getCurrentConference(state),
- (conference, { dispatch }, previousConference): void => {
- if (conference !== previousConference) {
- dispatch(resetWhiteboard());
- }
- });
-
- /**
- * Set up state change listener to limit whiteboard access.
- */
- StateListenerRegistry.register(
- state => shouldEnforceUserLimit(state),
- (enforceUserLimit, { dispatch, getState }): void => {
- if (isWhiteboardOpen(getState()) && enforceUserLimit) {
- dispatch(restrictWhiteboard());
- }
- }
- );
-
- /**
- * Set up state change listener to notify about whiteboard usage.
- */
- StateListenerRegistry.register(
- state => shouldNotifyUserLimit(state),
- (notifyUserLimit, { dispatch, getState }, prevNotifyUserLimit): void => {
- if (isWhiteboardOpen(getState()) && notifyUserLimit && !prevNotifyUserLimit) {
- dispatch(notifyWhiteboardLimit());
- }
- }
- );
|