[RN] Disconnect/hangup before joining a new URL
This commit is contained in:
parent
61fd4e4ce4
commit
7dbba59dee
|
@ -4,7 +4,7 @@ import { setConfig } from '../base/config';
|
||||||
import { loadConfig } from '../base/lib-jitsi-meet';
|
import { loadConfig } from '../base/lib-jitsi-meet';
|
||||||
|
|
||||||
import { APP_WILL_MOUNT, APP_WILL_UNMOUNT } from './actionTypes';
|
import { APP_WILL_MOUNT, APP_WILL_UNMOUNT } from './actionTypes';
|
||||||
import { _getRouteToRender, _parseURIString } from './functions';
|
import { _parseURIString } from './functions';
|
||||||
|
|
||||||
declare var APP: Object;
|
declare var APP: Object;
|
||||||
|
|
||||||
|
@ -50,7 +50,7 @@ function _appNavigateToMandatoryLocation(
|
||||||
|
|
||||||
if (oldHost === newHost) {
|
if (oldHost === newHost) {
|
||||||
dispatchSetLocationURL();
|
dispatchSetLocationURL();
|
||||||
dispatchSetRoomAndNavigate();
|
dispatchSetRoom();
|
||||||
} else {
|
} else {
|
||||||
// If the host has changed, we need to load the config of the new host
|
// If the host has changed, we need to load the config of the new host
|
||||||
// and set it, and only after that we can navigate to a different route.
|
// and set it, and only after that we can navigate to a different route.
|
||||||
|
@ -58,7 +58,7 @@ function _appNavigateToMandatoryLocation(
|
||||||
.then(
|
.then(
|
||||||
config => configLoaded(/* err */ undefined, config),
|
config => configLoaded(/* err */ undefined, config),
|
||||||
err => configLoaded(err, /* config */ undefined))
|
err => configLoaded(err, /* config */ undefined))
|
||||||
.then(dispatchSetRoomAndNavigate);
|
.then(dispatchSetRoom);
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
@ -110,8 +110,8 @@ function _appNavigateToMandatoryLocation(
|
||||||
*
|
*
|
||||||
* @returns {void}
|
* @returns {void}
|
||||||
*/
|
*/
|
||||||
function dispatchSetRoomAndNavigate() {
|
function dispatchSetRoom() {
|
||||||
dispatch(_setRoomAndNavigate(newLocation.room));
|
dispatch(setRoom(newLocation.room));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -219,32 +219,3 @@ function _loadConfig(location: Object) {
|
||||||
|
|
||||||
return loadConfig(protocol + location.host + (location.contextRoot || '/'));
|
return loadConfig(protocol + location.host + (location.contextRoot || '/'));
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
|
||||||
* Navigates to a route in accord with a specific redux state.
|
|
||||||
*
|
|
||||||
* @param {Object} state - The redux state which determines/identifies the route
|
|
||||||
* to navigate to.
|
|
||||||
* @private
|
|
||||||
* @returns {void}
|
|
||||||
*/
|
|
||||||
function _navigate(state) {
|
|
||||||
const app = state['features/app'].app;
|
|
||||||
const routeToRender = _getRouteToRender(state);
|
|
||||||
|
|
||||||
app._navigate(routeToRender);
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Sets room and navigates to new route if needed.
|
|
||||||
*
|
|
||||||
* @param {string} newRoom - New room name.
|
|
||||||
* @private
|
|
||||||
* @returns {Function}
|
|
||||||
*/
|
|
||||||
function _setRoomAndNavigate(newRoom) {
|
|
||||||
return (dispatch, getState) => {
|
|
||||||
dispatch(setRoom(newRoom));
|
|
||||||
_navigate(getState());
|
|
||||||
};
|
|
||||||
}
|
|
||||||
|
|
|
@ -65,22 +65,27 @@ export class App extends AbstractApp {
|
||||||
* @returns {void}
|
* @returns {void}
|
||||||
*/
|
*/
|
||||||
_navigate(route) {
|
_navigate(route) {
|
||||||
let path = route.path;
|
let path;
|
||||||
const store = this._getStore();
|
|
||||||
|
|
||||||
// The syntax :room bellow is defined by react-router. It "matches a URL
|
if (route) {
|
||||||
// segment up to the next /, ?, or #. The matched string is called a
|
path = route.path;
|
||||||
// param."
|
|
||||||
path
|
const store = this._getStore();
|
||||||
= path.replace(
|
|
||||||
/:room/g,
|
// The syntax :room bellow is defined by react-router. It "matches a
|
||||||
store.getState()['features/base/conference'].room);
|
// URL segment up to the next /, ?, or #. The matched string is
|
||||||
path = this._routePath2WindowLocationPathname(path);
|
// called a param."
|
||||||
|
path
|
||||||
|
= path.replace(
|
||||||
|
/:room/g,
|
||||||
|
store.getState()['features/base/conference'].room);
|
||||||
|
path = this._routePath2WindowLocationPathname(path);
|
||||||
|
}
|
||||||
|
|
||||||
// Navigate to the specified Route.
|
// Navigate to the specified Route.
|
||||||
const windowLocation = this.getWindowLocation();
|
const windowLocation = this.getWindowLocation();
|
||||||
|
|
||||||
if (windowLocation.pathname === path) {
|
if (!route || windowLocation.pathname === path) {
|
||||||
// The browser is at the specified path already and what remains is
|
// 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
|
// to make this App instance aware of the route to be rendered at
|
||||||
// the current location.
|
// the current location.
|
||||||
|
|
|
@ -1,6 +1,8 @@
|
||||||
|
import { SET_ROOM } from '../base/conference';
|
||||||
import {
|
import {
|
||||||
CONNECTION_ESTABLISHED,
|
CONNECTION_ESTABLISHED,
|
||||||
getURLWithoutParams
|
getURLWithoutParams,
|
||||||
|
SET_LOCATION_URL
|
||||||
} from '../base/connection';
|
} from '../base/connection';
|
||||||
import { MiddlewareRegistry } from '../base/redux';
|
import { MiddlewareRegistry } from '../base/redux';
|
||||||
|
|
||||||
|
@ -8,6 +10,10 @@ MiddlewareRegistry.register(store => next => action => {
|
||||||
switch (action.type) {
|
switch (action.type) {
|
||||||
case CONNECTION_ESTABLISHED:
|
case CONNECTION_ESTABLISHED:
|
||||||
return _connectionEstablished(store, next, action);
|
return _connectionEstablished(store, next, action);
|
||||||
|
|
||||||
|
case SET_LOCATION_URL:
|
||||||
|
case SET_ROOM:
|
||||||
|
return _setLocationURLOrRoom(store, next, action);
|
||||||
}
|
}
|
||||||
|
|
||||||
return next(action);
|
return next(action);
|
||||||
|
@ -53,3 +59,40 @@ function _connectionEstablished(store, next, action) {
|
||||||
|
|
||||||
return result;
|
return result;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Navigates to a route in accord with a specific redux state.
|
||||||
|
*
|
||||||
|
* @param {Object} state - The redux state which determines/identifies the route
|
||||||
|
* to navigate to.
|
||||||
|
* @private
|
||||||
|
* @returns {void}
|
||||||
|
*/
|
||||||
|
function _navigate(state) {
|
||||||
|
const { app, getRouteToRender } = state['features/app'];
|
||||||
|
const routeToRender = getRouteToRender && getRouteToRender(state);
|
||||||
|
|
||||||
|
app._navigate(routeToRender);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Notifies the feature app that the action {@link SET_LOCATION_URL} or
|
||||||
|
* {@link SET_ROOM} is being dispatched within a specific redux {@code store}.
|
||||||
|
*
|
||||||
|
* @param {Store} store - The redux store in which the specified {@code action}
|
||||||
|
* is being dispatched.
|
||||||
|
* @param {Dispatch} next - The redux {@code dispatch} function to dispatch the
|
||||||
|
* specified {@code action} to the specified {@code store}.
|
||||||
|
* @param {Action} action - The redux action {@code SET_LOCATION_URL} or
|
||||||
|
* {@code SET_ROOM} which is being dispatched in the specified {@code store}.
|
||||||
|
* @private
|
||||||
|
* @returns {Object} The new state that is the result of the reduction of the
|
||||||
|
* specified {@code action}.
|
||||||
|
*/
|
||||||
|
function _setLocationURLOrRoom({ getState }, next, action) {
|
||||||
|
const result = next(action);
|
||||||
|
|
||||||
|
_navigate(getState());
|
||||||
|
|
||||||
|
return result;
|
||||||
|
}
|
||||||
|
|
|
@ -1,6 +1,10 @@
|
||||||
import { ReducerRegistry } from '../base/redux';
|
import { SET_ROOM } from '../base/conference';
|
||||||
|
import { SET_LOCATION_URL } from '../base/connection';
|
||||||
|
|
||||||
|
import { ReducerRegistry, set } from '../base/redux';
|
||||||
|
|
||||||
import { APP_WILL_MOUNT, APP_WILL_UNMOUNT } from './actionTypes';
|
import { APP_WILL_MOUNT, APP_WILL_UNMOUNT } from './actionTypes';
|
||||||
|
import { _getRouteToRender } from './functions';
|
||||||
|
|
||||||
ReducerRegistry.register('features/app', (state = {}, action) => {
|
ReducerRegistry.register('features/app', (state = {}, action) => {
|
||||||
switch (action.type) {
|
switch (action.type) {
|
||||||
|
@ -31,6 +35,12 @@ ReducerRegistry.register('features/app', (state = {}, action) => {
|
||||||
};
|
};
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
|
|
||||||
|
case SET_LOCATION_URL:
|
||||||
|
return set(state, 'getRouteToRender', undefined);
|
||||||
|
|
||||||
|
case SET_ROOM:
|
||||||
|
return set(state, 'getRouteToRender', _getRouteToRender);
|
||||||
}
|
}
|
||||||
|
|
||||||
return state;
|
return state;
|
||||||
|
|
Loading…
Reference in New Issue