Skip to content
Snippets Groups Projects
index.js 4.73 KiB
Newer Older
Diego Mello's avatar
Diego Mello committed
import React from 'react';
	View, Linking, ScrollView, AsyncStorage, SafeAreaView, Switch, Share
} from 'react-native';
import PropTypes from 'prop-types';
Diego Mello's avatar
Diego Mello committed
import { connect } from 'react-redux';
Diego Mello's avatar
Diego Mello committed

import { toggleMarkdown as toggleMarkdownAction } from '../../actions/markdown';
import { SWITCH_TRACK_COLOR } from '../../constants/colors';
import { DrawerButton } 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 } 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 { PLAY_MARKET_LINK, APP_STORE_LINK, LICENSE_LINK } from '../../constants/links';
const SectionSeparator = React.memo(() => <View style={styles.sectionSeparatorBorder} />);
Diego Mello's avatar
Diego Mello committed

class SettingsView extends React.Component {
	static navigationOptions = ({ navigation }) => ({
		headerLeft: <DrawerButton navigation={navigation} />,
		title: I18n.t('Settings')
Diego Mello's avatar
Diego Mello committed
	static propTypes = {
		navigation: PropTypes.object,
		server:	PropTypes.object,
		useMarkdown: PropTypes.bool,
		toggleMarkdown: PropTypes.func
	toggleMarkdown = (value) => {
		AsyncStorage.setItem(MARKDOWN_KEY, JSON.stringify(value));
		const { toggleMarkdown } = this.props;
		toggleMarkdown(value);
	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 }
		`);
Diego Mello's avatar
Diego Mello committed
		try {
			await Linking.openURL(`mailto:${ email }?subject=${ subject }&body=${ description }`);
Diego Mello's avatar
Diego Mello committed
		} catch (e) {
			showErrorAlert(I18n.t('error-email-send-failed', { message: 'support@rocket.chat' }));
	shareApp = () => {
		Share.share({ message: isAndroid ? PLAY_MARKET_LINK : APP_STORE_LINK });
	}

	onPressLicense = () => openLink(LICENSE_LINK)

	renderDisclosure = () => <DisclosureImage />

	renderMarkdownSwitch = () => {
		const { useMarkdown } = this.props;
		return (
			<Switch
				value={useMarkdown}
				trackColor={SWITCH_TRACK_COLOR}
				onValueChange={this.toggleMarkdown}
			/>
		);
Diego Mello's avatar
Diego Mello committed
	render() {
		const { server } = this.props;
Diego Mello's avatar
Diego Mello committed
		return (
			<SafeAreaView style={sharedStyles.listSafeArea} testID='settings-view'>
				<StatusBar />
Diego Mello's avatar
Diego Mello committed
				<ScrollView
					{...scrollPersistTaps}
					contentContainerStyle={sharedStyles.listContentContainer}
					showsVerticalScrollIndicator={false}
					testID='settings-view-list'
					<ListItem
						title={I18n.t('Contact_us')}
						onPress={this.sendEmail}
						showActionIndicator
						testID='settings-view-contact'
						right={this.renderDisclosure}
					/>
					<Separator />
					<ListItem
						title={I18n.t('Language')}
						onPress={() => this.navigateToRoom('LanguageView')}
						showActionIndicator
						testID='settings-view-language'
						right={this.renderDisclosure}
					/>
					<Separator />
					<ListItem
						title={I18n.t('Share_this_app')}
						onPress={this.shareApp}
						showActionIndicator
						testID='settings-view-share-app'
					/>
					<Separator />
					<ListItem
						title={I18n.t('Theme')}
						showActionIndicator
						disabled
						testID='settings-view-theme'
					<Separator />

					<SectionSeparator />

					<ListItem
						title={I18n.t('License')}
						onPress={this.onPressLicense}
						showActionIndicator
						testID='settings-view-license'
						right={this.renderDisclosure}
					/>
					<Separator />
					<ListItem title={I18n.t('Version_no', { version: getReadableVersion })} testID='settings-view-version' />
					<Separator />
					<ListItem
						title={I18n.t('Server_version', { version: server.version })}
						subtitle={`${ server.server.split('//')[1] }`}
						testID='settings-view-server-version'
					/>

					<SectionSeparator />

					<ListItem
						title={I18n.t('Enable_markdown')}
						testID='settings-view-markdown'
						right={() => this.renderMarkdownSwitch()}
					/>
Diego Mello's avatar
Diego Mello committed
				</ScrollView>
			</SafeAreaView>

const mapStateToProps = state => ({
	server: state.server,
	useMarkdown: state.markdown.useMarkdown
});

const mapDispatchToProps = dispatch => ({
	toggleMarkdown: params => dispatch(toggleMarkdownAction(params))
});

export default connect(mapStateToProps, mapDispatchToProps)(SettingsView);