* Adds an option to set email through iframe API init and to stats. * Simplifies configuring email and displayName in stats. Removes enableStatsID as not needed as when off we are sending as callstats id xmpp resource which is unique per call and id must be something that sticks between calls (callstatsUsername). * Adds email and displayName in stats config for mobile. * chore(deps): Updates lib-jitsi-meet to latest dd31f0a. * Removes enableStatsID from config and whitelist.
154 lines
4.2 KiB
JavaScript
154 lines
4.2 KiB
JavaScript
// @flow
|
|
import _ from 'lodash';
|
|
|
|
import { APP_WILL_MOUNT } from '../app';
|
|
import { setAudioOnly } from '../audio-only';
|
|
import parseURLParams from '../config/parseURLParams'; // minimize imports to avoid circular imports
|
|
import { SET_LOCATION_URL } from '../connection/actionTypes'; // minimize imports to avoid circular imports
|
|
import { getLocalParticipant, participantUpdated } from '../participants';
|
|
import { MiddlewareRegistry } from '../redux';
|
|
|
|
import { SETTINGS_UPDATED } from './actionTypes';
|
|
import { handleCallIntegrationChange } from './functions';
|
|
|
|
/**
|
|
* The middleware of the feature base/settings. Distributes changes to the state
|
|
* of base/settings to the states of other features computed from the state of
|
|
* base/settings.
|
|
*
|
|
* @param {Store} store - The redux store.
|
|
* @returns {Function}
|
|
*/
|
|
MiddlewareRegistry.register(store => next => action => {
|
|
const result = next(action);
|
|
|
|
switch (action.type) {
|
|
case APP_WILL_MOUNT:
|
|
_initializeCallIntegration(store);
|
|
break;
|
|
case SETTINGS_UPDATED:
|
|
_maybeHandleCallIntegrationChange(action);
|
|
_maybeSetAudioOnly(store, action);
|
|
_updateLocalParticipant(store, action);
|
|
break;
|
|
case SET_LOCATION_URL:
|
|
_updateLocalParticipantFromUrl(store);
|
|
break;
|
|
}
|
|
|
|
return result;
|
|
});
|
|
|
|
/**
|
|
* Initializes the audio device handler based on the `disableCallIntegration` setting.
|
|
*
|
|
* @param {Store} store - The redux store.
|
|
* @private
|
|
* @returns {void}
|
|
*/
|
|
function _initializeCallIntegration({ getState }) {
|
|
const { disableCallIntegration } = getState()['features/base/settings'];
|
|
|
|
if (typeof disableCallIntegration === 'boolean') {
|
|
handleCallIntegrationChange(disableCallIntegration);
|
|
}
|
|
}
|
|
|
|
/**
|
|
* Maps the settings field names to participant names where they don't match.
|
|
* Currently there is only one such field, but may be extended in the future.
|
|
*
|
|
* @private
|
|
* @param {string} settingsField - The name of the settings field to map.
|
|
* @returns {string}
|
|
*/
|
|
function _mapSettingsFieldToParticipant(settingsField) {
|
|
switch (settingsField) {
|
|
case 'displayName':
|
|
return 'name';
|
|
}
|
|
|
|
return settingsField;
|
|
}
|
|
|
|
/**
|
|
* Handles a change in the `disableCallIntegration` setting.
|
|
*
|
|
* @param {Object} action - The redux action.
|
|
* @private
|
|
* @returns {void}
|
|
*/
|
|
function _maybeHandleCallIntegrationChange({ settings: { disableCallIntegration } }) {
|
|
if (typeof disableCallIntegration === 'boolean') {
|
|
handleCallIntegrationChange(disableCallIntegration);
|
|
}
|
|
}
|
|
|
|
/**
|
|
* Updates {@code startAudioOnly} flag if it's updated in the settings.
|
|
*
|
|
* @param {Store} store - The redux store.
|
|
* @param {Object} action - The redux action.
|
|
* @private
|
|
* @returns {void}
|
|
*/
|
|
function _maybeSetAudioOnly(
|
|
{ dispatch },
|
|
{ settings: { startAudioOnly } }) {
|
|
if (typeof startAudioOnly === 'boolean') {
|
|
dispatch(setAudioOnly(startAudioOnly, true));
|
|
}
|
|
}
|
|
|
|
/**
|
|
* Updates the local participant according to settings changes.
|
|
*
|
|
* @param {Store} store - The redux store.
|
|
* @param {Object} action - The dispatched action.
|
|
* @private
|
|
* @returns {void}
|
|
*/
|
|
function _updateLocalParticipant({ dispatch, getState }, action) {
|
|
const { settings } = action;
|
|
const localParticipant = getLocalParticipant(getState());
|
|
const newLocalParticipant = {
|
|
...localParticipant
|
|
};
|
|
|
|
for (const key in settings) {
|
|
if (settings.hasOwnProperty(key)) {
|
|
newLocalParticipant[_mapSettingsFieldToParticipant(key)]
|
|
= settings[key];
|
|
}
|
|
}
|
|
|
|
dispatch(participantUpdated(newLocalParticipant));
|
|
}
|
|
|
|
|
|
/**
|
|
* Returns the userInfo set in the URL.
|
|
*
|
|
* @param {Store} store - The redux store.
|
|
* @private
|
|
* @returns {void}
|
|
*/
|
|
function _updateLocalParticipantFromUrl({ dispatch, getState }) {
|
|
const urlParams
|
|
= parseURLParams(getState()['features/base/connection'].locationURL);
|
|
const urlEmail = urlParams['userInfo.email'];
|
|
|
|
if (!urlEmail) {
|
|
return;
|
|
}
|
|
|
|
const localParticipant = getLocalParticipant(getState());
|
|
|
|
if (localParticipant) {
|
|
dispatch(participantUpdated({
|
|
...localParticipant,
|
|
email: _.escape(urlEmail)
|
|
}));
|
|
}
|
|
}
|