jiti-meet/react/index.native.js

133 lines
3.8 KiB
JavaScript
Raw Normal View History

// FIXME: remove once react-native-webrtc and react-native-prompt imports
// PropTypes from the 'prop-types' lib instead of 'react'.
import './features/base/react/prop-types-polyfill.js';
import PropTypes from 'prop-types';
import React, { Component } from 'react';
import { AppRegistry, Linking } from 'react-native';
import { App } from './features/app';
2017-07-31 13:30:31 +00:00
import { equals } from './features/base/redux';
/**
* 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 Component {
/**
2017-06-09 19:09:23 +00:00
* {@code Root} component's property types.
*
* @static
*/
static propTypes = {
/**
2017-06-09 19:09:23 +00:00
* The URL, if any, with which the app was launched.
*/
url: PropTypes.oneOfType([
PropTypes.object,
PropTypes.string
2017-07-31 13:30:31 +00:00
]),
/**
2017-06-09 19:09:23 +00:00
* Whether the Welcome page is enabled. If {@code true}, the Welcome
* page is rendered when the {@link App} is not at a location (URL)
* identifying a Jitsi Meet conference/room.
*/
welcomePageEnabled: PropTypes.bool
};
/**
2017-06-09 19:09:23 +00:00
* Initializes a new {@code Root} instance.
*
* @param {Object} props - The read-only properties with which the new
* instance is to be initialized.
*/
constructor(props) {
super(props);
/**
* The initial state of this Component.
*
2017-06-09 19:09:23 +00:00
* @type {{
2017-07-31 13:30:31 +00:00
* url: object|string
2017-06-09 19:09:23 +00:00
* }}
*/
this.state = {
/**
* The URL, if any, with which the app was launched.
*
2017-07-31 13:30:31 +00:00
* @type {object|string}
*/
url: this.props.url
};
// Handle the URL, if any, with which the app was launched. But props
// have precedence.
if (typeof this.props.url === 'undefined') {
Linking.getInitialURL()
.then(url => {
if (typeof this.state.url === 'undefined') {
this.setState({ url });
}
})
.catch(err => {
console.error('Failed to get initial URL', err);
if (typeof this.state.url === 'undefined') {
// Start with an empty URL if getting the initial URL
// fails; otherwise, nothing will be rendered.
this.setState({ url: null });
}
});
}
}
/**
* Implements React's {@link Component#componentWillReceiveProps()}.
*
* New props can be set from the native side by setting the appProperties
* property (on iOS) or calling setAppProperties (on Android).
*
* @inheritdoc
*/
componentWillReceiveProps({ url }) {
2017-09-01 21:25:48 +00:00
equals(this.props.url, url) || this.setState({ url: url || null });
}
/**
* Implements React's {@link Component#render()}.
*
* @inheritdoc
* @returns {ReactElement}
*/
render() {
2017-06-09 19:09:23 +00:00
const { url } = this.state;
// XXX We don't render the App component until we get the initial URL.
// Either it's null or some other non-null defined value.
if (typeof url === 'undefined') {
return null;
}
2017-06-09 19:09:23 +00:00
const {
// The following props are forked in state:
url: _, // eslint-disable-line no-unused-vars
// The remaining props are passed through to App.
...props
} = this.props;
return (
<App
2017-06-09 19:09:23 +00:00
{ ...props }
url = { url } />
);
}
}
2017-06-09 19:09:23 +00:00
// Register the main/root Component.
AppRegistry.registerComponent('App', () => Root);