136 lines
3.7 KiB
JavaScript
136 lines
3.7 KiB
JavaScript
|
import { setRoom } from '../base/conference';
|
||
|
import {
|
||
|
getDomain,
|
||
|
setDomain
|
||
|
} from '../base/connection';
|
||
|
import {
|
||
|
loadConfig,
|
||
|
setConfig
|
||
|
} from '../base/lib-jitsi-meet';
|
||
|
|
||
|
import {
|
||
|
APP_WILL_MOUNT,
|
||
|
APP_WILL_UNMOUNT
|
||
|
} from './actionTypes';
|
||
|
import {
|
||
|
_getRoomAndDomainFromUrlString,
|
||
|
_getRouteToRender
|
||
|
} from './functions';
|
||
|
import './reducer';
|
||
|
|
||
|
/**
|
||
|
* Triggers an in-app navigation to a different route. Allows navigation to be
|
||
|
* abstracted between the mobile and web versions.
|
||
|
*
|
||
|
* @param {(string|undefined)} urlOrRoom - The URL or room name to which to
|
||
|
* navigate.
|
||
|
* @returns {Function}
|
||
|
*/
|
||
|
export function appNavigate(urlOrRoom) {
|
||
|
return (dispatch, getState) => {
|
||
|
const oldDomain = getDomain(getState());
|
||
|
|
||
|
const { domain, room } = _getRoomAndDomainFromUrlString(urlOrRoom);
|
||
|
|
||
|
// TODO Kostiantyn Tsaregradskyi: We should probably detect if user is
|
||
|
// currently in a conference and ask her if she wants to close the
|
||
|
// current conference and start a new one with the new room name or
|
||
|
// domain.
|
||
|
|
||
|
if (typeof domain === 'undefined' || oldDomain === domain) {
|
||
|
// If both domain and room vars became undefined, that means we're
|
||
|
// actually dealing with just room name and not with URL.
|
||
|
dispatch(
|
||
|
_setRoomAndNavigate(
|
||
|
typeof room === 'undefined' && typeof domain === 'undefined'
|
||
|
? urlOrRoom
|
||
|
: room));
|
||
|
} else if (oldDomain !== domain) {
|
||
|
// Update domain without waiting for config to be loaded to prevent
|
||
|
// race conditions when we will start to load config multiple times.
|
||
|
dispatch(setDomain(domain));
|
||
|
|
||
|
// If domain has changed, that means we need to load new config
|
||
|
// for that new domain and set it, and only after that we can
|
||
|
// navigate to different route.
|
||
|
loadConfig(`https://${domain}`)
|
||
|
.then(config => {
|
||
|
// We set room name only here to prevent race conditions on
|
||
|
// app start to not make app re-render conference page for
|
||
|
// two times.
|
||
|
dispatch(setRoom(room));
|
||
|
dispatch(setConfig(config));
|
||
|
_navigate(getState());
|
||
|
});
|
||
|
}
|
||
|
};
|
||
|
}
|
||
|
|
||
|
/**
|
||
|
* Signals that a specific App will mount (in the terms of React).
|
||
|
*
|
||
|
* @param {App} app - The App which will mount.
|
||
|
* @returns {{
|
||
|
* type: APP_WILL_MOUNT,
|
||
|
* app: App
|
||
|
* }}
|
||
|
*/
|
||
|
export function appWillMount(app) {
|
||
|
return {
|
||
|
type: APP_WILL_MOUNT,
|
||
|
app
|
||
|
};
|
||
|
}
|
||
|
|
||
|
/**
|
||
|
* Signals that a specific App will unmount (in the terms of React).
|
||
|
*
|
||
|
* @param {App} app - The App which will unmount.
|
||
|
* @returns {{
|
||
|
* type: APP_WILL_UNMOUNT,
|
||
|
* app: App
|
||
|
* }}
|
||
|
*/
|
||
|
export function appWillUnmount(app) {
|
||
|
return {
|
||
|
type: APP_WILL_UNMOUNT,
|
||
|
app
|
||
|
};
|
||
|
}
|
||
|
|
||
|
/**
|
||
|
* Navigates to route corresponding to current room name.
|
||
|
*
|
||
|
* @param {Object} state - Redux state.
|
||
|
* @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) => {
|
||
|
const oldRoom = getState()['features/base/conference'].room;
|
||
|
|
||
|
dispatch(setRoom(newRoom));
|
||
|
|
||
|
const state = getState();
|
||
|
const room = state['features/base/conference'].room;
|
||
|
|
||
|
if (room !== oldRoom) {
|
||
|
_navigate(state);
|
||
|
}
|
||
|
};
|
||
|
}
|