123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110 |
- // @flow
-
- import type { Component } from 'react';
-
- import { isRoomValid } from '../base/conference';
- import JitsiMeetJS from '../base/lib-jitsi-meet';
- import { Platform } from '../base/react';
- import { toState } from '../base/redux';
- import { Conference } from '../conference';
- import { getDeepLinkingPage } from '../deep-linking';
- import { UnsupportedDesktopBrowser } from '../unsupported-browser';
- import {
- BlankPage,
- WelcomePage,
- generateRoomWithoutSeparator,
- isWelcomePageAppEnabled,
- isWelcomePageUserEnabled
- } from '../welcome';
-
- declare var interfaceConfig: Object;
-
- /**
- * Object describing application route.
- *
- * @typedef {Object} Route
- * @property {Component} component - React Component constructor.
- * @property {string|undefined} href - New location, in case navigation involves
- * a location change.
- */
- export type Route = {
- component: Class<Component<*>>,
- href: ?string
- };
-
- /**
- * Determines which route is to be rendered in order to depict a specific Redux
- * store.
- *
- * @param {(Function|Object)} stateful - THe redux store, state, or
- * {@code getState} function.
- * @returns {Promise<Route>}
- */
- export function _getRouteToRender(stateful: Function | Object): Promise<Route> {
- const state = toState(stateful);
- const { room } = state['features/base/conference'];
- const isMobileApp = navigator.product === 'ReactNative';
- const isMobileBrowser
- = !isMobileApp && (Platform.OS === 'android' || Platform.OS === 'ios');
- const route: Route = {
- component: BlankPage,
- href: undefined
- };
-
- return new Promise(resolve => {
- // First, check if the current endpoint supports WebRTC. We are
- // intentionally not performing the check for mobile browsers because:
- // - the WelcomePage is mobile ready;
- // - if the URL points to a conference, getDeepLinkingPage will take
- // care of it.
- if (!isMobileBrowser && !JitsiMeetJS.isWebRtcSupported()) {
- route.component = UnsupportedDesktopBrowser;
- resolve(route);
-
- return;
- }
-
- if (isRoomValid(room)) {
- if (isMobileApp) {
- route.component = Conference;
- resolve(route);
- } else {
- // Update the location if it doesn't match. This happens when a
- // room is joined from the welcome page. The reason for doing
- // this instead of using the history API is that we want to load
- // the config.js which takes the room into account.
- const { locationURL } = state['features/base/connection'];
-
- // eslint-disable-next-line no-negated-condition
- if (window.location.href !== locationURL.href) {
- route.href = locationURL.href;
- resolve(route);
- } else {
- // Maybe show deep-linking, otherwise go to Conference.
- getDeepLinkingPage(state).then(component => {
- route.component = component || Conference;
- resolve(route);
- });
- }
- }
-
- return;
- }
-
- if (!isWelcomePageUserEnabled(state)) {
- // Web: if the welcome page is disabled, go directly to a random
- // room.
-
- let href = window.location.href;
-
- href.endsWith('/') || (href += '/');
- route.href = href + generateRoomWithoutSeparator();
- } else if (isWelcomePageAppEnabled(state)) {
- // Mobile: only go to the welcome page if enabled.
-
- route.component = WelcomePage;
- }
-
- resolve(route);
- });
- }
|