diff --git a/.circleci/config.yml b/.circleci/config.yml index 14ba8f40ba..bcb01f2a85 100644 --- a/.circleci/config.yml +++ b/.circleci/config.yml @@ -3,7 +3,7 @@ defaults: &defaults macos: &macos macos: - xcode: "11.2.1" + xcode: "11.5.0" bash-env: &bash-env BASH_ENV: "~/.nvm/nvm.sh" @@ -33,14 +33,12 @@ save-npm-cache-mac: &save-npm-cache-mac - ./node_modules install-node: &install-node - name: Install Node 10 + name: Install Node command: | - curl -o- https://raw.githubusercontent.com/creationix/nvm/v0.33.6/install.sh | bash + curl -o- https://raw.githubusercontent.com/nvm-sh/nvm/v0.35.3/install.sh | bash source ~/.nvm/nvm.sh - # https://github.com/creationix/nvm/issues/1394 - set +e - nvm install 10 - echo 'export PATH="/home/circleci/.nvm/versions/node/v10.20.1/bin:$PATH"' >> ~/.bash_profile + INSTALLED_NODE=`nvm which current` + echo "export PATH=\"${INSTALLED_NODE%%/node}:\$PATH\"" >> ~/.bash_profile source ~/.bash_profile restore-gems-cache: &restore-gems-cache diff --git a/.gitignore b/.gitignore index 6e797d850a..fee7bf8651 100644 --- a/.gitignore +++ b/.gitignore @@ -59,3 +59,5 @@ buck-out/ coverage .vscode/ +e2e/docker/rc_test_env/docker-compose.yml +e2e/docker/data/db \ No newline at end of file diff --git a/android/app/build.gradle b/android/app/build.gradle index 693e21c20b..8bf5d0f933 100644 --- a/android/app/build.gradle +++ b/android/app/build.gradle @@ -139,7 +139,7 @@ android { minSdkVersion rootProject.ext.minSdkVersion targetSdkVersion rootProject.ext.targetSdkVersion versionCode VERSIONCODE as Integer - versionName "4.9.0" + versionName "4.10.0" vectorDrawables.useSupportLibrary = true manifestPlaceholders = [BugsnagAPIKey: BugsnagAPIKey as String] missingDimensionStrategy "RNNotifications.reactNativeVersion", "reactNative60" // See note below! diff --git a/app/containers/Avatar.js b/app/containers/Avatar.js index 66bef8411b..c4ed0ba7c4 100644 --- a/app/containers/Avatar.js +++ b/app/containers/Avatar.js @@ -1,7 +1,7 @@ import React from 'react'; import PropTypes from 'prop-types'; import { View } from 'react-native'; -import FastImage from 'react-native-fast-image'; +import FastImage from '@rocket.chat/react-native-fast-image'; import Touchable from 'react-native-platform-touchable'; import { settings as RocketChatSettings } from '@rocket.chat/sdk'; diff --git a/app/containers/EmojiPicker/CustomEmoji.js b/app/containers/EmojiPicker/CustomEmoji.js index 381695d05f..934155fecf 100644 --- a/app/containers/EmojiPicker/CustomEmoji.js +++ b/app/containers/EmojiPicker/CustomEmoji.js @@ -1,5 +1,5 @@ import React from 'react'; -import FastImage from 'react-native-fast-image'; +import FastImage from '@rocket.chat/react-native-fast-image'; import PropTypes from 'prop-types'; const CustomEmoji = React.memo(({ baseUrl, emoji, style }) => ( diff --git a/app/containers/InAppNotification/NotifierComponent.js b/app/containers/InAppNotification/NotifierComponent.js index 084c2fc0ca..9cab30a59b 100644 --- a/app/containers/InAppNotification/NotifierComponent.js +++ b/app/containers/InAppNotification/NotifierComponent.js @@ -90,6 +90,8 @@ const NotifierComponent = React.memo(({ if (isMasterDetail) { Navigation.navigate('DrawerNavigator'); + } else { + Navigation.navigate('RoomsListView'); } goRoom({ item, isMasterDetail }); hideNotification(); diff --git a/app/containers/LoginServices.js b/app/containers/LoginServices.js index b569290330..11ffc6d97d 100644 --- a/app/containers/LoginServices.js +++ b/app/containers/LoginServices.js @@ -5,29 +5,32 @@ import { import PropTypes from 'prop-types'; import { connect } from 'react-redux'; import { Base64 } from 'js-base64'; +import * as AppleAuthentication from 'expo-apple-authentication'; import { withTheme } from '../theme'; import sharedStyles from '../views/Styles'; import { themes } from '../constants/colors'; -import { loginRequest as loginRequestAction } from '../actions/login'; import Button from './Button'; import OrSeparator from './OrSeparator'; import Touch from '../utils/touch'; import I18n from '../i18n'; import random from '../utils/random'; +import RocketChat from '../lib/rocketchat'; +const BUTTON_HEIGHT = 48; const SERVICE_HEIGHT = 58; +const BORDER_RADIUS = 2; const SERVICES_COLLAPSED_HEIGHT = 174; const styles = StyleSheet.create({ serviceButton: { - borderRadius: 2, + borderRadius: BORDER_RADIUS, marginBottom: 10 }, serviceButtonContainer: { - borderRadius: 2, + borderRadius: BORDER_RADIUS, width: '100%', - height: 48, + height: BUTTON_HEIGHT, flexDirection: 'row', alignItems: 'center', justifyContent: 'center', @@ -187,6 +190,21 @@ class LoginServices extends React.PureComponent { this.openOAuth({ url, ssoToken, authType: 'cas' }); } + onPressAppleLogin = async() => { + try { + const { fullName, email, identityToken } = await AppleAuthentication.signInAsync({ + requestedScopes: [ + AppleAuthentication.AppleAuthenticationScope.FULL_NAME, + AppleAuthentication.AppleAuthenticationScope.EMAIL + ] + }); + + await RocketChat.loginOAuthOrSso({ fullName, email, identityToken }); + } catch { + // Do nothing + } + } + getOAuthState = () => { const credentialToken = random(43); return Base64.encodeURI(JSON.stringify({ loginStyle: 'popup', credentialToken, isCordova: true })); @@ -262,6 +280,7 @@ class LoginServices extends React.PureComponent { } renderItem = (service) => { + const { CAS_enabled, theme } = this.props; let { name } = service; name = name === 'meteor-developer' ? 'meteor' : name; const icon = `icon_${ name }`; @@ -285,11 +304,27 @@ class LoginServices extends React.PureComponent { onPress = () => this.onPressCas(); break; } + case 'apple': { + onPress = () => this.onPressAppleLogin(); + break; + } default: break; } + + if (name === 'apple') { + return ( + + ); + } + name = name.charAt(0).toUpperCase() + name.slice(1); - const { CAS_enabled, theme } = this.props; let buttonText; if (isSaml || (service.service === 'cas' && CAS_enabled)) { buttonText = {name}; @@ -356,8 +391,4 @@ const mapStateToProps = state => ({ services: state.login.services }); -const mapDispatchToProps = dispatch => ({ - loginRequest: params => dispatch(loginRequestAction(params)) -}); - -export default connect(mapStateToProps, mapDispatchToProps)(withTheme(LoginServices)); +export default connect(mapStateToProps)(withTheme(LoginServices)); diff --git a/app/containers/MessageActions/index.js b/app/containers/MessageActions/index.js index 7846e1d70d..a6d2a9663b 100644 --- a/app/containers/MessageActions/index.js +++ b/app/containers/MessageActions/index.js @@ -201,7 +201,13 @@ const MessageActions = React.memo(forwardRef(({ hideActionSheet(); }; - const handleReadReceipt = message => Navigation.navigate('ReadReceiptsView', { messageId: message.id }); + const handleReadReceipt = (message) => { + if (isMasterDetail) { + Navigation.navigate('ModalStackNavigator', { screen: 'ReadReceiptsView', params: { messageId: message.id } }); + } else { + Navigation.navigate('ReadReceiptsView', { messageId: message.id }); + } + }; const handleToggleTranslation = async(message) => { try { diff --git a/app/containers/MessageBox/CommandsPreview/Item.js b/app/containers/MessageBox/CommandsPreview/Item.js index 2909f57eef..fd8abd195d 100644 --- a/app/containers/MessageBox/CommandsPreview/Item.js +++ b/app/containers/MessageBox/CommandsPreview/Item.js @@ -1,7 +1,7 @@ import React, { useContext, useState } from 'react'; import PropTypes from 'prop-types'; import { TouchableOpacity } from 'react-native'; -import FastImage from 'react-native-fast-image'; +import FastImage from '@rocket.chat/react-native-fast-image'; import styles from '../styles'; import { CustomIcon } from '../../../lib/Icons'; diff --git a/app/containers/MessageBox/index.js b/app/containers/MessageBox/index.js index 81a08c23a2..813d7d64cb 100644 --- a/app/containers/MessageBox/index.js +++ b/app/containers/MessageBox/index.js @@ -908,7 +908,7 @@ class MessageBox extends Component { return ( <> {commandsPreviewAndMentions} - + {replyPreview} {m} diff --git a/app/containers/message/Image.js b/app/containers/message/Image.js index 499e793a7a..1471b449e9 100644 --- a/app/containers/message/Image.js +++ b/app/containers/message/Image.js @@ -1,7 +1,7 @@ import React, { useContext } from 'react'; import { View } from 'react-native'; import PropTypes from 'prop-types'; -import FastImage from 'react-native-fast-image'; +import FastImage from '@rocket.chat/react-native-fast-image'; import equal from 'deep-equal'; import { createImageProgress } from 'react-native-image-progress'; import * as Progress from 'react-native-progress'; diff --git a/app/containers/message/Urls.js b/app/containers/message/Urls.js index b5e43bf6da..946433d435 100644 --- a/app/containers/message/Urls.js +++ b/app/containers/message/Urls.js @@ -3,7 +3,7 @@ import { View, Text, StyleSheet, Clipboard } from 'react-native'; import PropTypes from 'prop-types'; -import FastImage from 'react-native-fast-image'; +import FastImage from '@rocket.chat/react-native-fast-image'; import isEqual from 'lodash/isEqual'; import Touchable from './Touchable'; diff --git a/app/i18n/locales/de.js b/app/i18n/locales/de.js index bc74bbdd24..0d01883799 100644 --- a/app/i18n/locales/de.js +++ b/app/i18n/locales/de.js @@ -27,9 +27,9 @@ export default { 'error-invalid-arguments': 'Ungültige Argumente', 'error-invalid-asset': 'Ungültiges Asset', 'error-invalid-channel': 'Ungültiger Kanal', - 'error-invalid-channel-start-with-chars': 'Ungültiger Kanal. Beginnen Sie mit @ oder #', + 'error-invalid-channel-start-with-chars': 'Ungültiger Kanal. Beginne mit @ oder #', 'error-invalid-custom-field': 'Ungültiges benutzerdefiniertes Feld', - 'error-invalid-custom-field-name': 'Ungültiger benutzerdefinierter Feldname. Verwenden Sie nur Buchstaben, Zahlen, Bindestriche und Unterstriche.', + 'error-invalid-custom-field-name': 'Ungültiger benutzerdefinierter Feldname. Verwende nur Buchstaben, Zahlen, Bindestriche und Unterstriche.', 'error-invalid-date': 'Ungültiges Datum angegeben', 'error-invalid-description': 'Ungültige Beschreibung', 'error-invalid-domain': 'Ungültige Domain', @@ -38,7 +38,7 @@ export default { 'error-invalid-file-height': 'Ungültige Dateihöhe', 'error-invalid-file-type': 'Ungültiger Dateityp', 'error-invalid-file-width': 'Ungültige Dateibreite', - 'error-invalid-from-address': 'Sie haben eine ungültige FROM-Adresse mitgeteilt.', + 'error-invalid-from-address': 'Du hast eine ungültige FROM-Adresse mitgeteilt.', 'error-invalid-integration': 'Ungültige Integration', 'error-invalid-message': 'Ungültige Nachricht', 'error-invalid-method': 'Ungültige Methode', @@ -60,24 +60,24 @@ export default { 'error-message-deleting-blocked': 'Das Löschen von Nachrichten ist gesperrt', 'error-message-editing-blocked': 'Die Bearbeitung von Nachrichten ist gesperrt', 'error-message-size-exceeded': 'Die Nachrichtengröße überschreitet Message_MaxAllowedSize', - 'error-missing-unsubscribe-link': 'Sie müssen den Link [abbestellen] angeben.', + 'error-missing-unsubscribe-link': 'Du musst den Link [abbestellen] angeben.', 'error-no-tokens-for-this-user': 'Für diesen Benutzer gibt es keine Token', 'error-not-allowed': 'Nicht erlaubt', 'error-not-authorized': 'Nicht berechtigt', 'error-push-disabled': 'Push ist deaktiviert', - 'error-remove-last-owner': 'Dies ist der letzte Besitzer. Bitte legen Sie einen neuen Besitzer fest, bevor Sie diesen entfernen.', + 'error-remove-last-owner': 'Dies ist der letzte Besitzer. Bitte lege einen neuen Besitzer fest, bevor du diesen entfernst.', 'error-role-in-use': 'Rolle kann nicht gelöscht werden, da sie gerade verwendet wird', 'error-role-name-required': 'Der Rollenname ist erforderlich', 'error-the-field-is-required': 'Das Feld {{field}} ist erforderlich.', - 'error-too-many-requests': 'Fehler, zu viele Anfragen. Sie müssen {{Sekunden}} Sekunden warten, bevor Sie es erneut versuchen.', + 'error-too-many-requests': 'Fehler, zu viele Anfragen. Du musst {{Sekunden}} Sekunden warten, bevor du es erneut versuchst.', 'error-user-is-not-activated': 'Benutzer ist nicht aktiviert', 'error-user-has-no-roles': 'Benutzer hat keine Rollen', - 'error-user-limit-exceeded': 'Die Anzahl der Benutzer, die Sie zu #channel_name einladen möchten, überschreitet die vom Administrator festgelegte Grenze', + 'error-user-limit-exceeded': 'Die Anzahl der Benutzer, die du zu #channel_name einladen möchtest, überschreitet die vom Administrator festgelegte Grenze', 'error-user-not-in-room': 'Benutzer ist nicht in diesem Raum', 'error-user-registration-custom-field': 'error-user-registration-custom-field', 'error-user-registration-disabled': 'Die Benutzerregistrierung ist deaktiviert', 'error-user-registration-secret': 'Die Benutzerregistrierung ist nur über eine geheime URL möglich', - 'error-you-are-last-owner': 'Sie sind der letzte Besitzer. Bitte setzen Sie einen neuen Besitzer, bevor Sie den Raum verlassen.', + 'error-you-are-last-owner': 'Du bist der letzte Besitzer. Bitte setze einen neuen Besitzer, bevor du den Raum verlässt.', Actions: 'Aktionen', activity: 'Aktivität', Activity: 'Aktivität', @@ -99,13 +99,13 @@ export default { and: 'und', announcement: 'Ankündigung', Announcement: 'Ankündigung', - Apply_Your_Certificate: 'Wenden Sie Ihr Zertifikat an', + Apply_Your_Certificate: 'Wende dein Zertifikat an', Applying_a_theme_will_change_how_the_app_looks: 'Das Erscheinungsbild festzulegen wird das Aussehen der Anwendung ändern.', ARCHIVE: 'ARCHIV', archive: 'Archiv', are_typing: 'tippen', Are_you_sure_question_mark: 'Bist du sicher?', - Are_you_sure_you_want_to_leave_the_room: 'Möchten Sie den Raum wirklich verlassen {{room}}?', + Are_you_sure_you_want_to_leave_the_room: 'Möchtest du den Raum wirklich verlassen {{room}}?', Audio: 'Audio', Authenticating: 'Authentifizierung', Automatic: 'Automatisch', @@ -120,7 +120,7 @@ export default { Broadcast_channel_Description: 'Nur autorisierte Benutzer können neue Nachrichten schreiben, die anderen Benutzer können jedoch antworten', Broadcast_Channel: 'Broadcastkanal', Busy: 'Beschäftigt', - By_proceeding_you_are_agreeing: 'Indem Sie fortfahren, stimmen Sie zu unserem', + By_proceeding_you_are_agreeing: 'Indem du fortfährst, stimmst du zu unserem', Cancel_editing: 'Bearbeitung abbrechen', Cancel_recording: 'Aufnahme abbrechen', Cancel: 'Abbrechen', @@ -133,7 +133,7 @@ export default { Call_already_ended: 'Anruf bereits beendet!', Click_to_join: 'Klicken um teilzunehmen!', Close: 'Schließen', - Close_emoji_selector: 'Schließen Sie die Emoji-Auswahl', + Close_emoji_selector: 'Schließe die Emoji-Auswahl', Closing_chat: 'Chat schließen', Change_language_loading: 'Ändere Sprache.', Chat_closed_by_agent: 'Chat durch den Agenten geschlossen', @@ -150,7 +150,7 @@ export default { connecting_server: 'verbinde zum Server', Connecting: 'Verbinden ...', Contact_us: 'Kontaktiere uns', - Contact_your_server_admin: 'Kontaktieren Sie Ihren Server-Administrator.', + Contact_your_server_admin: 'Kontaktiere deinen Server-Administrator.', Continue_with: 'Weitermachen mit', Copied_to_clipboard: 'In die Zwischenablage kopiert!', Copy: 'Kopieren', @@ -159,13 +159,13 @@ export default { Certificate_password: 'Zertifikats-Passwort', Clear_cache: 'Lokalen Server-Cache leeren', Clear_cache_loading: 'Leere Cache.', - Whats_the_password_for_your_certificate: 'Wie lautet das Passwort für Ihr Zertifikat?', + Whats_the_password_for_your_certificate: 'Wie lautet das Passwort für dein Zertifikat?', Create_account: 'Ein Konto erstellen', Create_Channel: 'Kanal erstellen', Create_Direct_Messages: 'Direkt-Nachricht erstellen', Create_Discussion: 'Diskussion erstellen', Created_snippet: 'Erstellt ein Snippet', - Create_a_new_workspace: 'Erstellen Sie einen neuen Arbeitsbereich', + Create_a_new_workspace: 'Erstelle einen neuen Arbeitsbereich', Create: 'Erstellen', Custom_Status: 'eigener Status', Dark: 'Dunkel', @@ -190,8 +190,8 @@ export default { Done: 'Erledigt', Dont_Have_An_Account: 'Du hast noch kein Konto?', Do_you_have_an_account: 'Du hast schon ein Konto?', - Do_you_have_a_certificate: 'Haben Sie ein Zertifikat?', - Do_you_really_want_to_key_this_room_question_mark: 'Möchten Sie diesen Raum wirklich {{key}}?', + Do_you_have_a_certificate: 'Hast du ein Zertifikat?', + Do_you_really_want_to_key_this_room_question_mark: 'Möchtest du diesen Raum wirklich {{key}}?', edit: 'bearbeiten', edited: 'bearbeitet', Edit: 'Bearbeiten', @@ -212,10 +212,10 @@ export default { Files: 'Dateien', File_description: 'Dateibeschreibung', File_name: 'Dateiname', - Finish_recording: 'Beenden Sie die Aufnahme', + Finish_recording: 'Beende die Aufnahme', Following_thread: 'Thread folgen', - For_your_security_you_must_enter_your_current_password_to_continue: 'Zu Ihrer Sicherheit müssen Sie Ihr aktuelles Passwort eingeben, um fortzufahren', - Forgot_password_If_this_email_is_registered: 'Wenn diese E-Mail registriert ist, senden wir Anweisungen zum Zurücksetzen Ihres Passworts. Wenn Sie in Kürze keine E-Mail erhalten, kommen Sie bitte zurück und versuchen Sie es erneut.', + For_your_security_you_must_enter_your_current_password_to_continue: 'Zu deiner Sicherheit musst du dein aktuelles Passwort eingeben, um fortzufahren', + Forgot_password_If_this_email_is_registered: 'Wenn diese E-Mail registriert ist, senden wir Anweisungen zum Zurücksetzen deines Passworts. Wenn du nicht in Kürze keine E-Mail erhältst, versuche es bitte erneut.', Forgot_password: 'Passwort vergessen', Forgot_Password: 'Passwort vergessen', Forward: 'Weiterleiten', @@ -255,7 +255,7 @@ export default { is_not_a_valid_RocketChat_instance: 'ist keine gültige Rocket.Chat-Instanz', is_typing: 'schreibt', Invalid_or_expired_invite_token: 'Ungültiger oder abgelaufener Einladungscode', - Invalid_server_version: 'Der Server, zu dem Sie eine Verbindung herstellen möchten, verwendet eine Version, die von der App nicht mehr unterstützt wird: {{currentVersion}}.\n\nWir benötigen Version {{MinVersion}}.', + Invalid_server_version: 'Der Server, zu dem du dich verbinden möchtest, verwendet eine Version, die von der App nicht mehr unterstützt wird: {{currentVersion}}.\n\nWir benötigen Version {{MinVersion}}.', Invite_Link: 'Einladungs-Link', Invite_users: 'Benutzer einladen', Join: 'Beitreten', @@ -273,7 +273,7 @@ export default { Livechat: 'Live-Chat', Livechat_edit: 'Livechat bearbeiten', Login: 'Anmeldung', - Login_error: 'Ihre Zugangsdaten wurden abgelehnt! Bitte versuchen Sie es erneut.', + Login_error: 'Deine Zugangsdaten wurden abgelehnt! Bitte versuche es erneut.', Login_with: 'Einloggen mit', Logging_out: 'Abmelden.', Logout: 'Abmelden', @@ -295,7 +295,7 @@ export default { Message: 'Nachricht', Messages: 'Mitteilungen', Message_Reported: 'Nachricht gemeldet', - Microphone_Permission_Message: 'Rocket.Chat benötigt Zugriff auf Ihr Mikrofon, damit Sie eine Audionachricht senden können.', + Microphone_Permission_Message: 'Rocket.Chat benötigt Zugriff auf das Mikrofon, damit du eine Audionachricht senden kannst.', Microphone_Permission: 'Mikrofonberechtigung', Mute: 'Stumm', muted: 'stummgeschaltet', @@ -327,13 +327,14 @@ export default { Nothing: 'Nichts', Nothing_to_save: 'Nichts zu speichern!', Notify_active_in_this_room: 'Aktive Benutzer in diesem Raum benachrichtigen', - Notify_all_in_this_room: 'Benachrichtigen Sie alle in diesem Raum', + Notify_all_in_this_room: 'Benachrichtige alle in diesem Raum', Notifications: 'Benachrichtigungen', Notification_Duration: 'Benachrichtigungsdauer', Notification_Preferences: 'Benachrichtigungseinstellungen', No_available_agents_to_transfer: 'Keine Agenten für den Transfer verfügbar', Offline: 'Offline', Oops: 'Hoppla!', + Omnichannel: 'Omnichannel', Onboarding_description: 'Ein Arbeitsbereich ist der Ort für die Zusammenarbeit deines Teams oder Organisation. Bitte den Admin des Arbeitsbereichs um eine Adresse, um ihm beizutreten, oder erstelle einen Arbeitsbereich für dein Team.', Onboarding_join_workspace: 'Tritt einem Arbeitsbereich bei', Onboarding_subtitle: 'Mehr als Team-Zusammenarbeit', @@ -359,7 +360,7 @@ export default { pinned: 'angeheftet', Pinned: 'Angeheftet', Please_add_a_comment: 'Bitte Kommentar hinzufügen', - Please_enter_your_password: 'Bitte geben Sie Ihr Passwort ein', + Please_enter_your_password: 'Gib bitte dein Passwort ein', Please_wait: 'Bitte warten.', Preferences: 'Einstellungen', Preferences_saved: 'Einstellungen gespeichert!', @@ -379,6 +380,8 @@ export default { Reactions_are_enabled: 'Reaktionen sind aktiviert', Reactions: 'Reaktionen', Read: 'Gelesen', + Read_External_Permission_Message: 'Rocket.Chat benötigt Zugriff auf deine Fotos, Medien und Dateien auf deinem Gerät', + Read_External_Permission: 'Lese-Zugriff auf Medien', Read_Only_Channel: 'Nur-Lese-Kanal', Read_Only: 'Schreibgeschützt', Read_Receipt: 'Lesebestätigung', @@ -405,6 +408,7 @@ export default { Review_app_later: 'Vielleicht später', Review_app_unable_store: 'Kann {{store}} nicht öffnen', Review_this_app: 'App bewerten', + Remove: 'Entfernen', Roles: 'Rollen', Room_actions: 'Raumaktionen', Room_changed_announcement: 'Raumansage geändert in: {{announcement}} von {{userBy}}', @@ -428,9 +432,9 @@ export default { Search: 'Suche', Search_by: 'Suche nach', Search_global_users: 'Suche nach globalen Benutzern', - Search_global_users_description: 'Beim Einschalten können Sie nach Benutzern von anderen Unternehmen oder Servern suchen.', + Search_global_users_description: 'Wenn aktiviert, kannst du nach Benutzern von anderen Unternehmen oder Servern suchen.', Seconds: '{{second}} Sekunden', - Select_Avatar: 'Wählen Sie einen Avatar aus', + Select_Avatar: 'Wähle einen Avatar aus', Select_Server: 'Server auswählen', Select_Users: 'Benutzer auswählen', Select_a_Channel: 'Kanal auswählen', @@ -443,11 +447,12 @@ export default { Send_message: 'Nachricht senden', Send_me_the_code_again: 'Den Code neu versenden', Send_to: 'Senden an …', + Sending_to: 'Sende an', Sent_an_attachment: 'Sende einen Anhang', Server: 'Server', Servers: 'Server', Server_version: 'Server version: {{version}}', - Set_username_subtitle: 'Der Benutzername wird verwendet, damit andere Personen Sie in Nachrichten erwähnen können', + Set_username_subtitle: 'Der Benutzername wird verwendet, damit andere Personen dich in Nachrichten erwähnen können', Set_custom_status: 'Individuellen Status setzen', Set_status: 'Status setzen', Status_saved_successfully: 'Status erfolgreich gesetzt!', @@ -470,6 +475,7 @@ export default { starred: 'favorisiert', Starred: 'Favorisiert', Start_of_conversation: 'Beginn des Gesprächs', + Start_a_Discussion: 'Beginne eine Diskussion', Started_discussion: 'Hat eine Diskussion gestartet:', Started_call: 'Anruf gestartet von {{userBy}}', Submit: 'einreichen', @@ -478,10 +484,12 @@ export default { Take_a_photo: 'Foto aufnehmen', Take_a_video: 'Video aufnehmen', tap_to_change_status: 'Tippen um den Status zu ändern', - Tap_to_view_servers_list: 'Tippen Sie hier, um die Serverliste anzuzeigen', + Tap_to_view_servers_list: 'Hier tippen, um die Serverliste anzuzeigen', Terms_of_Service: ' Nutzungsbedingungen', Theme: 'Erscheinungsbild', - The_URL_is_invalid: 'Die eingegebene URL ist ungültig. Überprüfen Sie es und versuchen Sie es bitte erneut!', + The_URL_is_invalid: 'Die eingegebene URL ist ungültig. Überprüfe sie bitte noch einmal und versuche es erneut!', + The_user_wont_be_able_to_type_in_roomName: 'Dem Nutzer wird es nicht möglich sein in {{roomName}} zu schreiben', + The_user_will_be_able_to_type_in_roomName: 'Der Nutzer wird in {{roomName}} schreiben können', There_was_an_error_while_action: 'Während {{action}} ist ein Fehler aufgetreten!', This_room_is_blocked: 'Dieser Raum ist gesperrt', This_room_is_read_only: 'Dieser Raum kann nur gelesen werden', @@ -492,7 +500,7 @@ export default { topic: 'Thema', Topic: 'Thema', Translate: 'Übersetzen', - Try_again: 'Versuchen Sie es nochmal', + Try_again: 'Versuche es nochmal', Two_Factor_Authentication: 'Zwei-Faktor-Authentifizierung', Type_the_channel_name_here: 'Gib hier den Kanalnamen ein', unarchive: 'wiederherstellen', @@ -535,28 +543,29 @@ export default { Video_call: 'Videoanruf', View_Original: 'Original anzeigen', Voice_call: 'Sprachanruf', + Waiting_for_network: 'Warte auf das Netzwerk …', Websocket_disabled: 'Websockets sind auf diesem Server nicht aktiviert.\n{{contact}}', Welcome: 'Herzlich willkommen', What_are_you_doing_right_now: 'Was machst du gerade?', - Whats_your_2fa: 'Wie lautet Ihr 2FA-Code?', + Whats_your_2fa: 'Wie lautet dein 2FA-Code?', Without_Servers: 'Ohne Server', Workspaces: 'Arbeitsbereiche', Would_you_like_to_return_the_inquiry: 'Willst du zur Anfrage zurück?', - Write_External_Permission_Message: 'Rocket.Chat benötigt Zugriff auf Ihre Galerie um Bilder speichern zu können.', + Write_External_Permission_Message: 'Rocket.Chat benötigt Zugriff auf deine Galerie um Bilder speichern zu können.', Write_External_Permission: 'Galerie-Zugriff', Yes: 'Ja', Yes_action_it: 'Ja, {{action}}!', Yesterday: 'Gestern', - You_are_in_preview_mode: 'Sie befinden sich im Vorschaumodus', - You_are_offline: 'Sie sind offline', - You_can_search_using_RegExp_eg: 'Sie können mit RegExp suchen. z.B. `/ ^ text $ / i`', - You_colon: 'Sie: ', - you_were_mentioned: 'Sie wurden erwähnt', - You_were_removed_from_channel: 'Sie wurden aus dem Kanal {{channel}} entfernt', - you: 'Sie', - You: 'Sie', + You_are_in_preview_mode: 'Du befindest dich im Vorschaumodus', + You_are_offline: 'Du bist offline', + You_can_search_using_RegExp_eg: 'Du kannst mit RegExp suchen. z.B. `/ ^ text $ / i`', + You_colon: 'Du: ', + you_were_mentioned: 'Du wurdest erwähnt', + You_were_removed_from_channel: 'Du wurdest aus dem Kanal {{channel}} entfernt', + you: 'du', + You: 'Du', Logged_out_by_server: 'Du bist vom Server abgemeldet worden. Bitte melde dich wieder an.', - You_need_to_access_at_least_one_RocketChat_server_to_share_something: 'Sie benötigen Zugang zu mindestens einem Rocket.Chat-Server um etwas zu teilen.', + You_need_to_access_at_least_one_RocketChat_server_to_share_something: 'Du benötigst Zugang zu mindestens einem Rocket.Chat-Server um etwas zu teilen.', Your_certificate: 'Dein Zertifikat', Your_message: 'Deine Nachricht', Your_invite_link_will_expire_after__usesLeft__uses: 'Dein Einladungs-Link wird nach {{usesLeft}} Benutzungen ablaufen.', @@ -565,9 +574,10 @@ export default { Your_invite_link_will_never_expire: 'Dein Einladungs-Link wird niemals ablaufen.', Your_workspace: 'Dein Arbeitsbereich', Version_no: 'Version: {{version}}', - You_will_not_be_able_to_recover_this_message: 'Sie können diese Nachricht nicht wiederherstellen!', + You_will_not_be_able_to_recover_this_message: 'Du kannst diese Nachricht nicht wiederherstellen!', + You_will_unset_a_certificate_for_this_server: 'Du entfernst ein Zertifikat für diesen Server', Change_Language: 'Sprache ändern', - Crash_report_disclaimer: 'Wir verfolgen niemals den Inhalt Ihrer Chats. Der Crash-Report enthält nur für uns relevante Informationen um das Problem zu erkennen und zu beheben.', + Crash_report_disclaimer: 'Wir verfolgen niemals den Inhalt deiner Chats. Der Crash-Report enthält nur für uns relevante Informationen um das Problem zu erkennen und zu beheben.', Type_message: 'Type message', Room_search: 'Raum-Suche', Room_selection: 'Raum-Auswahl 1...9', @@ -578,6 +588,7 @@ export default { Search_messages: 'Nachrichten durchsuchen', Scroll_messages: 'Nachrichten durchblättern', Reply_latest: 'Auf die letzte Nachricht antworten', + Reply_in_Thread: 'Im Thread antworten', Server_selection: 'Server-Auswahl', Server_selection_numbers: 'Server-Auswahl 1...9', Add_server: 'Server hinufügen', diff --git a/app/i18n/locales/en.js b/app/i18n/locales/en.js index 7237b3b2cd..e6038732eb 100644 --- a/app/i18n/locales/en.js +++ b/app/i18n/locales/en.js @@ -295,7 +295,7 @@ export default { Message: 'Message', Messages: 'Messages', Message_Reported: 'Message reported', - Microphone_Permission_Message: 'Rocket Chat needs access to your microphone so you can send audio message.', + Microphone_Permission_Message: 'Rocket.Chat needs access to your microphone so you can send audio message.', Microphone_Permission: 'Microphone Permission', Mute: 'Mute', muted: 'muted', @@ -380,7 +380,7 @@ export default { Reactions_are_enabled: 'Reactions are enabled', Reactions: 'Reactions', Read: 'Read', - Read_External_Permission_Message: 'Rocket Chat needs to access photos, media, and files on your device', + Read_External_Permission_Message: 'Rocket.Chat needs to access photos, media, and files on your device', Read_External_Permission: 'Read Media Permission', Read_Only_Channel: 'Read Only Channel', Read_Only: 'Read Only', @@ -551,7 +551,7 @@ export default { Without_Servers: 'Without Servers', Workspaces: 'Workspaces', Would_you_like_to_return_the_inquiry: 'Would you like to return the inquiry?', - Write_External_Permission_Message: 'Rocket Chat needs access to your gallery so you can save images.', + Write_External_Permission_Message: 'Rocket.Chat needs access to your gallery so you can save images.', Write_External_Permission: 'Gallery Permission', Yes: 'Yes', Yes_action_it: 'Yes, {{action}} it!', diff --git a/app/i18n/locales/es-ES.js b/app/i18n/locales/es-ES.js index c57f6800a8..74993266d3 100644 --- a/app/i18n/locales/es-ES.js +++ b/app/i18n/locales/es-ES.js @@ -233,7 +233,7 @@ export default { messages: 'mensajes', Messages: 'Mensajes', Message_Reported: 'Mensaje notificado', - Microphone_Permission_Message: 'Rocket Chat necesita acceso a su micrófono para que pueda enviar un mensaje de audio.', + Microphone_Permission_Message: 'Rocket.Chat necesita acceso a su micrófono para que pueda enviar un mensaje de audio.', Microphone_Permission: 'Permiso de micrófono', Mute: 'Mutear', muted: 'muteado', diff --git a/app/i18n/locales/fr.js b/app/i18n/locales/fr.js index a2f8fe008a..ce638a0dbf 100644 --- a/app/i18n/locales/fr.js +++ b/app/i18n/locales/fr.js @@ -194,7 +194,7 @@ export default { Message_pinned: 'Message épinglé', Message_removed: 'Message supprimé', Messages: 'Messages', - Microphone_Permission_Message: 'Rocket Chat doit avoir accès à votre microphone pour pouvoir envoyer un message audio.', + Microphone_Permission_Message: 'Rocket.Chat doit avoir accès à votre microphone pour pouvoir envoyer un message audio.', Microphone_Permission: 'Permission de microphone', Mute: 'Rendre muet', muted: 'Rendu muet', diff --git a/app/i18n/locales/ja.js b/app/i18n/locales/ja.js index 30090f6354..b3cc25a544 100644 --- a/app/i18n/locales/ja.js +++ b/app/i18n/locales/ja.js @@ -232,8 +232,8 @@ export default { 'アプリを表示中にはバナーを上部に表示し、デスクトップには通知を送ります。', Invisible: '状態を隠す', Invite: '招待', - is_a_valid_RocketChat_instance: 'は正しいRocket Chatのインスタンスです', - is_not_a_valid_RocketChat_instance: 'はRocket Chatのインスタンスではありません', + is_a_valid_RocketChat_instance: 'は正しいRocket.Chatのインスタンスです', + is_not_a_valid_RocketChat_instance: 'はRocket.Chatのインスタンスではありません', is_typing: 'が入力中', Invalid_or_expired_invite_token: '招待トークンが無効か、期限が切れています', Invalid_server_version: @@ -272,7 +272,7 @@ export default { Messages: 'メッセージ', Message_Reported: 'メッセージを報告しました', Microphone_Permission_Message: - 'Rocket Chatは音声メッセージを送信するのにマイクのアクセスの許可が必要です。', + 'Rocket.Chatは音声メッセージを送信するのにマイクのアクセスの許可が必要です。', Microphone_Permission: 'マイクの許可', Mute: 'ミュート', muted: 'ミュートした', @@ -298,7 +298,7 @@ export default { No_Reactions: 'リアクションなし', No_Read_Receipts: '未読通知はありません', Not_logged: 'ログされていません', - Not_RC_Server: 'Rocket Chatサーバーではありません。\n{{contact}}', + Not_RC_Server: 'Rocket.Chatサーバーではありません。\n{{contact}}', Nothing: '何もなし', Nothing_to_save: '保存するものはありません!', Notify_active_in_this_room: 'このルームのアクティブなユーザーに通知する', @@ -488,7 +488,7 @@ export default { Whats_your_2fa: '2段階認証のコードを入力してください', Without_Servers: 'サーバーを除く', Write_External_Permission_Message: - 'Rocket Chatは画像を保存するためにギャラリーへのアクセスを求めています。', + 'Rocket.Chatは画像を保存するためにギャラリーへのアクセスを求めています。', Write_External_Permission: 'ギャラリーへのアクセス許可', Yes_action_it: 'はい、{{action}}します!', Yesterday: '昨日', diff --git a/app/i18n/locales/nl.js b/app/i18n/locales/nl.js index fb41fdfb62..39cecb99c9 100644 --- a/app/i18n/locales/nl.js +++ b/app/i18n/locales/nl.js @@ -242,7 +242,7 @@ export default { messages: 'berichten', Messages: 'Berichten', Message_Reported: 'Bericht gerapporteerd', - Microphone_Permission_Message: 'Rocket Chat heeft toegang tot je microfoon nodig voor geluidsberichten.', + Microphone_Permission_Message: 'Rocket.Chat heeft toegang tot je microfoon nodig voor geluidsberichten.', Microphone_Permission: 'Microfoon toestemming', Mute: 'Dempen', muted: 'gedempt', @@ -448,7 +448,7 @@ export default { Welcome: 'Welkom', Whats_your_2fa: 'Wat is je 2FA code?', Without_Servers: 'Zonder Servers', - Write_External_Permission_Message: 'Rocket Chat moet bij je galerij kunnen om afbeeldingen op te slaan.', + Write_External_Permission_Message: 'Rocket.Chat moet bij je galerij kunnen om afbeeldingen op te slaan.', Write_External_Permission: 'Galerij Toestemming', Yes_action_it: 'Ja, {{action}} het!', Yesterday: 'Gisteren', diff --git a/app/i18n/locales/pt-BR.js b/app/i18n/locales/pt-BR.js index 14c76d8192..5e1d2342ba 100644 --- a/app/i18n/locales/pt-BR.js +++ b/app/i18n/locales/pt-BR.js @@ -271,7 +271,7 @@ export default { message: 'mensagem', messages: 'mensagens', Messages: 'Mensagens', - Microphone_Permission_Message: 'Rocket Chat precisa de acesso ao seu microfone para enviar mensagens de áudio.', + Microphone_Permission_Message: 'Rocket.Chat precisa de acesso ao seu microfone para enviar mensagens de áudio.', Microphone_Permission: 'Acesso ao Microfone', Mute: 'Mudo', muted: 'mudo', @@ -344,7 +344,7 @@ export default { Reactions_are_disabled: 'Reagir está desabilitado', Reactions_are_enabled: 'Reagir está habilitado', Reactions: 'Reações', - Read_External_Permission_Message: 'Rocket Chat precisa acessar fotos, mídia e arquivos no seu dispositivo', + Read_External_Permission_Message: 'Rocket.Chat precisa acessar fotos, mídia e arquivos no seu dispositivo', Read_External_Permission: 'Permissão de acesso à arquivos', Read_Only_Channel: 'Canal Somente Leitura', Read_Only: 'Somente Leitura', @@ -505,7 +505,7 @@ export default { You_will_not_be_able_to_recover_this_message: 'Você não será capaz de recuperar essa mensagem!', You_will_unset_a_certificate_for_this_server: 'Você cancelará a configuração de um certificado para este servidor', Would_you_like_to_return_the_inquiry: 'Deseja retornar a consulta?', - Write_External_Permission_Message: 'Rocket Chat precisa de acesso à sua galeria para salvar imagens', + Write_External_Permission_Message: 'Rocket.Chat precisa de acesso à sua galeria para salvar imagens', Write_External_Permission: 'Acesso à Galeria', Yes: 'Sim', Crash_report_disclaimer: 'Nós não rastreamos o conteúdo das suas conversas. O relatório de erros apenas contém informações relevantes para identificarmos problemas e corrigí-los.', diff --git a/app/i18n/locales/pt-PT.js b/app/i18n/locales/pt-PT.js index 7de141116a..a702951bd7 100644 --- a/app/i18n/locales/pt-PT.js +++ b/app/i18n/locales/pt-PT.js @@ -195,7 +195,7 @@ export default { Message_pinned: 'Mensagem afixada', Message_removed: 'Mensagem removida', Messages: 'Mensagens', - Microphone_Permission_Message: 'O Rocket Chat necessita de acesso ao seu microfone para que você possa enviar mensagens de áudio.', + Microphone_Permission_Message: 'O Rocket.Chat necessita de acesso ao seu microfone para que você possa enviar mensagens de áudio.', Microphone_Permission: 'Permissão de Microfone', Mute: 'Silenciar', muted: 'silenciado', diff --git a/app/i18n/locales/ru.js b/app/i18n/locales/ru.js index f2d45ef2e3..53579a7cd5 100644 --- a/app/i18n/locales/ru.js +++ b/app/i18n/locales/ru.js @@ -227,7 +227,7 @@ export default { messages: 'сообщения', Messages: 'Сообщения', Message_Reported: 'Сообщение отправлено', - Microphone_Permission_Message: 'Rocket Chat нужен доступ к вашему микрофону, чтобы вы могли отправлять аудиосообщения.', + Microphone_Permission_Message: 'Rocket.Chat нужен доступ к вашему микрофону, чтобы вы могли отправлять аудиосообщения.', Microphone_Permission: 'Разрешение на использование микрофона', Mute: 'Заглушить', muted: 'Заглушен', diff --git a/app/i18n/locales/zh-CN.js b/app/i18n/locales/zh-CN.js index fa0b9c97b8..068125219f 100644 --- a/app/i18n/locales/zh-CN.js +++ b/app/i18n/locales/zh-CN.js @@ -190,7 +190,7 @@ export default { Message_pinned: '消息被钉住', Message_removed: '消息被删除', Messages: '消息', - Microphone_Permission_Message: 'Rocket Chat需要访问您的麦克风,以便您可以发送音频消息。', + Microphone_Permission_Message: 'Rocket.Chat需要访问您的麦克风,以便您可以发送音频消息。', Microphone_Permission: '麦克风授权', Mute: '静音', muted: '被静音', diff --git a/app/lib/rocketchat.js b/app/lib/rocketchat.js index 6cf94d0fdb..1353b7364d 100644 --- a/app/lib/rocketchat.js +++ b/app/lib/rocketchat.js @@ -1083,6 +1083,10 @@ const RocketChat = { return 'cas'; } + if (authName === 'apple' && isIOS) { + return 'apple'; + } + // TODO: remove this after other oauth providers are implemented. e.g. Drupal, github_enterprise const availableOAuth = ['facebook', 'github', 'gitlab', 'google', 'linkedin', 'meteor-developer', 'twitter', 'wordpress']; return availableOAuth.includes(authName) ? 'oauth' : 'not_supported'; diff --git a/app/presentation/ImageViewer/ImageComponent.js b/app/presentation/ImageViewer/ImageComponent.js index cb365f03eb..cf00e43228 100644 --- a/app/presentation/ImageViewer/ImageComponent.js +++ b/app/presentation/ImageViewer/ImageComponent.js @@ -6,7 +6,7 @@ export const ImageComponent = (type) => { const { Image } = require('react-native'); Component = Image; } else { - const FastImage = require('react-native-fast-image').default; + const FastImage = require('@rocket.chat/react-native-fast-image').default; Component = FastImage; } return Component; diff --git a/app/presentation/ServerItem/index.js b/app/presentation/ServerItem/index.js index 094b86a949..53163a43c1 100644 --- a/app/presentation/ServerItem/index.js +++ b/app/presentation/ServerItem/index.js @@ -1,7 +1,7 @@ import React from 'react'; import PropTypes from 'prop-types'; import { View, Text } from 'react-native'; -import FastImage from 'react-native-fast-image'; +import FastImage from '@rocket.chat/react-native-fast-image'; import Touch from '../../utils/touch'; import Check from '../../containers/Check'; diff --git a/app/stacks/MasterDetailStack/index.js b/app/stacks/MasterDetailStack/index.js index 0b27d89dfe..93edefba40 100644 --- a/app/stacks/MasterDetailStack/index.js +++ b/app/stacks/MasterDetailStack/index.js @@ -189,7 +189,7 @@ const ModalStackNavigator = React.memo(({ navigation }) => { ReadReceiptsView.navigationOptions({ ...props, isMasterDetail: true })} /> { + const options = { + title: I18n.t('Read_Receipt') + }; + if (isMasterDetail) { + options.headerLeft = () => ; + } + return options; } static propTypes = { diff --git a/app/views/RoomInfoView/index.js b/app/views/RoomInfoView/index.js index b3711b0f49..8794995ac8 100644 --- a/app/views/RoomInfoView/index.js +++ b/app/views/RoomInfoView/index.js @@ -22,6 +22,8 @@ import { themes } from '../../constants/colors'; import { withTheme } from '../../theme'; import { getUserSelector } from '../../selectors/login'; import Markdown from '../../containers/markdown'; +import { LISTENER } from '../../containers/Toast'; +import EventEmitter from '../../utils/events'; import Livechat from './Livechat'; import Channel from './Channel'; @@ -59,7 +61,8 @@ class RoomInfoView extends React.Component { baseUrl: PropTypes.string, rooms: PropTypes.array, theme: PropTypes.string, - isMasterDetail: PropTypes.bool + isMasterDetail: PropTypes.bool, + jitsiEnabled: PropTypes.bool } constructor(props) { @@ -167,11 +170,11 @@ class RoomInfoView extends React.Component { } loadUser = async() => { - const { room: roomState, roomUser } = this.state; + const { room, roomUser } = this.state; if (_.isEmpty(roomUser)) { try { - const roomUserId = RocketChat.getUidDirectMessage(roomState); + const roomUserId = RocketChat.getUidDirectMessage(room); const result = await RocketChat.getUserInfo(roomUserId); if (result.success) { const { user } = result; @@ -183,9 +186,7 @@ class RoomInfoView extends React.Component { })); } - const room = await this.getDirect(user.username); - - this.setState({ roomUser: user, room: { ...roomState, rid: room.rid } }); + this.setState({ roomUser: user }); } } catch { // do nothing @@ -220,16 +221,28 @@ class RoomInfoView extends React.Component { } } - getDirect = async(username) => { + createDirect = () => new Promise(async(resolve, reject) => { + const { route } = this.props; + + // We don't need to create a direct + const member = route.params?.member; + if (!_.isEmpty(member)) { + return resolve(); + } + + // TODO: Check if some direct with the user already exists on database try { + const { roomUser: { username } } = this.state; const result = await RocketChat.createDirectMessage(username); if (result.success) { - return result.room; + const { room: { rid } } = result; + return this.setState(({ room }) => ({ room: { ...room, rid } }), resolve); } } catch { // do nothing } - } + reject(); + }) goRoom = () => { const { roomUser, room } = this.state; @@ -287,9 +300,19 @@ class RoomInfoView extends React.Component { renderButton = (onPress, iconName, text) => { const { theme } = this.props; + + const onActionPress = async() => { + try { + await this.createDirect(); + onPress(); + } catch { + EventEmitter.emit(LISTENER, { message: I18n.t('error-action-not-allowed', { action: I18n.t('Create_Direct_Messages') }) }); + } + }; + return ( ( - - {this.renderButton(this.goRoom, 'message', I18n.t('Message'))} - {this.renderButton(this.videoCall, 'video-1', I18n.t('Video_call'))} - - ) + renderButtons = () => { + const { jitsiEnabled } = this.props; + return ( + + {this.renderButton(this.goRoom, 'message', I18n.t('Message'))} + {jitsiEnabled ? this.renderButton(this.videoCall, 'video-1', I18n.t('Video_call')) : null} + + ); + } renderContent = () => { const { room, roomUser } = this.state; @@ -348,7 +374,8 @@ const mapStateToProps = state => ({ baseUrl: state.server.server, user: getUserSelector(state), rooms: state.room.rooms, - isMasterDetail: state.app.isMasterDetail + isMasterDetail: state.app.isMasterDetail, + jitsiEnabled: state.settings.Jitsi_Enabled || false }); export default connect(mapStateToProps)(withTheme(RoomInfoView)); diff --git a/app/views/SettingsView/index.js b/app/views/SettingsView/index.js index 9cb3c8b057..cee79fa92a 100644 --- a/app/views/SettingsView/index.js +++ b/app/views/SettingsView/index.js @@ -5,6 +5,7 @@ import { import PropTypes from 'prop-types'; import { connect } from 'react-redux'; import AsyncStorage from '@react-native-community/async-storage'; +import FastImage from '@rocket.chat/react-native-fast-image'; import { logout as logoutAction } from '../../actions/login'; import { selectServerRequest as selectServerRequestAction } from '../../actions/server'; @@ -103,9 +104,11 @@ class SettingsView extends React.Component { const { server: { server }, appStart, selectServerRequest } = this.props; - await appStart({ root: ROOT_LOADING, text: I18n.t('Clear_cache_loading') }); + appStart({ root: ROOT_LOADING, text: I18n.t('Clear_cache_loading') }); await RocketChat.clearCache({ server }); - await selectServerRequest(server, null, true); + await FastImage.clearMemoryCache(); + await FastImage.clearDiskCache(); + selectServerRequest(server, null, true); } }); } diff --git a/app/views/ShareView/Preview.js b/app/views/ShareView/Preview.js index fae6795354..2aaff22d84 100644 --- a/app/views/ShareView/Preview.js +++ b/app/views/ShareView/Preview.js @@ -10,12 +10,13 @@ import { ImageViewer, types } from '../../presentation/ImageViewer'; import { themes } from '../../constants/colors'; import { useDimensions, useOrientation } from '../../dimensions'; import { getHeaderHeight } from '../../containers/Header'; -import { isIOS } from '../../utils/deviceInfo'; import { THUMBS_HEIGHT } from './constants'; import sharedStyles from '../Styles'; import { allowPreview } from './utils'; import I18n from '../../i18n'; +const MESSAGEBOX_HEIGHT = 56; + const styles = StyleSheet.create({ fileContainer: { alignItems: 'center', @@ -58,23 +59,24 @@ const Preview = React.memo(({ const { isLandscape } = useOrientation(); const insets = useSafeAreaInsets(); const headerHeight = getHeaderHeight(isLandscape); - const messageboxHeight = isIOS ? 56 : 0; const thumbsHeight = (length > 1) ? THUMBS_HEIGHT : 0; - const calculatedHeight = height - insets.top - insets.bottom - messageboxHeight - thumbsHeight - headerHeight; + const calculatedHeight = height - insets.top - insets.bottom - MESSAGEBOX_HEIGHT - thumbsHeight - headerHeight; if (item?.canUpload) { if (type?.match(/video/)) { return ( -