// @flow import React from 'react'; import { Alert, Modal, SafeAreaView, ScrollView, Switch, Text, TextInput, View } from 'react-native'; import { connect } from 'react-redux'; import { translate } from '../../../base/i18n'; import { Header } from '../../../base/react'; import { AbstractSettingsView, _mapStateToProps } from '../AbstractSettingsView'; import { setSettingsViewVisible } from '../../actions'; import BackButton from './BackButton'; import FormRow from './FormRow'; import FormSectionHeader from './FormSectionHeader'; import { normalizeUserInputURL } from '../../functions'; import styles from './styles'; /** * The native container rendering the app settings page. * * @extends AbstractSettingsView */ class SettingsView extends AbstractSettingsView { _urlField: Object; /** * Initializes a new {@code SettingsView} instance. * * @inheritdoc */ constructor(props) { super(props); // Bind event handlers so they are only bound once per instance. this._onBlurServerURL = this._onBlurServerURL.bind(this); this._onRequestClose = this._onRequestClose.bind(this); this._setURLFieldReference = this._setURLFieldReference.bind(this); this._showURLAlert = this._showURLAlert.bind(this); } /** * Implements React's {@link Component#render()}, renders the settings page. * * @inheritdoc * @returns {ReactElement} */ render() { return ( { this._renderHeader() } { this._renderBody() } ); } _onBlurServerURL: () => void; /** * Handler the server URL lose focus event. Here we validate the server URL * and update it to the normalized version, or show an error if incorrect. * * @private * @returns {void} */ _onBlurServerURL() { this._processServerURL(false /* hideOnSuccess */); } _onChangeDisplayName: (string) => void; _onChangeEmail: (string) => void; _onChangeServerURL: (string) => void; _onRequestClose: () => void; /** * Handles the back button. Also invokes normalizeUserInputURL to validate * the URL entered by the user. * * @returns {void} */ _onRequestClose() { this._processServerURL(true /* hideOnSuccess */); } _onStartAudioMutedChange: (boolean) => void; _onStartVideoMutedChange: (boolean) => void; /** * Processes the server URL. It normalizes it and an error alert is * displayed in case it's incorrect. * * @param {boolean} hideOnSuccess - True if the dialog should be hidden if * normalization / validation succeeds, false otherwise. * @private * @returns {void} */ _processServerURL(hideOnSuccess: boolean) { const { serverURL } = this.props._settings; const normalizedURL = normalizeUserInputURL(serverURL); if (normalizedURL === null) { this._showURLAlert(); } else { this._onChangeServerURL(normalizedURL); if (hideOnSuccess) { this.props.dispatch(setSettingsViewVisible(false)); } } } /** * Renders the body (under the header) of {@code SettingsView}. * * @private * @returns {React$Element} */ _renderBody() { const { _settings } = this.props; return ( ); } /** * Renders the header of {@code SettingsView}. * * @private * @returns {React$Element} */ _renderHeader() { return (
{ this.props.t('settingsView.header') }
); } _setURLFieldReference: (React$ElementRef<*> | null) => void; /** * Stores a reference to the URL field for later use. * * @param {Object} component - The field component. * @protected * @returns {void} */ _setURLFieldReference(component) { this._urlField = component; } _showURLAlert: () => void; /** * Shows an alert telling the user that the URL he/she entered was invalid. * * @returns {void} */ _showURLAlert() { const { t } = this.props; Alert.alert( t('settingsView.alertTitle'), t('settingsView.alertURLText'), [ { onPress: () => this._urlField.focus(), text: t('settingsView.alertOk') } ] ); } } export default translate(connect(_mapStateToProps)(SettingsView));