123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197 |
- import { AnyAction } from 'redux';
-
- import { IStore } from '../../app/types';
- import { SET_DYNAMIC_BRANDING_DATA } from '../../dynamic-branding/actionTypes';
- import { getFeatureFlag } from '../flags/functions';
- import MiddlewareRegistry from '../redux/MiddlewareRegistry';
- import { updateSettings } from '../settings/actions';
-
- import { OVERWRITE_CONFIG, SET_CONFIG } from './actionTypes';
- import { updateConfig } from './actions';
- import { IConfig } from './configType';
-
- /**
- * The middleware of the feature {@code base/config}.
- *
- * @param {Store} store - The redux store.
- * @private
- * @returns {Function}
- */
- MiddlewareRegistry.register(store => next => action => {
- switch (action.type) {
- case SET_CONFIG:
- return _setConfig(store, next, action);
-
- case SET_DYNAMIC_BRANDING_DATA:
- return _setDynamicBrandingData(store, next, action);
-
- case OVERWRITE_CONFIG:
- return _updateSettings(store, next, action);
-
- }
-
- return next(action);
- });
-
- /**
- * Notifies the feature {@code base/config} that the {@link SET_CONFIG} redux
- * action is being {@code dispatch}ed in a specific redux store.
- *
- * @param {Store} store - The redux store in which the specified {@code action}
- * is being dispatched.
- * @param {Dispatch} next - The redux {@code dispatch} function to dispatch the
- * specified {@code action} in the specified {@code store}.
- * @param {Action} action - The redux action which is being {@code dispatch}ed
- * in the specified {@code store}.
- * @private
- * @returns {*} The return value of {@code next(action)}.
- */
- function _setConfig({ dispatch, getState }: IStore, next: Function, action: AnyAction) {
- // The reducer is doing some alterations to the config passed in the action,
- // so make sure it's the final state by waiting for the action to be
- // reduced.
- const result = next(action);
- const state = getState();
-
- // Update the config with user defined settings.
- const settings = state['features/base/settings'];
- const config: IConfig = {};
-
- if (typeof settings.disableP2P !== 'undefined') {
- config.p2p = { enabled: !settings.disableP2P };
- }
-
- const resolutionFlag = getFeatureFlag(state, 'resolution');
-
- if (typeof resolutionFlag !== 'undefined') {
- config.resolution = resolutionFlag;
- }
-
- if (action.config.doNotFlipLocalVideo === true) {
- dispatch(updateSettings({
- localFlipX: false
- }));
- }
-
- if (action.config.disableSelfView !== undefined) {
- dispatch(updateSettings({
- disableSelfView: action.config.disableSelfView
- }));
- }
-
- if (action.config.filmstrip?.stageFilmstripParticipants !== undefined) {
- dispatch(updateSettings({
- maxStageParticipants: action.config.filmstrip.stageFilmstripParticipants
- }));
- }
-
- dispatch(updateConfig(config));
-
- // FIXME On Web we rely on the global 'config' variable which gets altered
- // multiple times, before it makes it to the reducer. At some point it may
- // not be the global variable which is being modified anymore due to
- // different merge methods being used along the way. The global variable
- // must be synchronized with the final state resolved by the reducer.
- if (typeof window.config !== 'undefined') {
- window.config = state['features/base/config'];
- }
-
- return result;
- }
-
- /**
- * Updates config based on dynamic branding data.
- *
- * @param {Store} store - The redux store in which the specified {@code action}
- * is being dispatched.
- * @param {Dispatch} next - The redux {@code dispatch} function to dispatch the
- * specified {@code action} in the specified {@code store}.
- * @param {Action} action - The redux action which is being {@code dispatch}ed
- * in the specified {@code store}.
- * @private
- * @returns {*} The return value of {@code next(action)}.
- */
- function _setDynamicBrandingData({ dispatch }: IStore, next: Function, action: AnyAction) {
- const config: IConfig = {};
- const {
- downloadAppsUrl,
- liveStreamingDialogUrls = {},
- preCallTest = {},
- salesforceUrl,
- userDocumentationUrl
- } = action.value;
-
- const { helpUrl, termsUrl, dataPrivacyUrl } = liveStreamingDialogUrls;
-
- if (helpUrl || termsUrl || dataPrivacyUrl) {
- config.liveStreaming = {};
- if (helpUrl) {
- config.liveStreaming.helpLink = helpUrl;
- }
-
- if (termsUrl) {
- config.liveStreaming.termsLink = termsUrl;
- }
-
- if (dataPrivacyUrl) {
- config.liveStreaming.dataPrivacyLink = dataPrivacyUrl;
- }
- }
-
- if (downloadAppsUrl || userDocumentationUrl) {
- config.deploymentUrls = {};
-
- if (downloadAppsUrl) {
- config.deploymentUrls.downloadAppsUrl = downloadAppsUrl;
- }
-
- if (userDocumentationUrl) {
- config.deploymentUrls.userDocumentationURL = userDocumentationUrl;
- }
- }
-
- if (salesforceUrl) {
- config.salesforceUrl = salesforceUrl;
- }
-
- const { enabled, iceUrl } = preCallTest;
-
- if (typeof enabled === 'boolean') {
- config.prejoinConfig = {
- preCallTestEnabled: enabled
- };
- }
-
- if (iceUrl) {
- config.prejoinConfig = config.prejoinConfig || {};
- config.prejoinConfig.preCallTestICEUrl = iceUrl;
- }
-
- dispatch(updateConfig(config));
-
- return next(action);
- }
-
- /**
- * Updates settings based on some config values.
- *
- * @param {Store} store - The redux store in which the specified {@code action}
- * is being dispatched.
- * @param {Dispatch} next - The redux {@code dispatch} function to dispatch the
- * specified {@code action} in the specified {@code store}.
- * @param {Action} action - The redux action which is being {@code dispatch}ed
- * in the specified {@code store}.
- * @private
- * @returns {*} The return value of {@code next(action)}.
- */
- function _updateSettings({ dispatch }: IStore, next: Function, action: AnyAction) {
- const { config: { doNotFlipLocalVideo } } = action;
-
- if (doNotFlipLocalVideo === true) {
- dispatch(updateSettings({
- localFlipX: false
- }));
- }
-
- return next(action);
- }
|