123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142 |
- import { AtlasKitThemeProvider } from '@atlaskit/theme';
- import React from 'react';
-
- import '../../base/responsive-ui';
- import { getLocationContextRoot } from '../../base/util';
- import '../../room-lock';
-
- import { AbstractApp } from './AbstractApp';
-
- /**
- * Root application component.
- *
- * @extends AbstractApp
- */
- export class App extends AbstractApp {
- /**
- * App component's property types.
- *
- * @static
- */
- static propTypes = AbstractApp.propTypes;
-
- /**
- * Initializes a new App instance.
- *
- * @param {Object} props - The read-only React Component props with which
- * the new instance is to be initialized.
- */
- constructor(props) {
- super(props);
-
- this.state = {
- ...this.state,
-
- /**
- * The context root of window.location i.e. this Web App.
- *
- * @type {string}
- */
- windowLocationContextRoot: this._getWindowLocationContextRoot()
- };
- }
-
- /**
- * Overrides the parent method to inject {@link AtlasKitThemeProvider} as
- * the top most component.
- *
- * @override
- */
- _createElement(component, props) {
- return (
- <AtlasKitThemeProvider mode = 'dark'>
- { super._createElement(component, props) }
- </AtlasKitThemeProvider>
- );
- }
-
- /**
- * Gets a Location object from the window with information about the current
- * location of the document.
- *
- * @inheritdoc
- */
- getWindowLocation() {
- return window.location;
- }
-
- /**
- * Gets the context root of this Web App from window.location.
- *
- * @private
- * @returns {string} The context root of window.location i.e. this Web App.
- */
- _getWindowLocationContextRoot() {
- return getLocationContextRoot(this.getWindowLocation());
- }
-
- /**
- * Navigates to a specific Route (via platform-specific means).
- *
- * @param {Route} route - The Route to which to navigate.
- * @protected
- * @returns {void}
- */
- _navigate(route) {
- let path;
-
- if (route) {
- path = route.path;
-
- const store = this._getStore();
-
- // The syntax :room bellow is defined by react-router. It "matches a
- // URL segment up to the next /, ?, or #. The matched string is
- // called a param."
- path
- = path.replace(
- /:room/g,
- store.getState()['features/base/conference'].room);
- path = this._routePath2WindowLocationPathname(path);
- }
-
- // Navigate to the specified Route.
- const windowLocation = this.getWindowLocation();
- let promise;
-
- if (!route || windowLocation.pathname === path) {
- // The browser is at the specified path already and what remains is
- // to make this App instance aware of the route to be rendered at
- // the current location.
-
- // XXX Refer to the super's _navigate for an explanation why a
- // Promise is returned.
- promise = super._navigate(route);
- } else {
- // The browser must go to the specified location. Once the specified
- // location becomes current, the App will be made aware of the route
- // to be rendered at it.
- windowLocation.pathname = path;
- }
-
- return promise || Promise.resolve();
- }
-
- /**
- * Converts a specific Route path to a window.location.pathname.
- *
- * @param {string} path - A Route path to be converted to/represeted as a
- * window.location.pathname.
- * @private
- * @returns {string} A window.location.pathname-compatible representation of
- * the specified Route path.
- */
- _routePath2WindowLocationPathname(path) {
- let pathname = this.state.windowLocationContextRoot;
-
- pathname.endsWith('/') || (pathname += '/');
- pathname += path.startsWith('/') ? path.substring(1) : path;
-
- return pathname;
- }
- }
|