Skip to content
Snippets Groups Projects
index.js 4.18 KiB
Newer Older
Diego Mello's avatar
Diego Mello committed
import React from 'react';
Diego Mello's avatar
Diego Mello committed
import PropTypes from 'prop-types';
import { View, ScrollView, SafeAreaView, Platform } from 'react-native';
Diego Mello's avatar
Diego Mello committed
import RNPickerSelect from 'react-native-picker-select';
import { connect } from 'react-redux';
Diego Mello's avatar
Diego Mello committed

import LoggedView from '../View';
Diego Mello's avatar
Diego Mello committed
import RocketChat from '../../lib/rocketchat';
import KeyboardView from '../../presentation/KeyboardView';
import sharedStyles from '../Styles';
import RCTextInput from '../../containers/TextInput';
import scrollPersistTaps from '../../utils/scrollPersistTaps';
import I18n from '../../i18n';
import Button from '../../containers/Button';
import Loading from '../../containers/Loading';
import { showErrorAlert, showToast } from '../../utils/info';
import log from '../../utils/log';
import { setUser } from '../../actions/login';
import { iconsMap } from '../../Icons';
Diego Mello's avatar
Diego Mello committed

Diego Mello's avatar
Diego Mello committed
@connect(state => ({
	userLanguage: state.login.user && state.login.user.language
Diego Mello's avatar
Diego Mello committed
}), dispatch => ({
	setUser: params => dispatch(setUser(params))
}))
/** @extends React.Component */
Diego Mello's avatar
Diego Mello committed
export default class SettingsView extends LoggedView {
Diego Mello's avatar
Diego Mello committed
	static propTypes = {
		navigator: PropTypes.object,
		userLanguage: PropTypes.string,
Diego Mello's avatar
Diego Mello committed
		setUser: PropTypes.func
Diego Mello's avatar
Diego Mello committed
	constructor(props) {
		super('SettingsView', props);
Diego Mello's avatar
Diego Mello committed
		this.state = {
			placeholder: {},
			language: props.userLanguage ? props.userLanguage : 'en',
Diego Mello's avatar
Diego Mello committed
			languages: [{
				label: 'English',
				value: 'en'
			}, {
				label: 'Russian',
				value: 'ru'
Diego Mello's avatar
Diego Mello committed
			}],
			saving: false
		};
		props.navigator.setOnNavigatorEvent(this.onNavigatorEvent.bind(this));
	}

	componentWillMount() {
		this.props.navigator.setButtons({
			leftButtons: [{
				id: 'sideMenu',
				icon: Platform.OS === 'ios' ? iconsMap.menu : undefined
			}]
		});
	}

	componentDidMount() {
		this.props.navigator.setDrawerEnabled({
			side: 'left',
			enabled: true
		});
	}

	onNavigatorEvent(event) {
		if (event.type === 'NavBarButtonPress') {
			if (event.id === 'sideMenu' && Platform.OS === 'ios') {
				this.props.navigator.toggleDrawer({
					side: 'left',
					animated: true,
					to: 'missing'
				});
			}
		}
Diego Mello's avatar
Diego Mello committed
	}

	formIsChanged = () => {
		const { language } = this.state;
		return !(this.props.userLanguage === language);
Diego Mello's avatar
Diego Mello committed
	}

	submit = async() => {
		this.setState({ saving: true });

		const {
			language
		} = this.state;
		const { userLanguage } = this.props;
Diego Mello's avatar
Diego Mello committed

		if (!this.formIsChanged()) {
			return;
		}

		const params = {};

		// language
		if (userLanguage !== language) {
Diego Mello's avatar
Diego Mello committed
			params.language = language;
		}

		try {
			await RocketChat.saveUserPreferences(params);
			this.props.setUser({ language: params.language });

			this.setState({ saving: false });
			setTimeout(() => {
				showToast(I18n.t('Preferences_saved'));
			}, 300);
		} catch (e) {
			this.setState({ saving: false });
			setTimeout(() => {
				if (e && e.error) {
					return showErrorAlert(I18n.t(e.error, e.details));
				}
				showErrorAlert(I18n.t('There_was_an_error_while_action', { action: I18n.t('saving_preferences') }));
				log('saveUserPreferences', e);
			}, 300);
		}
Diego Mello's avatar
Diego Mello committed
	}

	render() {
Diego Mello's avatar
Diego Mello committed
		const { language, languages, placeholder } = this.state;
Diego Mello's avatar
Diego Mello committed
		return (
Diego Mello's avatar
Diego Mello committed
			<KeyboardView
				contentContainerStyle={sharedStyles.container}
				keyboardVerticalOffset={128}
			>
				<ScrollView
					contentContainerStyle={sharedStyles.containerScrollView}
					testID='settings-view-list'
					{...scrollPersistTaps}
				>
					<SafeAreaView testID='settings-view'>
						<RNPickerSelect
							items={languages}
							onValueChange={(value) => {
								this.setState({ language: value });
							}}
							value={language}
							placeholder={placeholder}
						>
							<RCTextInput
								inputRef={(e) => { this.name = e; }}
								label={I18n.t('Language')}
								placeholder={I18n.t('Language')}
								value={languages.find(i => i.value === language).label}
Diego Mello's avatar
Diego Mello committed
								testID='settings-view-language'
							/>
						</RNPickerSelect>
						<View style={sharedStyles.alignItemsFlexStart}>
							<Button
								title={I18n.t('Save_Changes')}
								type='primary'
								onPress={this.submit}
								disabled={!this.formIsChanged()}
								testID='settings-view-button'
							/>
						</View>
						<Loading visible={this.state.saving} />
					</SafeAreaView>
				</ScrollView>
			</KeyboardView>