Move redundant code from app.js
This commit is contained in:
parent
c570b80d7b
commit
3190bfa058
152
app.js
152
app.js
|
@ -1,6 +1,4 @@
|
||||||
/* global $, config, loggingConfig, JitsiMeetJS */
|
|
||||||
/* application specific logic */
|
/* application specific logic */
|
||||||
const logger = require("jitsi-meet-logger").getLogger(__filename);
|
|
||||||
|
|
||||||
import "babel-polyfill";
|
import "babel-polyfill";
|
||||||
import "jquery";
|
import "jquery";
|
||||||
|
@ -18,51 +16,13 @@ import 'aui-experimental-css';
|
||||||
|
|
||||||
window.toastr = require("toastr");
|
window.toastr = require("toastr");
|
||||||
|
|
||||||
const Logger = require("jitsi-meet-logger");
|
|
||||||
const LogCollector = Logger.LogCollector;
|
|
||||||
import JitsiMeetLogStorage from "./modules/util/JitsiMeetLogStorage";
|
|
||||||
|
|
||||||
import URLProcessor from "./modules/config/URLProcessor";
|
|
||||||
|
|
||||||
import UI from "./modules/UI/UI";
|
import UI from "./modules/UI/UI";
|
||||||
import settings from "./modules/settings/Settings";
|
import settings from "./modules/settings/Settings";
|
||||||
import conference from './conference';
|
import conference from './conference';
|
||||||
import ConferenceUrl from './modules/URL/ConferenceUrl';
|
|
||||||
import API from './modules/API/API';
|
import API from './modules/API/API';
|
||||||
|
|
||||||
import getTokenData from "./modules/tokendata/TokenData";
|
|
||||||
import translation from "./modules/translation/translation";
|
import translation from "./modules/translation/translation";
|
||||||
|
|
||||||
/**
|
|
||||||
* Adjusts the logging levels.
|
|
||||||
* @private
|
|
||||||
*/
|
|
||||||
function configureLoggingLevels () {
|
|
||||||
// NOTE The library Logger is separated from the app loggers, so the levels
|
|
||||||
// have to be set in two places
|
|
||||||
|
|
||||||
// Set default logging level
|
|
||||||
const defaultLogLevel
|
|
||||||
= loggingConfig.defaultLogLevel || JitsiMeetJS.logLevels.TRACE;
|
|
||||||
Logger.setLogLevel(defaultLogLevel);
|
|
||||||
JitsiMeetJS.setLogLevel(defaultLogLevel);
|
|
||||||
|
|
||||||
// NOTE console was used on purpose here to go around the logging
|
|
||||||
// and always print the default logging level to the console
|
|
||||||
console.info("Default logging level set to: " + defaultLogLevel);
|
|
||||||
|
|
||||||
// Set log level for each logger
|
|
||||||
if (loggingConfig) {
|
|
||||||
Object.keys(loggingConfig).forEach(function(loggerName) {
|
|
||||||
if ('defaultLogLevel' !== loggerName) {
|
|
||||||
const level = loggingConfig[loggerName];
|
|
||||||
Logger.setLogLevelById(level, loggerName);
|
|
||||||
JitsiMeetJS.setLogLevelById(level, loggerName);
|
|
||||||
}
|
|
||||||
});
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
const APP = {
|
const APP = {
|
||||||
// Used by do_external_connect.js if we receive the attach data after
|
// Used by do_external_connect.js if we receive the attach data after
|
||||||
// connect was already executed. status property can be "initialized",
|
// connect was already executed. status property can be "initialized",
|
||||||
|
@ -99,111 +59,15 @@ const APP = {
|
||||||
*/
|
*/
|
||||||
ConferenceUrl : null,
|
ConferenceUrl : null,
|
||||||
connection: null,
|
connection: null,
|
||||||
API,
|
API
|
||||||
init () {
|
|
||||||
this.initLogging();
|
|
||||||
this.keyboardshortcut =
|
|
||||||
require("./modules/keyboardshortcut/keyboardshortcut");
|
|
||||||
this.configFetch = require("./modules/config/HttpConfigFetch");
|
|
||||||
this.tokenData = getTokenData();
|
|
||||||
},
|
|
||||||
initLogging () {
|
|
||||||
// Adjust logging level
|
|
||||||
configureLoggingLevels();
|
|
||||||
// Create the LogCollector and register it as the global log transport.
|
|
||||||
// It is done early to capture as much logs as possible. Captured logs
|
|
||||||
// will be cached, before the JitsiMeetLogStorage gets ready (statistics
|
|
||||||
// module is initialized).
|
|
||||||
if (!this.logCollector && !loggingConfig.disableLogCollector) {
|
|
||||||
this.logCollector = new LogCollector(new JitsiMeetLogStorage());
|
|
||||||
Logger.addGlobalTransport(this.logCollector);
|
|
||||||
JitsiMeetJS.addGlobalLogTransport(this.logCollector);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
};
|
};
|
||||||
|
|
||||||
/**
|
// TODO The execution of the mobile app starts from react/index.native.js.
|
||||||
* If JWT token data it will be used for local user settings
|
// Similarly, the execution of the Web app should start from
|
||||||
*/
|
// react/index.web.js for the sake of consistency and ease of understanding.
|
||||||
function setTokenData() {
|
// Temporarily though because we are at the beginning of introducing React
|
||||||
let localUser = APP.tokenData.caller;
|
// into the Web app, allow the execution of the Web app to start from app.js
|
||||||
if(localUser) {
|
// in order to reduce the complexity of the beginning step.
|
||||||
APP.settings.setEmail((localUser.getEmail() || "").trim(), true);
|
require('./react');
|
||||||
APP.settings.setAvatarUrl((localUser.getAvatarUrl() || "").trim());
|
|
||||||
APP.settings.setDisplayName((localUser.getName() || "").trim(), true);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
function init() {
|
|
||||||
setTokenData();
|
|
||||||
// Initialize the conference URL handler
|
|
||||||
APP.ConferenceUrl = new ConferenceUrl(window.location);
|
|
||||||
|
|
||||||
// TODO The execution of the mobile app starts from react/index.native.js.
|
|
||||||
// Similarly, the execution of the Web app should start from
|
|
||||||
// react/index.web.js for the sake of consistency and ease of understanding.
|
|
||||||
// Temporarily though because we are at the beginning of introducing React
|
|
||||||
// into the Web app, allow the execution of the Web app to start from app.js
|
|
||||||
// in order to reduce the complexity of the beginning step.
|
|
||||||
require('./react');
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* If we have an HTTP endpoint for getting config.json configured we're going to
|
|
||||||
* read it and override properties from config.js and interfaceConfig.js.
|
|
||||||
* If there is no endpoint we'll just continue with initialization.
|
|
||||||
* Keep in mind that if the endpoint has been configured and we fail to obtain
|
|
||||||
* the config for any reason then the conference won't start and error message
|
|
||||||
* will be displayed to the user.
|
|
||||||
*/
|
|
||||||
function obtainConfigAndInit() {
|
|
||||||
let roomName = APP.conference.roomName;
|
|
||||||
|
|
||||||
if (config.configLocation) {
|
|
||||||
APP.configFetch.obtainConfig(
|
|
||||||
config.configLocation, roomName,
|
|
||||||
// Get config result callback
|
|
||||||
function(success, error) {
|
|
||||||
if (success) {
|
|
||||||
var now = APP.connectionTimes["configuration.fetched"] =
|
|
||||||
window.performance.now();
|
|
||||||
logger.log("(TIME) configuration fetched:\t", now);
|
|
||||||
init();
|
|
||||||
} else {
|
|
||||||
// Show obtain config error,
|
|
||||||
// pass the error object for report
|
|
||||||
APP.UI.messageHandler.openReportDialog(
|
|
||||||
null, "dialog.connectError", error);
|
|
||||||
}
|
|
||||||
});
|
|
||||||
} else {
|
|
||||||
require("./modules/config/BoshAddressChoice").chooseAddress(
|
|
||||||
config, roomName);
|
|
||||||
|
|
||||||
init();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
$(document).ready(function () {
|
|
||||||
var now = APP.connectionTimes["document.ready"] = window.performance.now();
|
|
||||||
logger.log("(TIME) document ready:\t", now);
|
|
||||||
|
|
||||||
URLProcessor.setConfigParametersFromUrl();
|
|
||||||
|
|
||||||
APP.init();
|
|
||||||
APP.API.init(APP.tokenData.externalAPISettings);
|
|
||||||
|
|
||||||
obtainConfigAndInit();
|
|
||||||
});
|
|
||||||
|
|
||||||
$(window).bind('beforeunload', function () {
|
|
||||||
// Stop the LogCollector
|
|
||||||
if (APP.logCollectorStarted) {
|
|
||||||
APP.logCollector.stop();
|
|
||||||
APP.logCollectorStarted = false;
|
|
||||||
}
|
|
||||||
APP.API.dispose();
|
|
||||||
});
|
|
||||||
|
|
||||||
module.exports = APP;
|
module.exports = APP;
|
||||||
|
|
|
@ -15,6 +15,15 @@ import { RouteRegistry } from '../../base/navigator';
|
||||||
import { AbstractApp } from './AbstractApp';
|
import { AbstractApp } from './AbstractApp';
|
||||||
import settings from '../../../../modules/settings/Settings';
|
import settings from '../../../../modules/settings/Settings';
|
||||||
|
|
||||||
|
|
||||||
|
import URLProcessor from '../../../../modules/config/URLProcessor';
|
||||||
|
import getTokenData from '../../../../modules/tokendata/TokenData';
|
||||||
|
import JitsiMeetLogStorage from '../../../../modules/util/JitsiMeetLogStorage';
|
||||||
|
import KeyboardShortcut from '../../../../modules/keyboardshortcut/keyboardshortcut';
|
||||||
|
const Logger = require('jitsi-meet-logger');
|
||||||
|
const LogCollector = Logger.LogCollector;
|
||||||
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Root application component.
|
* Root application component.
|
||||||
*
|
*
|
||||||
|
@ -59,6 +68,69 @@ export class App extends AbstractApp {
|
||||||
componentWillMount(...args) {
|
componentWillMount(...args) {
|
||||||
super.componentWillMount(...args);
|
super.componentWillMount(...args);
|
||||||
|
|
||||||
|
URLProcessor.setConfigParametersFromUrl();
|
||||||
|
|
||||||
|
/* APP.init BEGIN */
|
||||||
|
|
||||||
|
/* Init logging BEGIN */
|
||||||
|
|
||||||
|
// Adjust logging level
|
||||||
|
configureLoggingLevels();
|
||||||
|
|
||||||
|
// Create the LogCollector and register it as the global log transport.
|
||||||
|
// It is done early to capture as much logs as possible. Captured logs
|
||||||
|
// will be cached, before the JitsiMeetLogStorage gets ready (statistics
|
||||||
|
// module is initialized).
|
||||||
|
if (!APP.logCollector && !loggingConfig.disableLogCollector) {
|
||||||
|
APP.logCollector = new LogCollector(new JitsiMeetLogStorage());
|
||||||
|
Logger.addGlobalTransport(APP.logCollector);
|
||||||
|
JitsiMeetJS.addGlobalLogTransport(APP.logCollector);
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Init logging BEGIN */
|
||||||
|
|
||||||
|
APP.keyboardshortcut = KeyboardShortcut;
|
||||||
|
APP.tokenData = getTokenData();
|
||||||
|
|
||||||
|
/* APP.init END */
|
||||||
|
|
||||||
|
APP.API.init(APP.tokenData.externalAPISettings);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Adjusts the logging levels.
|
||||||
|
*
|
||||||
|
* @private
|
||||||
|
* @returns {void}
|
||||||
|
*/
|
||||||
|
function configureLoggingLevels() {
|
||||||
|
// NOTE The library Logger is separated from the app loggers, so the levels
|
||||||
|
// have to be set in two places
|
||||||
|
|
||||||
|
// Set default logging level
|
||||||
|
const defaultLogLevel
|
||||||
|
= loggingConfig.defaultLogLevel || JitsiMeetJS.logLevels.TRACE;
|
||||||
|
|
||||||
|
Logger.setLogLevel(defaultLogLevel);
|
||||||
|
JitsiMeetJS.setLogLevel(defaultLogLevel);
|
||||||
|
|
||||||
|
// NOTE console was used on purpose here to go around the logging
|
||||||
|
// and always print the default logging level to the console
|
||||||
|
console.info(`Default logging level set to: ${defaultLogLevel}`);
|
||||||
|
|
||||||
|
// Set log level for each logger
|
||||||
|
if (loggingConfig) {
|
||||||
|
Object.keys(loggingConfig).forEach(loggerName => {
|
||||||
|
if (loggerName !== 'defaultLogLevel') {
|
||||||
|
const level = loggingConfig[loggerName];
|
||||||
|
|
||||||
|
Logger.setLogLevelById(level, loggerName);
|
||||||
|
JitsiMeetJS.setLogLevelById(level, loggerName);
|
||||||
|
}
|
||||||
|
});
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
APP.translation.init(settings.getLanguage());
|
APP.translation.init(settings.getLanguage());
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -70,7 +142,6 @@ export class App extends AbstractApp {
|
||||||
*/
|
*/
|
||||||
render() {
|
render() {
|
||||||
|
|
||||||
|
|
||||||
return (
|
return (
|
||||||
<Provider store = { this.props.store }>
|
<Provider store = { this.props.store }>
|
||||||
<Router
|
<Router
|
||||||
|
|
|
@ -6,7 +6,9 @@ import {
|
||||||
connect,
|
connect,
|
||||||
disconnect
|
disconnect
|
||||||
} from '../../base/connection';
|
} from '../../base/connection';
|
||||||
|
import ConferenceUrl from '../../../../modules/URL/ConferenceUrl';
|
||||||
|
import HttpConfigFetch from '../../../../modules/config/HttpConfigFetch';
|
||||||
|
import BoshAddressChoice from '../../../../modules/config/BoshAddressChoice';
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* For legacy reasons, inline style for display none.
|
* For legacy reasons, inline style for display none.
|
||||||
|
@ -20,7 +22,6 @@ const DISPLAY_NONE_STYLE = {
|
||||||
* Implements a React Component which renders initial conference layout
|
* Implements a React Component which renders initial conference layout
|
||||||
*/
|
*/
|
||||||
class Conference extends Component {
|
class Conference extends Component {
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Until we don't rewrite UI using react components
|
* Until we don't rewrite UI using react components
|
||||||
* we use UI.start from old app. Also method translates
|
* we use UI.start from old app. Also method translates
|
||||||
|
@ -29,6 +30,80 @@ class Conference extends Component {
|
||||||
* @inheritdoc
|
* @inheritdoc
|
||||||
*/
|
*/
|
||||||
componentDidMount() {
|
componentDidMount() {
|
||||||
|
/**
|
||||||
|
* If JWT token data it will be used for local user settings.
|
||||||
|
*
|
||||||
|
* @returns {void}
|
||||||
|
*/
|
||||||
|
function setTokenData() {
|
||||||
|
const localUser = APP.tokenData.caller;
|
||||||
|
|
||||||
|
if (localUser) {
|
||||||
|
APP.settings.setEmail((localUser.getEmail() || '').trim(), true);
|
||||||
|
APP.settings.setAvatarUrl((localUser.getAvatarUrl() || '').trim());
|
||||||
|
APP.settings.setDisplayName((localUser.getName() || '').trim(), true);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
/**
|
||||||
|
* Initialization of the app.
|
||||||
|
*
|
||||||
|
* @returns {void}
|
||||||
|
*/
|
||||||
|
function init() {
|
||||||
|
setTokenData();
|
||||||
|
|
||||||
|
// Initialize the conference URL handler
|
||||||
|
APP.ConferenceUrl = new ConferenceUrl(window.location);
|
||||||
|
}
|
||||||
|
/**
|
||||||
|
* If we have an HTTP endpoint for getting config.json configured we're going to
|
||||||
|
* read it and override properties from config.js and interfaceConfig.js.
|
||||||
|
* If there is no endpoint we'll just continue with initialization.
|
||||||
|
* Keep in mind that if the endpoint has been configured and we fail to obtain
|
||||||
|
* the config for any reason then the conference won't start and error message
|
||||||
|
* will be displayed to the user.
|
||||||
|
*
|
||||||
|
* @returns {void}
|
||||||
|
*/
|
||||||
|
function obtainConfigAndInit() {
|
||||||
|
const roomName = APP.conference.roomName;
|
||||||
|
|
||||||
|
if (config.configLocation) {
|
||||||
|
const configFetch = HttpConfigFetch;
|
||||||
|
const location = config.configLocation;
|
||||||
|
|
||||||
|
configFetch.obtainConfig(location, roomName, obtainConfigHandler);
|
||||||
|
} else {
|
||||||
|
BoshAddressChoice.chooseAddress(config, roomName);
|
||||||
|
init();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Obtain config handler.
|
||||||
|
*
|
||||||
|
* @param {boolean} success - Equals to true if
|
||||||
|
* config has been obtained w/o errors.
|
||||||
|
* @param {Object} error - Error object if there is error occured
|
||||||
|
* while fetching config.
|
||||||
|
* @returns {void}
|
||||||
|
*/
|
||||||
|
function obtainConfigHandler(success, error) {
|
||||||
|
if (success) {
|
||||||
|
const now = window.performance.now();
|
||||||
|
|
||||||
|
APP.connectionTimes['configuration.fetched'] = now;
|
||||||
|
logger.log('(TIME) configuration fetched:\t', now);
|
||||||
|
init();
|
||||||
|
} else {
|
||||||
|
// Show obtain config error,
|
||||||
|
// pass the error object for report
|
||||||
|
APP.UI.messageHandler.openReportDialog(
|
||||||
|
null, 'dialog.connectError', error);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
obtainConfigAndInit();
|
||||||
APP.UI.start();
|
APP.UI.start();
|
||||||
|
|
||||||
// XXX Temporary solution until we add React translation.
|
// XXX Temporary solution until we add React translation.
|
||||||
|
|
|
@ -1,3 +1,4 @@
|
||||||
|
/* global APP */
|
||||||
import React from 'react';
|
import React from 'react';
|
||||||
import ReactDOM from 'react-dom';
|
import ReactDOM from 'react-dom';
|
||||||
import { browserHistory } from 'react-router';
|
import { browserHistory } from 'react-router';
|
||||||
|
@ -15,6 +16,8 @@ import {
|
||||||
ReducerRegistry
|
ReducerRegistry
|
||||||
} from './features/base/redux';
|
} from './features/base/redux';
|
||||||
|
|
||||||
|
const logger = require('jitsi-meet-logger').getLogger(__filename);
|
||||||
|
|
||||||
// Create combined reducer from all reducers in registry + routerReducer from
|
// Create combined reducer from all reducers in registry + routerReducer from
|
||||||
// 'react-router-redux' module (stores location updates from history).
|
// 'react-router-redux' module (stores location updates from history).
|
||||||
// @see https://github.com/reactjs/react-router-redux#routerreducer.
|
// @see https://github.com/reactjs/react-router-redux#routerreducer.
|
||||||
|
@ -45,10 +48,33 @@ if (typeof window === 'object'
|
||||||
// Create Redux store with our reducer and middleware.
|
// Create Redux store with our reducer and middleware.
|
||||||
const store = createStore(reducer, middleware);
|
const store = createStore(reducer, middleware);
|
||||||
|
|
||||||
// Render the main Component.
|
/**
|
||||||
ReactDOM.render(
|
* Render the app when DOM tree has been loaded.
|
||||||
<App
|
*/
|
||||||
config = { config }
|
document.addEventListener('DOMContentLoaded', () => {
|
||||||
store = { store }
|
const now = window.performance.now();
|
||||||
url = { window.location.toString() } />,
|
|
||||||
document.getElementById('react'));
|
APP.connectionTimes['document.ready'] = now;
|
||||||
|
logger.log('(TIME) document ready:\t', now);
|
||||||
|
|
||||||
|
// Render the main Component.
|
||||||
|
ReactDOM.render(
|
||||||
|
<App
|
||||||
|
config = { config }
|
||||||
|
store = { store }
|
||||||
|
url = { window.location.toString() } />,
|
||||||
|
document.getElementById('react'));
|
||||||
|
});
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Stop collecting the logs and disposing the API when
|
||||||
|
* user closes the page.
|
||||||
|
*/
|
||||||
|
window.addEventListener('beforeunload', () => {
|
||||||
|
// Stop the LogCollector
|
||||||
|
if (APP.logCollectorStarted) {
|
||||||
|
APP.logCollector.stop();
|
||||||
|
APP.logCollectorStarted = false;
|
||||||
|
}
|
||||||
|
APP.API.dispose();
|
||||||
|
});
|
||||||
|
|
Loading…
Reference in New Issue