Up until now we relied on implicit loading of middlewares and reducers, through having imports in each feature's index.js. This leads to many complex import cycles which result in (sometimes) hard to fix bugs in addition to (often) breaking mobile because a web-only feature gets imported on mobile too, thanks to the implicit loading. This PR changes that to make the process explicit. Both middlewares and reducers are imported in a single place, the app entrypoint. They have been divided into 3 categories: any, web and native, which represent each of the platforms respectively. Ideally no feature should have an index.js exporting actions, action types and components, but that's a larger ordeal, so this is just the first step in getting there. In order to both set example and avoid large cycles the app feature has been refactored to not have an idex.js itself.
77 lines
2.0 KiB
JavaScript
77 lines
2.0 KiB
JavaScript
// @flow
|
|
|
|
// Apply all necessary polyfills as early as possible to make sure anything imported henceforth
|
|
// sees them.
|
|
import './features/mobile/polyfills';
|
|
|
|
import React, { PureComponent } from 'react';
|
|
import { AppRegistry } from 'react-native';
|
|
|
|
import { App } from './features/app/components';
|
|
import { _initLogging } from './features/base/logging/functions';
|
|
import { IncomingCallApp } from './features/mobile/incoming-call';
|
|
|
|
declare var __DEV__;
|
|
|
|
/**
|
|
* The type of the React {@code Component} props of {@link Root}.
|
|
*/
|
|
type Props = {
|
|
|
|
/**
|
|
* The URL, if any, with which the app was launched.
|
|
*/
|
|
url: Object | string
|
|
};
|
|
|
|
/**
|
|
* React Native doesn't support specifying props to the main/root component (in
|
|
* the JS/JSX source code). So create a wrapper React Component (class) around
|
|
* features/app's App instead.
|
|
*
|
|
* @extends Component
|
|
*/
|
|
class Root extends PureComponent<Props> {
|
|
/**
|
|
* Implements React's {@link Component#render()}.
|
|
*
|
|
* @inheritdoc
|
|
* @returns {ReactElement}
|
|
*/
|
|
render() {
|
|
return (
|
|
<App
|
|
{ ...this.props } />
|
|
);
|
|
}
|
|
}
|
|
|
|
// Initialize logging.
|
|
_initLogging();
|
|
|
|
// HORRIBLE HACK ALERT! React Native logs the initial props with `console.log`. Here we are quickly patching it
|
|
// to avoid logging potentially sensitive information.
|
|
if (!__DEV__) {
|
|
/* eslint-disable */
|
|
|
|
const __orig_console_log = console.log;
|
|
const __orig_appregistry_runapplication = AppRegistry.runApplication;
|
|
|
|
AppRegistry.runApplication = (...args) => {
|
|
// $FlowExpectedError
|
|
console.log = () => {};
|
|
__orig_appregistry_runapplication(...args);
|
|
// $FlowExpectedError
|
|
console.log = __orig_console_log;
|
|
};
|
|
|
|
/* eslint-enable */
|
|
}
|
|
|
|
|
|
// Register the main/root Component of JitsiMeetView.
|
|
AppRegistry.registerComponent('App', () => Root);
|
|
|
|
// Register the main/root Component of IncomingCallView.
|
|
AppRegistry.registerComponent('IncomingCallApp', () => IncomingCallApp);
|