您最多选择25个主题 主题必须以字母或数字开头,可以包含连字符 (-),并且长度不得超过35个字符

functions.web.js 2.9KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109
  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. export * from './functions.any';
  44. /**
  45. * Determines which route is to be rendered in order to depict a specific redux
  46. * store.
  47. *
  48. * @param {(Object|Function)} stateOrGetState - The redux state or
  49. * {@link getState} function.
  50. * @returns {Promise<Route>}
  51. */
  52. export function _getRouteToRender(stateOrGetState: Object | Function): Object {
  53. const route = _super_getRouteToRender(stateOrGetState);
  54. // Intercepts route components if any of component interceptor rules is
  55. // satisfied.
  56. return _interceptComponent(stateOrGetState, route.component).then(
  57. (component: React$Element<*>) => {
  58. route.component = component;
  59. return route;
  60. }, () => Promise.resolve(route));
  61. }
  62. /**
  63. * Intercepts route components based on a {@link _INTERCEPT_COMPONENT_RULES}.
  64. *
  65. * @param {Object|Function} stateOrGetState - The redux state or
  66. * {@link getState} function.
  67. * @param {ReactElement} component - Current route component to render.
  68. * @private
  69. * @returns {Promise<ReactElement>} If any of the pre-defined rules is
  70. * satisfied, returns intercepted component.
  71. */
  72. function _interceptComponent(
  73. stateOrGetState: Object | Function,
  74. component: React$Element<*>) {
  75. const state = toState(stateOrGetState);
  76. const promises = [];
  77. _INTERCEPT_COMPONENT_RULES.forEach(rule => {
  78. promises.push(rule(state));
  79. });
  80. return Promise.all(promises).then(
  81. results =>
  82. results.find(result => typeof result !== 'undefined') || component,
  83. () => Promise.resolve(component));
  84. }
  85. /**
  86. * Returns application name.
  87. *
  88. * @returns {string} The application name.
  89. */
  90. export function getName() {
  91. return interfaceConfig.APP_NAME;
  92. }