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

interceptComponent.js 2.7KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495969798
  1. /* @flow */
  2. import { Platform } from '../react';
  3. import {
  4. NoMobileApp,
  5. PluginRequiredBrowser,
  6. UnsupportedDesktopBrowser,
  7. UnsupportedMobileBrowser
  8. } from '../../unsupported-browser';
  9. declare var APP: Object;
  10. declare var interfaceConfig: Object;
  11. declare var JitsiMeetJS: Object;
  12. /**
  13. * Array of rules defining whether we should intercept component to render
  14. * or not.
  15. *
  16. * @private
  17. * @param {Object} state - Object containing current Redux state.
  18. * @returns {ReactElement|void}
  19. * @type {Function[]}
  20. */
  21. const _RULES = [
  22. /**
  23. * This rule describes case when user opens application using mobile
  24. * browser. In order to promote the app, we choose to suggest the mobile
  25. * app even if the browser supports the app (e.g. Google Chrome with
  26. * WebRTC support on Android).
  27. *
  28. * @param {Object} state - Redux state of the app.
  29. * @returns {UnsupportedMobileBrowser|void} If the rule is satisfied then
  30. * we should intercept existing component by UnsupportedMobileBrowser.
  31. */
  32. () => {
  33. const OS = Platform.OS;
  34. if (OS === 'android' || OS === 'ios') {
  35. const mobileAppPromo
  36. = typeof interfaceConfig === 'object'
  37. && interfaceConfig.MOBILE_APP_PROMO;
  38. return (
  39. typeof mobileAppPromo === 'undefined' || Boolean(mobileAppPromo)
  40. ? UnsupportedMobileBrowser
  41. : NoMobileApp);
  42. }
  43. },
  44. state => {
  45. const { webRTCReady } = state['features/base/lib-jitsi-meet'];
  46. switch (typeof webRTCReady) {
  47. case 'boolean':
  48. if (webRTCReady === false) {
  49. return UnsupportedDesktopBrowser;
  50. }
  51. break;
  52. case 'undefined':
  53. // If webRTCReady is not set, then we cannot use it to take a
  54. // decision.
  55. break;
  56. default:
  57. return PluginRequiredBrowser;
  58. }
  59. }
  60. ];
  61. /**
  62. * Utility method that responsible for intercepting of route components based on
  63. * the set of defined rules.
  64. *
  65. * @param {Object|Function} stateOrGetState - Either Redux state object or
  66. * getState() function.
  67. * @param {ReactElement} component - Current route component to render.
  68. * @returns {ReactElement} If any of rules is satisfied returns intercepted
  69. * component.
  70. */
  71. export function interceptComponent(
  72. stateOrGetState: Object,
  73. component: ReactElement<*>) {
  74. let result;
  75. const state
  76. = typeof stateOrGetState === 'function'
  77. ? stateOrGetState()
  78. : stateOrGetState;
  79. for (const rule of _RULES) {
  80. result = rule(state);
  81. if (result) {
  82. break;
  83. }
  84. }
  85. return result || component;
  86. }