Lyubomir Marinov 49b3b49f3e Remove duplication
The files react/index.native.js and react/index.web.js ended up having
very similar source code related to initializing the Redux store. Remove
the duplication.

Additionally, I always wanted the App React Component to be consumed
without the need to provide a Redux store to it.
2017-01-26 17:24:11 -06:00

73 lines
2.0 KiB
JavaScript

import { appInit } from '../actions';
import { AbstractApp } from './AbstractApp';
/**
* Root application component.
*
* @extends AbstractApp
*/
export class App extends AbstractApp {
/**
* App component's property types.
*
* @static
*/
static propTypes = AbstractApp.propTypes
/**
* Inits the app before component will mount.
*
* @inheritdoc
*/
componentWillMount(...args) {
super.componentWillMount(...args);
this._getStore().dispatch(appInit());
}
/**
* Gets a Location object from the window with information about the current
* location of the document.
*
* @inheritdoc
*/
_getWindowLocation() {
return window.location;
}
/**
* 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 = 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);
// Navigate to the specified Route.
const windowLocation = this._getWindowLocation();
if (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.
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;
}
}
}