You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

functions.web.js 2.9KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107
  1. /* @flow */
  2. import { toState } from '../base/redux';
  3. import { getDeepLinkingPage } from '../deep-linking';
  4. import {
  5. PluginRequiredBrowser,
  6. UnsupportedDesktopBrowser
  7. } from '../unsupported-browser';
  8. import {
  9. // eslint-disable-next-line camelcase
  10. _getRouteToRender as _super_getRouteToRender
  11. } from './getRouteToRender';
  12. declare var APP: Object;
  13. declare var interfaceConfig: Object;
  14. declare var loggingConfig: Object;
  15. /**
  16. * Array of rules defining whether we should {@link _interceptComponent} to
  17. * render.
  18. *
  19. * @private
  20. * @param {Object} state - Object containing current redux state.
  21. * @returns {Promise<ReactElement>|void}
  22. * @type {Function[]}
  23. */
  24. const _INTERCEPT_COMPONENT_RULES = [
  25. getDeepLinkingPage,
  26. state => {
  27. const { webRTCReady } = state['features/base/lib-jitsi-meet'];
  28. switch (typeof webRTCReady) {
  29. case 'boolean':
  30. if (webRTCReady === false) {
  31. return Promise.resolve(UnsupportedDesktopBrowser);
  32. }
  33. break;
  34. case 'undefined':
  35. // If webRTCReady is not set, then we cannot base a decision on it.
  36. break;
  37. default:
  38. return Promise.resolve(PluginRequiredBrowser);
  39. }
  40. return Promise.resolve();
  41. }
  42. ];
  43. /**
  44. * Determines which route is to be rendered in order to depict a specific redux
  45. * store.
  46. *
  47. * @param {(Object|Function)} stateOrGetState - The redux state or
  48. * {@link getState} function.
  49. * @returns {Promise<Route>}
  50. */
  51. export function _getRouteToRender(stateOrGetState: Object | Function): Object {
  52. const route = _super_getRouteToRender(stateOrGetState);
  53. // Intercepts route components if any of component interceptor rules is
  54. // satisfied.
  55. return _interceptComponent(stateOrGetState, route.component).then(
  56. (component: React$Element<*>) => {
  57. route.component = component;
  58. return route;
  59. }, () => Promise.resolve(route));
  60. }
  61. /**
  62. * Intercepts route components based on a {@link _INTERCEPT_COMPONENT_RULES}.
  63. *
  64. * @param {Object|Function} stateOrGetState - The redux state or
  65. * {@link getState} function.
  66. * @param {ReactElement} component - Current route component to render.
  67. * @private
  68. * @returns {Promise<ReactElement>} If any of the pre-defined rules is
  69. * satisfied, returns intercepted component.
  70. */
  71. function _interceptComponent(
  72. stateOrGetState: Object | Function,
  73. component: React$Element<*>) {
  74. const state = toState(stateOrGetState);
  75. const promises = [];
  76. _INTERCEPT_COMPONENT_RULES.forEach(rule => {
  77. promises.push(rule(state));
  78. });
  79. return Promise.all(promises).then(
  80. results =>
  81. results.find(result => typeof result !== 'undefined') || component,
  82. () => Promise.resolve(component));
  83. }
  84. /**
  85. * Returns application name.
  86. *
  87. * @returns {string} The application name.
  88. */
  89. export function getName() {
  90. return interfaceConfig.APP_NAME;
  91. }