diff --git a/app/actions/index.js b/app/actions/index.js index 494cb1c934..5ea2988121 100644 --- a/app/actions/index.js +++ b/app/actions/index.js @@ -1,10 +1,11 @@ import * as types from '../constants/types'; import { APP } from './actionsTypes'; -export function appStart(root) { +export function appStart(root, text) { return { type: APP.START, - root + root, + text }; } diff --git a/app/i18n/locales/en.js b/app/i18n/locales/en.js index 7c9a01dc5d..f6a643d1bd 100644 --- a/app/i18n/locales/en.js +++ b/app/i18n/locales/en.js @@ -130,6 +130,7 @@ export default { Click_to_join: 'Click to Join!', Close: 'Close', Close_emoji_selector: 'Close emoji selector', + Change_language_loading: 'Changing language.', Choose: 'Choose', Choose_from_library: 'Choose from library', Choose_file: 'Choose file', @@ -150,6 +151,7 @@ export default { Permalink: 'Permalink', Certificate_password: 'Certificate Password', Clear_cache: 'Clear local server cache', + Clear_cache_loading: 'Clearing cache.', Whats_the_password_for_your_certificate: 'What\'s the password for your certificate?', Create_account: 'Create an account', Create_Channel: 'Create Channel', @@ -235,6 +237,7 @@ export default { Login: 'Login', Login_error: 'Your credentials were rejected! Please try again.', Login_with: 'Login with', + Logging_out: 'Logging out.', Logout: 'Logout', Max_number_of_uses: 'Max number of uses', members: 'members', @@ -301,6 +304,7 @@ export default { pinned: 'pinned', Pinned: 'Pinned', Please_enter_your_password: 'Please enter your password', + Please_wait: 'Please wait.', Preferences: 'Preferences', Preferences_saved: 'Preferences saved!', Privacy_Policy: ' Privacy Policy', diff --git a/app/i18n/locales/pt-BR.js b/app/i18n/locales/pt-BR.js index 4afde1040f..75fae94645 100644 --- a/app/i18n/locales/pt-BR.js +++ b/app/i18n/locales/pt-BR.js @@ -128,7 +128,9 @@ export default { Channel_Name: 'Nome do Canal', Channels: 'Canais', Chats: 'Conversas', + Change_language_loading: 'Alterando idioma.', Call_already_ended: 'A chamada já terminou!', + Clear_cache_loading: 'Limpando cache.', Click_to_join: 'Clique para participar!', Close: 'Fechar', Close_emoji_selector: 'Fechar seletor de emojis', @@ -222,6 +224,7 @@ export default { Login_error: 'Suas credenciais foram rejeitadas. Tente novamente por favor!', Login_with: 'Login with', Logout: 'Sair', + Logging_out: 'Saindo.', Max_number_of_uses: 'Número máximo de usos', Members: 'Membros', Mentioned_Messages: 'Mensagens mencionadas', @@ -276,6 +279,7 @@ export default { Pinned_Messages: 'Mensagens Fixadas', pinned: 'fixada', Pinned: 'Mensagens Fixadas', + Please_wait: 'Por favor, aguarde.', Please_enter_your_password: 'Por favor, digite sua senha', Preferences: 'Preferências', Preferences_saved: 'Preferências salvas!', diff --git a/app/sagas/init.js b/app/sagas/init.js index 1db148ab8d..4f35e3d0a7 100644 --- a/app/sagas/init.js +++ b/app/sagas/init.js @@ -110,7 +110,7 @@ const restore = function* restore() { } }; -const start = function* start({ root }) { +const start = function* start({ root, text }) { if (root === 'inside') { yield Navigation.navigate('InsideStack'); } else if (root === 'setUsername') { @@ -118,7 +118,7 @@ const start = function* start({ root }) { } else if (root === 'outside') { yield Navigation.navigate('OutsideStack'); } else if (root === 'loading') { - yield Navigation.navigate('AuthLoading'); + yield Navigation.navigate('AuthLoading', { text }); } RNBootSplash.hide(); }; diff --git a/app/sagas/login.js b/app/sagas/login.js index 52b413a15b..5fd61f0d66 100644 --- a/app/sagas/login.js +++ b/app/sagas/login.js @@ -147,7 +147,7 @@ const handleLoginSuccess = function* handleLoginSuccess({ user }) { }; const handleLogout = function* handleLogout({ forcedByServer }) { - yield put(appStart('loading')); + yield put(appStart('loading', I18n.t('Logging_out'))); const server = yield select(getServer); if (server) { try { diff --git a/app/views/AuthLoadingView.js b/app/views/AuthLoadingView.js index 6c6fb58dbb..92a467720a 100644 --- a/app/views/AuthLoadingView.js +++ b/app/views/AuthLoadingView.js @@ -1,10 +1,40 @@ import React from 'react'; +import { + View, Text, StyleSheet, ActivityIndicator +} from 'react-native'; +import I18n from '../i18n'; import StatusBar from '../containers/StatusBar'; import { withTheme } from '../theme'; +import { themes } from '../constants/colors'; -export default React.memo(withTheme(({ theme }) => ( - <> - - -))); +import sharedStyles from './Styles'; + +const styles = StyleSheet.create({ + container: { + flex: 1, + justifyContent: 'center', + alignItems: 'center' + }, + text: { + fontSize: 16, + paddingTop: 10, + ...sharedStyles.textRegular, + ...sharedStyles.textAlignCenter + } +}); + +export default React.memo(withTheme(({ theme, navigation }) => { + const text = navigation.getParam('text'); + return ( + + + {text && ( + <> + + {`${ text }.\n${ I18n.t('Please_wait') }`} + + )} + + ); +})); diff --git a/app/views/LanguageView/index.js b/app/views/LanguageView/index.js index 5a73cddf45..716ba335eb 100644 --- a/app/views/LanguageView/index.js +++ b/app/views/LanguageView/index.js @@ -6,7 +6,6 @@ import { SafeAreaView } from 'react-navigation'; import RocketChat from '../../lib/rocketchat'; import I18n from '../../i18n'; -import Loading from '../../containers/Loading'; import { showErrorAlert } from '../../utils/info'; import log from '../../utils/log'; import { setUser as setUserAction } from '../../actions/login'; @@ -75,13 +74,12 @@ class LanguageView extends React.Component { constructor(props) { super(props); this.state = { - language: props.user ? props.user.language : 'en', - saving: false + language: props.user ? props.user.language : 'en' }; } shouldComponentUpdate(nextProps, nextState) { - const { language, saving } = this.state; + const { language } = this.state; const { user, theme } = this.props; if (nextProps.theme !== theme) { return true; @@ -89,9 +87,6 @@ class LanguageView extends React.Component { if (nextState.language !== language) { return true; } - if (nextState.saving !== saving) { - return true; - } if (nextProps.user.language !== user.language) { return true; } @@ -108,9 +103,18 @@ class LanguageView extends React.Component { return; } - this.setState({ saving: true }); + const { appStart } = this.props; - const { user, setUser, appStart } = this.props; + await appStart('loading', I18n.t('Change_language_loading')); + + // shows loading for at least 300ms + await Promise.all([this.changeLanguage(language), new Promise(resolve => setTimeout(resolve, 300))]); + + await appStart('inside'); + } + + changeLanguage = async(language) => { + const { user, setUser } = this.props; const params = {}; @@ -135,15 +139,10 @@ class LanguageView extends React.Component { // do nothing } }); - - await appStart('loading'); - await appStart('inside'); } catch (e) { showErrorAlert(I18n.t('There_was_an_error_while_action', { action: I18n.t('saving_preferences') })); log(e); } - - this.setState({ saving: false }); } renderSeparator = () => { @@ -174,7 +173,6 @@ class LanguageView extends React.Component { } render() { - const { saving } = this.state; const { theme } = this.props; return ( - ); } @@ -208,7 +205,7 @@ const mapStateToProps = state => ({ const mapDispatchToProps = dispatch => ({ setUser: params => dispatch(setUserAction(params)), - appStart: params => dispatch(appStartAction(params)) + appStart: (...params) => dispatch(appStartAction(...params)) }); export default connect(mapStateToProps, mapDispatchToProps)(withTheme(LanguageView)); diff --git a/app/views/SettingsView/index.js b/app/views/SettingsView/index.js index adafca1d73..426c91d2c0 100644 --- a/app/views/SettingsView/index.js +++ b/app/views/SettingsView/index.js @@ -108,7 +108,7 @@ class SettingsView extends React.Component { const { server: { server }, loginRequest, token, appStart } = this.props; - await appStart('loading'); + await appStart('loading', I18n.t('Clear_cache_loading')); await RocketChat.clearCache({ server }); await loginRequest({ resume: token }, true); } @@ -350,7 +350,7 @@ const mapDispatchToProps = dispatch => ({ logout: () => dispatch(logoutAction()), loginRequest: (...params) => dispatch(loginRequestAction(...params)), toggleCrashReport: params => dispatch(toggleCrashReportAction(params)), - appStart: params => dispatch(appStartAction(params)) + appStart: (...params) => dispatch(appStartAction(...params)) }); export default connect(mapStateToProps, mapDispatchToProps)(withTheme(withSplit(SettingsView)));