Move interceptComponent.js out of features/base/util

I don't like the file/function name, I'm not excited about the
complexity of the logic it implements, and it's definitely a reusable
piece worthy of being called a utility.
This commit is contained in:
Lyubo Marinov 2017-04-14 11:48:40 -05:00
parent 5163472392
commit 8e6f043586
3 changed files with 100 additions and 105 deletions

View File

@ -1,10 +1,17 @@
/* global APP, loggingConfig */ /* @flow */
import Logger from 'jitsi-meet-logger';
import { isRoomValid } from '../base/conference'; import { isRoomValid } from '../base/conference';
import JitsiMeetJS from '../base/lib-jitsi-meet'; import JitsiMeetJS from '../base/lib-jitsi-meet';
import { RouteRegistry } from '../base/react'; import { Platform, RouteRegistry } from '../base/react';
import { interceptComponent } from '../base/util';
import { Conference } from '../conference'; import { Conference } from '../conference';
import {
NoMobileApp,
PluginRequiredBrowser,
UnsupportedDesktopBrowser,
UnsupportedMobileBrowser
} from '../unsupported-browser';
import { WelcomePage } from '../welcome'; import { WelcomePage } from '../welcome';
import URLProcessor from '../../../modules/config/URLProcessor'; import URLProcessor from '../../../modules/config/URLProcessor';
@ -13,7 +20,65 @@ import KeyboardShortcut
import getTokenData from '../../../modules/tokendata/TokenData'; import getTokenData from '../../../modules/tokendata/TokenData';
import JitsiMeetLogStorage from '../../../modules/util/JitsiMeetLogStorage'; import JitsiMeetLogStorage from '../../../modules/util/JitsiMeetLogStorage';
const Logger = require('jitsi-meet-logger'); declare var APP: Object;
declare var interfaceConfig: Object;
declare var loggingConfig: Object;
/**
* Array of rules defining whether we should {@link _interceptComponent} to
* render.
*
* @private
* @param {Object} state - Object containing current Redux state.
* @returns {ReactElement|void}
* @type {Function[]}
*/
const _INTERCEPT_COMPONENT_RULES = [
/**
* This rule describes case when user opens application using mobile
* browser. In order to promote the app, we choose to suggest the mobile
* app even if the browser supports the app (e.g. Google Chrome with
* WebRTC support on Android).
*
* @param {Object} state - Redux state of the app.
* @returns {UnsupportedMobileBrowser|void} If the rule is satisfied then
* we should intercept existing component by UnsupportedMobileBrowser.
*/
() => {
const OS = Platform.OS;
if (OS === 'android' || OS === 'ios') {
const mobileAppPromo
= typeof interfaceConfig === 'object'
&& interfaceConfig.MOBILE_APP_PROMO;
return (
typeof mobileAppPromo === 'undefined' || Boolean(mobileAppPromo)
? UnsupportedMobileBrowser
: NoMobileApp);
}
},
state => {
const { webRTCReady } = state['features/base/lib-jitsi-meet'];
switch (typeof webRTCReady) {
case 'boolean':
if (webRTCReady === false) {
return UnsupportedDesktopBrowser;
}
break;
case 'undefined':
// If webRTCReady is not set, then we cannot use it to take a
// decision.
break;
default:
return PluginRequiredBrowser;
}
}
];
export { _parseURIString } from './functions.native'; export { _parseURIString } from './functions.native';
@ -25,7 +90,7 @@ export { _parseURIString } from './functions.native';
* method. * method.
* @returns {Route} * @returns {Route}
*/ */
export function _getRouteToRender(stateOrGetState) { export function _getRouteToRender(stateOrGetState: Object | Function) {
const state const state
= typeof stateOrGetState === 'function' = typeof stateOrGetState === 'function'
? stateOrGetState() ? stateOrGetState()
@ -38,7 +103,7 @@ export function _getRouteToRender(stateOrGetState) {
// Intercepts route components if any of component interceptor rules // Intercepts route components if any of component interceptor rules
// is satisfied. // is satisfied.
route.component = interceptComponent(state, component); route.component = _interceptComponent(state, component);
return route; return route;
} }
@ -118,3 +183,32 @@ function _initLogging() {
JitsiMeetJS.addGlobalLogTransport(APP.logCollector); JitsiMeetJS.addGlobalLogTransport(APP.logCollector);
} }
} }
/**
* Intercepts route components based on a {@link _INTERCEPT_COMPONENT_RULES}.
*
* @param {Object|Function} stateOrGetState - Either Redux state object or
* getState() function.
* @param {ReactElement} component - Current route component to render.
* @private
* @returns {ReactElement} If any of the pre-defined rules is satisfied, returns
* intercepted component.
*/
function _interceptComponent(
stateOrGetState: Object,
component: ReactElement<*>) {
let result;
const state
= typeof stateOrGetState === 'function'
? stateOrGetState()
: stateOrGetState;
for (const rule of _INTERCEPT_COMPONENT_RULES) {
result = rule(state);
if (result) {
break;
}
}
return result || component;
}

View File

@ -1,4 +1,3 @@
export * from './interceptComponent';
export * from './loadScript'; export * from './loadScript';
export * from './randomUtil'; export * from './randomUtil';
export * from './roomnameGenerator'; export * from './roomnameGenerator';

View File

@ -1,98 +0,0 @@
/* @flow */
import { Platform } from '../react';
import {
NoMobileApp,
PluginRequiredBrowser,
UnsupportedDesktopBrowser,
UnsupportedMobileBrowser
} from '../../unsupported-browser';
declare var APP: Object;
declare var interfaceConfig: Object;
declare var JitsiMeetJS: Object;
/**
* Array of rules defining whether we should intercept component to render
* or not.
*
* @private
* @param {Object} state - Object containing current Redux state.
* @returns {ReactElement|void}
* @type {Function[]}
*/
const _RULES = [
/**
* This rule describes case when user opens application using mobile
* browser. In order to promote the app, we choose to suggest the mobile
* app even if the browser supports the app (e.g. Google Chrome with
* WebRTC support on Android).
*
* @param {Object} state - Redux state of the app.
* @returns {UnsupportedMobileBrowser|void} If the rule is satisfied then
* we should intercept existing component by UnsupportedMobileBrowser.
*/
() => {
const OS = Platform.OS;
if (OS === 'android' || OS === 'ios') {
const mobileAppPromo
= typeof interfaceConfig === 'object'
&& interfaceConfig.MOBILE_APP_PROMO;
return (
typeof mobileAppPromo === 'undefined' || Boolean(mobileAppPromo)
? UnsupportedMobileBrowser
: NoMobileApp);
}
},
state => {
const { webRTCReady } = state['features/base/lib-jitsi-meet'];
switch (typeof webRTCReady) {
case 'boolean':
if (webRTCReady === false) {
return UnsupportedDesktopBrowser;
}
break;
case 'undefined':
// If webRTCReady is not set, then we cannot use it to take a
// decision.
break;
default:
return PluginRequiredBrowser;
}
}
];
/**
* Utility method that responsible for intercepting of route components based on
* the set of defined rules.
*
* @param {Object|Function} stateOrGetState - Either Redux state object or
* getState() function.
* @param {ReactElement} component - Current route component to render.
* @returns {ReactElement} If any of rules is satisfied returns intercepted
* component.
*/
export function interceptComponent(
stateOrGetState: Object,
component: ReactElement<*>) {
let result;
const state
= typeof stateOrGetState === 'function'
? stateOrGetState()
: stateOrGetState;
for (const rule of _RULES) {
result = rule(state);
if (result) {
break;
}
}
return result || component;
}