import React from 'react'; import { View, Linking, ScrollView, AsyncStorage, SafeAreaView, Switch, Text, Share, Clipboard } from 'react-native'; import PropTypes from 'prop-types'; import { connect } from 'react-redux'; import { logout as logoutAction } from '../../actions/login'; import { toggleMarkdown as toggleMarkdownAction } from '../../actions/markdown'; import { toggleCrashReport as toggleCrashReportAction } from '../../actions/crashReport'; import { SWITCH_TRACK_COLOR, themes } from '../../constants/colors'; import { DrawerButton, CloseModalButton } from '../../containers/HeaderButton'; import StatusBar from '../../containers/StatusBar'; import ListItem from '../../containers/ListItem'; import { DisclosureImage } from '../../containers/DisclosureIndicator'; import Separator from '../../containers/Separator'; import I18n from '../../i18n'; import { MARKDOWN_KEY, CRASH_REPORT_KEY } from '../../lib/rocketchat'; import { getReadableVersion, getDeviceModel, isAndroid } from '../../utils/deviceInfo'; import openLink from '../../utils/openLink'; import scrollPersistTaps from '../../utils/scrollPersistTaps'; import { showErrorAlert } from '../../utils/info'; import styles from './styles'; import sharedStyles from '../Styles'; import { loggerConfig, analytics } from '../../utils/log'; import { PLAY_MARKET_LINK, APP_STORE_LINK, LICENSE_LINK } from '../../constants/links'; import { withTheme } from '../../theme'; import { themedHeader } from '../../utils/navigation'; import SidebarView from '../SidebarView'; import { withSplit } from '../../split'; import Navigation from '../../lib/Navigation'; import { LISTENER } from '../../containers/Toast'; import EventEmitter from '../../utils/events'; const SectionSeparator = React.memo(({ theme }) => ( )); SectionSeparator.propTypes = { theme: PropTypes.string }; const ItemInfo = React.memo(({ info, theme }) => ( {info} )); ItemInfo.propTypes = { info: PropTypes.string, theme: PropTypes.string }; class SettingsView extends React.Component { static navigationOptions = ({ navigation, screenProps }) => ({ ...themedHeader(screenProps.theme), headerLeft: screenProps.split ? ( ) : ( ), title: I18n.t('Settings') }); static propTypes = { navigation: PropTypes.object, server: PropTypes.object, useMarkdown: PropTypes.bool, allowCrashReport: PropTypes.bool, toggleMarkdown: PropTypes.func, toggleCrashReport: PropTypes.func, theme: PropTypes.string, split: PropTypes.bool, logout: PropTypes.func.isRequired } logout = () => { const { logout, split } = this.props; if (split) { Navigation.navigate('RoomView'); } logout(); } toggleMarkdown = (value) => { AsyncStorage.setItem(MARKDOWN_KEY, JSON.stringify(value)); const { toggleMarkdown } = this.props; toggleMarkdown(value); } toggleCrashReport = (value) => { AsyncStorage.setItem(CRASH_REPORT_KEY, JSON.stringify(value)); const { toggleCrashReport } = this.props; toggleCrashReport(value); loggerConfig.autoNotify = value; analytics().setAnalyticsCollectionEnabled(value); if (value) { loggerConfig.clearBeforeSendCallbacks(); } else { loggerConfig.registerBeforeSendCallback(() => false); } } navigateToRoom = (room) => { const { navigation } = this.props; navigation.navigate(room); } sendEmail = async() => { const subject = encodeURI('React Native App Support'); const email = encodeURI('support@rocket.chat'); const description = encodeURI(` version: ${ getReadableVersion } device: ${ getDeviceModel } `); try { await Linking.openURL(`mailto:${ email }?subject=${ subject }&body=${ description }`); } catch (e) { showErrorAlert(I18n.t('error-email-send-failed', { message: 'support@rocket.chat' })); } } shareApp = () => { Share.share({ message: isAndroid ? PLAY_MARKET_LINK : APP_STORE_LINK }); } copyServerVersion = () => { const { server } = this.props; this.saveToClipboard(server.version); } copyAppVersion = () => { this.saveToClipboard(getReadableVersion); } saveToClipboard = async(content) => { await Clipboard.setString(content); EventEmitter.emit(LISTENER, { message: I18n.t('Copied_to_clipboard') }); } changeTheme = () => { const { navigation } = this.props; navigation.navigate('ThemeView'); } onPressLicense = () => { const { theme } = this.props; openLink(LICENSE_LINK, theme); } renderDisclosure = () => { const { theme } = this.props; return ; } renderLogout = () => { const { theme } = this.props; return ( <> ); } renderMarkdownSwitch = () => { const { useMarkdown } = this.props; return ( ); } renderCrashReportSwitch = () => { const { allowCrashReport } = this.props; return ( ); } render() { const { server, split, theme } = this.props; return ( {split ? ( <> this.navigateToRoom('ProfileView')} showActionIndicator testID='settings-profile' right={this.renderDisclosure} theme={theme} /> ) : null} this.navigateToRoom('LanguageView')} showActionIndicator testID='settings-view-language' right={this.renderDisclosure} theme={theme} /> this.renderMarkdownSwitch()} theme={theme} /> this.renderCrashReportSwitch()} theme={theme} /> { split ? this.renderLogout() : null } ); } } const mapStateToProps = state => ({ server: state.server, useMarkdown: state.markdown.useMarkdown, allowCrashReport: state.crashReport.allowCrashReport }); const mapDispatchToProps = dispatch => ({ logout: () => dispatch(logoutAction()), toggleMarkdown: params => dispatch(toggleMarkdownAction(params)), toggleCrashReport: params => dispatch(toggleCrashReportAction(params)) }); export default connect(mapStateToProps, mapDispatchToProps)(withTheme(withSplit(SettingsView)));