Make getPropertyValue's config easier to use

This commit is contained in:
zbettenbuk 2018-04-13 12:57:12 +02:00 committed by Lyubo Marinov
parent 0539e8f2df
commit 1513e1f3b3
2 changed files with 59 additions and 43 deletions

View File

@ -60,12 +60,13 @@ function _setRoom({ dispatch, getState }, next, action) {
// Read the config.
const state = getState();
const hasRoom = Boolean(room);
const audioMuted = Boolean(getPropertyValue(state, 'startWithAudioMuted', {
ignoreUrlParams: !room
urlParams: hasRoom
}));
const videoMuted = Boolean(getPropertyValue(state, 'startWithVideoMuted', {
ignoreUrlParams: !room
urlParams: hasRoom
}));
sendAnalytics(createStartMutedConfigurationEvent(

View File

@ -4,64 +4,79 @@ import { parseURLParams } from '../config';
import { toState } from '../redux';
/**
* Returns the effective value of a property by applying a precedence
* between values in URL, config and profile.
* Returns the effective value of a configuration/preference/setting by applying
* a precedence among the values specified by JWT, URL, profile, and config.
*
* @param {Object|Function} stateful - The redux state object or function
* to retreive the state.
* @param {string} propertyName - The name of the property we need.
* @param {Object|Function} stateful - The redux state object or
* {@code getState} function.
* @param {string} propertyName - The name of the
* configuration/preference/setting (property) to retrieve.
* @param {{
* ignoreJWT: boolean,
* ignoreUrlParams: boolean,
* ignoreProfile: boolean,
* ignoreConfig: boolean
* }} precedence - A structure of booleans to set which property sources
* should be ignored.
* config: boolean,
* jwt: boolean,
* profile: boolean,
* urlParams: boolean
* }} [sources] - A set/structure of {@code boolean} flags indicating the
* configuration/preference/setting sources to consider/retrieve values from.
* @returns {any}
*/
export function getPropertyValue(
stateful: Object | Function,
propertyName: string,
precedence: Object = {
ignoreJWT: false,
ignoreUrlParams: false,
ignoreProfile: false,
ignoreConfig: false
}
sources?: Object
) {
// Default values don't play nicely with partial objects and we want to make
// the function easy to use without exhaustively defining all flags:
sources = { // eslint-disable-line no-param-reassign
// Defaults:
config: true,
jwt: true,
profile: true,
urlParams: true,
...sources
};
// Precedence: jwt -> urlParams -> profile -> config.
const state = toState(stateful);
const jwt = state['features/base/jwt'];
// jwt
if (sources.jwt) {
const value = state['features/base/jwt'][propertyName];
if (typeof value !== 'undefined') {
return value[propertyName];
}
}
// urlParams
if (sources.urlParams) {
const urlParams
= parseURLParams(state['features/base/connection'].locationURL);
const profile = state['features/base/profile'];
const config = state['features/base/config'];
const urlParamName = `config.${propertyName}`;
const value = urlParams[`config.${propertyName}`];
// Precedence: jwt -> urlParams -> profile -> config
if (
!precedence.ignoreJWT
&& typeof jwt[propertyName] !== 'undefined'
) {
return jwt[propertyName];
if (typeof value !== 'undefined') {
return value;
}
}
if (
!precedence.ignoreUrlParams
&& typeof urlParams[urlParamName] !== 'undefined'
) {
return urlParams[urlParamName];
// profile
if (sources.profile) {
const value = state['features/base/profile'][propertyName];
if (typeof value !== 'undefined') {
return value;
}
}
if (
!precedence.ignoreProfile
&& typeof profile[propertyName] !== 'undefined'
) {
return profile[propertyName];
}
// config
if (sources.config) {
const value = state['features/base/config'][propertyName];
if (!precedence.ignoreConfig) {
return config[propertyName];
if (typeof value !== 'undefined') {
return value;
}
}
return undefined;