123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109 |
- // @flow
-
- import { toState } from '../base/redux';
- import { getDeepLinkingPage } from '../deep-linking';
- import {
- PluginRequiredBrowser,
- UnsupportedDesktopBrowser
- } from '../unsupported-browser';
-
- import {
- // eslint-disable-next-line camelcase
- _getRouteToRender as _super_getRouteToRender
- } from './getRouteToRender';
-
- 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 {Promise<ReactElement>|void}
- * @type {Function[]}
- */
- const _INTERCEPT_COMPONENT_RULES = [
- getDeepLinkingPage,
- state => {
- const { webRTCReady } = state['features/base/lib-jitsi-meet'];
-
- switch (typeof webRTCReady) {
- case 'boolean':
- if (webRTCReady === false) {
- return Promise.resolve(UnsupportedDesktopBrowser);
- }
- break;
-
- case 'undefined':
- // If webRTCReady is not set, then we cannot base a decision on it.
- break;
-
- default:
- return Promise.resolve(PluginRequiredBrowser);
- }
-
- return Promise.resolve();
- }
- ];
-
- export * from './functions.any';
-
- /**
- * Determines which route is to be rendered in order to depict a specific redux
- * store.
- *
- * @param {(Object|Function)} stateOrGetState - The redux state or
- * {@link getState} function.
- * @returns {Promise<Route>}
- */
- export function _getRouteToRender(stateOrGetState: Object | Function): Object {
- const route = _super_getRouteToRender(stateOrGetState);
-
- // Intercepts route components if any of component interceptor rules is
- // satisfied.
- return _interceptComponent(stateOrGetState, route.component).then(
- (component: React$Element<*>) => {
- route.component = component;
-
- return route;
- }, () => Promise.resolve(route));
- }
-
- /**
- * Intercepts route components based on a {@link _INTERCEPT_COMPONENT_RULES}.
- *
- * @param {Object|Function} stateOrGetState - The redux state or
- * {@link getState} function.
- * @param {ReactElement} component - Current route component to render.
- * @private
- * @returns {Promise<ReactElement>} If any of the pre-defined rules is
- * satisfied, returns intercepted component.
- */
- function _interceptComponent(
- stateOrGetState: Object | Function,
- component: React$Element<*>) {
- const state = toState(stateOrGetState);
-
- const promises = [];
-
- _INTERCEPT_COMPONENT_RULES.forEach(rule => {
- promises.push(rule(state));
- });
-
- return Promise.all(promises).then(
- results =>
- results.find(result => typeof result !== 'undefined') || component,
- () => Promise.resolve(component));
- }
-
- /**
- * Returns application name.
- *
- * @returns {string} The application name.
- */
- export function getName() {
- return interfaceConfig.APP_NAME;
- }
|