[RN] Mitigate 'Not joining a new URL while in a conference'

This commit is contained in:
Lyubo Marinov
2017-08-01 06:31:03 -05:00
parent d778b716be
commit caea02a322
4 changed files with 33 additions and 18 deletions
+15 -5
View File
@@ -184,7 +184,7 @@ export class AbstractApp extends Component {
* @returns {ReactElement}
*/
render() {
const route = this.state.route;
const { route } = this.state;
if (route) {
return (
@@ -348,15 +348,14 @@ export class AbstractApp extends Component {
* Navigates to a specific Route.
*
* @param {Route} route - The Route to which to navigate.
* @returns {void}
* @returns {Promise}
*/
_navigate(route) {
if (RouteRegistry.areRoutesEqual(this.state.route, route)) {
return;
return Promise.resolve();
}
let nextState = {
...this.state,
route
};
@@ -375,7 +374,18 @@ export class AbstractApp extends Component {
nextState = undefined;
});
nextState && this.setState(nextState);
// XXX React's setState is asynchronous which means that the value of
// this.state.route above may not even be correct. If the check is
// performed before setState completes, the app may not navigate to the
// expected route. In order to mitigate the problem, _navigate was
// changed to return a Promise.
return new Promise(resolve => {
if (nextState) {
this.setState(nextState, resolve);
} else {
resolve();
}
});
}
/**
+7 -1
View File
@@ -84,18 +84,24 @@ export class App extends AbstractApp {
// 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.
super._navigate(route);
// 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();
}
/**