// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved. // See LICENSE.txt for license information. import React, {PureComponent} from 'react'; import PropTypes from 'prop-types'; import {intlShape, injectIntl} from 'react-intl'; import { Linking, Platform, ScrollView, View, } from 'react-native'; import DeviceInfo from 'react-native-device-info'; import {Navigation} from 'react-native-navigation'; import SettingsItem from 'app/screens/settings/settings_item'; import StatusBar from 'app/components/status_bar'; import {preventDoubleTap} from 'app/utils/tap'; import {changeOpacity, makeStyleSheetFromTheme} from 'app/utils/theme'; import {isValidUrl} from 'app/utils/url'; import {t} from 'app/utils/i18n'; import {goToScreen, dismissModal} from 'app/actions/navigation'; import LocalConfig from 'assets/config'; class Settings extends PureComponent { static propTypes = { actions: PropTypes.shape({ clearErrors: PropTypes.func.isRequired, purgeOfflineStore: PropTypes.func.isRequired, }).isRequired, config: PropTypes.object.isRequired, currentTeamId: PropTypes.string.isRequired, currentUserId: PropTypes.string.isRequired, currentUrl: PropTypes.string.isRequired, errors: PropTypes.array.isRequired, intl: intlShape.isRequired, joinableTeams: PropTypes.array.isRequired, theme: PropTypes.object, isLandscape: PropTypes.bool.isRequired, }; static defaultProps = { errors: [], joinableTeams: [], }; componentDidMount() { this.navigationEventListener = Navigation.events().bindComponent(this); } navigationButtonPressed({buttonId}) { if (buttonId === 'close-settings') { dismissModal(); } } errorEmailBody = () => { const {config, currentUserId, currentTeamId, errors} = this.props; let contents = [ 'Please share a description of the problem:\n\n', `Current User Id: ${currentUserId}`, `Current Team Id: ${currentTeamId}`, `Server Version: ${config.Version} (Build ${config.BuildNumber})`, `App Version: ${DeviceInfo.getVersion()} (Build ${DeviceInfo.getBuildNumber()})`, `App Platform: ${Platform.OS}`, ]; if (errors.length) { const errorArray = errors.map((e) => { const {error} = e; const stack = error.stack || ''; return `Date: ${e.date}\nMessage: ${error.message}\nStack trace:\n${stack}\n\n`; }).join(''); contents = contents.concat([ '', 'Errors:', errorArray, ]); } return contents.join('\n'); }; goToAbout = preventDoubleTap(() => { const {intl, config} = this.props; const screen = 'About'; const title = intl.formatMessage({id: 'about.title', defaultMessage: 'About {appTitle}'}, {appTitle: config.SiteName || 'Mattermost'}); goToScreen(screen, title); }); goToNotifications = preventDoubleTap(() => { const {intl} = this.props; const screen = 'NotificationSettings'; const title = intl.formatMessage({id: 'user.settings.modal.notifications', defaultMessage: 'Notifications'}); goToScreen(screen, title); }); goToDisplaySettings = preventDoubleTap(() => { const {intl} = this.props; const screen = 'DisplaySettings'; const title = intl.formatMessage({id: 'user.settings.modal.display', defaultMessage: 'Display'}); goToScreen(screen, title); }); goToAdvancedSettings = preventDoubleTap(() => { const {intl} = this.props; const screen = 'AdvancedSettings'; const title = intl.formatMessage({id: 'mobile.advanced_settings.title', defaultMessage: 'Advanced Settings'}); goToScreen(screen, title); }); goToSelectTeam = preventDoubleTap(() => { const {currentUrl, intl} = this.props; const screen = 'SelectTeam'; const title = intl.formatMessage({id: 'mobile.routes.selectTeam', defaultMessage: 'Select Team'}); const passProps = { currentUrl, }; goToScreen(screen, title, passProps); }); goToClientUpgrade = preventDoubleTap(() => { const {intl} = this.props; const screen = 'ClientUpgrade'; const title = intl.formatMessage({id: 'mobile.client_upgrade', defaultMessage: 'Upgrade App'}); const passProps = { userCheckedForUpgrade: true, }; goToScreen(screen, title, passProps); }); openErrorEmail = preventDoubleTap(() => { const {config} = this.props; const recipient = config.SupportEmail; const subject = `Problem with ${config.SiteName} React Native app`; const mailTo = `mailto:${recipient}?subject=${subject}&body=${this.errorEmailBody()}`; Linking.canOpenURL(mailTo).then((supported) => { if (supported) { Linking.openURL(mailTo); this.props.actions.clearErrors(); } }); }); openHelp = preventDoubleTap(() => { const {config} = this.props; const link = config.HelpLink ? config.HelpLink.toLowerCase() : ''; Linking.canOpenURL(link).then((supported) => { if (supported) { Linking.openURL(link); } }); }); render() { const {config, joinableTeams, theme, isLandscape} = this.props; const style = getStyleSheet(theme); const showTeams = joinableTeams.length > 0; const showHelp = isValidUrl(config.HelpLink); const showArrow = Platform.OS === 'ios'; return ( {showTeams && } {showHelp && } {LocalConfig.EnableMobileClientUpgrade && LocalConfig.EnableMobileClientUpgradeUserSetting && } ); } } const getStyleSheet = makeStyleSheetFromTheme((theme) => { return { container: { flex: 1, backgroundColor: theme.centerChannelBg, }, wrapper: { backgroundColor: changeOpacity(theme.centerChannelColor, 0.06), ...Platform.select({ ios: { paddingTop: 35, }, }), }, divider: { backgroundColor: changeOpacity(theme.centerChannelColor, 0.1), height: 1, }, }; }); export default injectIntl(Settings);