Merge branch 'develop' into fix.multiple-calls-jump-to-message
This commit is contained in:
commit
16bb5e468f
|
@ -290,6 +290,23 @@ commands:
|
||||||
command: bundle exec fastlane android beta official:<< parameters.official >>
|
command: bundle exec fastlane android beta official:<< parameters.official >>
|
||||||
working_directory: android
|
working_directory: android
|
||||||
|
|
||||||
|
# EXPERIMENTAL ONLY
|
||||||
|
upload-to-internal-app-sharing:
|
||||||
|
description: "Upload to Internal App Sharing"
|
||||||
|
steps:
|
||||||
|
- checkout
|
||||||
|
- attach_workspace:
|
||||||
|
at: android
|
||||||
|
- run:
|
||||||
|
name: Store the google service account key
|
||||||
|
command: echo "$FASTLANE_GOOGLE_SERVICE_ACCOUNT" | base64 --decode > service_account.json
|
||||||
|
working_directory: android
|
||||||
|
- run: *update-fastlane-android
|
||||||
|
- run:
|
||||||
|
name: Fastlane Play Store Upload
|
||||||
|
command: bundle exec fastlane android internal_app_sharing
|
||||||
|
working_directory: android
|
||||||
|
|
||||||
# EXPERIMENTAL ONLY
|
# EXPERIMENTAL ONLY
|
||||||
# No plans to do it for Official
|
# No plans to do it for Official
|
||||||
upload-to-google-play-production:
|
upload-to-google-play-production:
|
||||||
|
@ -391,6 +408,14 @@ jobs:
|
||||||
steps:
|
steps:
|
||||||
- android-build
|
- android-build
|
||||||
|
|
||||||
|
android-internal-app-sharing-experimental:
|
||||||
|
<<: *defaults
|
||||||
|
docker:
|
||||||
|
- image: circleci/android:api-28-node
|
||||||
|
|
||||||
|
steps:
|
||||||
|
- upload-to-internal-app-sharing
|
||||||
|
|
||||||
android-google-play-beta-experimental:
|
android-google-play-beta-experimental:
|
||||||
<<: *defaults
|
<<: *defaults
|
||||||
docker:
|
docker:
|
||||||
|
@ -452,13 +477,9 @@ workflows:
|
||||||
- ios-build-experimental:
|
- ios-build-experimental:
|
||||||
requires:
|
requires:
|
||||||
- ios-hold-build-experimental
|
- ios-hold-build-experimental
|
||||||
- ios-hold-testflight-experimental:
|
|
||||||
type: approval
|
|
||||||
requires:
|
|
||||||
- ios-build-experimental
|
|
||||||
- ios-testflight-experimental:
|
- ios-testflight-experimental:
|
||||||
requires:
|
requires:
|
||||||
- ios-hold-testflight-experimental
|
- ios-build-experimental
|
||||||
|
|
||||||
# iOS Official
|
# iOS Official
|
||||||
- ios-hold-build-official:
|
- ios-hold-build-official:
|
||||||
|
@ -484,6 +505,9 @@ workflows:
|
||||||
- android-build-experimental:
|
- android-build-experimental:
|
||||||
requires:
|
requires:
|
||||||
- android-hold-build-experimental
|
- android-hold-build-experimental
|
||||||
|
- android-internal-app-sharing-experimental:
|
||||||
|
requires:
|
||||||
|
- android-build-experimental
|
||||||
- android-hold-google-play-beta-experimental:
|
- android-hold-google-play-beta-experimental:
|
||||||
type: approval
|
type: approval
|
||||||
requires:
|
requires:
|
||||||
|
|
|
@ -144,7 +144,7 @@ android {
|
||||||
minSdkVersion rootProject.ext.minSdkVersion
|
minSdkVersion rootProject.ext.minSdkVersion
|
||||||
targetSdkVersion rootProject.ext.targetSdkVersion
|
targetSdkVersion rootProject.ext.targetSdkVersion
|
||||||
versionCode VERSIONCODE as Integer
|
versionCode VERSIONCODE as Integer
|
||||||
versionName "4.17.0"
|
versionName "4.18.0"
|
||||||
vectorDrawables.useSupportLibrary = true
|
vectorDrawables.useSupportLibrary = true
|
||||||
if (!isFoss) {
|
if (!isFoss) {
|
||||||
manifestPlaceholders = [BugsnagAPIKey: BugsnagAPIKey as String]
|
manifestPlaceholders = [BugsnagAPIKey: BugsnagAPIKey as String]
|
||||||
|
|
|
@ -33,6 +33,14 @@ platform :android do
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
|
desc "Upload App to Internal App Sharing"
|
||||||
|
lane :internal_app_sharing do
|
||||||
|
upload_to_play_store_internal_app_sharing(
|
||||||
|
package_name: 'chat.rocket.reactnative',
|
||||||
|
aab: 'android/app/build/outputs/bundle/experimentalPlayRelease/app-experimental-play-release.aab'
|
||||||
|
)
|
||||||
|
end
|
||||||
|
|
||||||
desc "Upload App to Play Store Production"
|
desc "Upload App to Play Store Production"
|
||||||
lane :production do |options|
|
lane :production do |options|
|
||||||
upload_to_play_store(
|
upload_to_play_store(
|
||||||
|
|
|
@ -12,33 +12,28 @@ Install _fastlane_ using
|
||||||
```
|
```
|
||||||
[sudo] gem install fastlane -NV
|
[sudo] gem install fastlane -NV
|
||||||
```
|
```
|
||||||
or alternatively using `brew cask install fastlane`
|
or alternatively using `brew install fastlane`
|
||||||
|
|
||||||
# Available Actions
|
# Available Actions
|
||||||
## Android
|
## Android
|
||||||
### android playBuild
|
### android beta
|
||||||
```
|
```
|
||||||
fastlane android playBuild
|
fastlane android beta
|
||||||
```
|
```
|
||||||
Play build for development
|
Upload App to Play Store Internal
|
||||||
### android fossRelease
|
### android internal_app_sharing
|
||||||
```
|
```
|
||||||
fastlane android fossRelease
|
fastlane android internal_app_sharing
|
||||||
```
|
```
|
||||||
Foss build for release
|
Upload App to Internal App Sharing
|
||||||
### android playRelease
|
### android production
|
||||||
```
|
```
|
||||||
fastlane android playRelease
|
fastlane android production
|
||||||
```
|
```
|
||||||
Play build for release
|
Upload App to Play Store Production
|
||||||
### android playAlpha
|
|
||||||
```
|
|
||||||
fastlane android playAlpha
|
|
||||||
```
|
|
||||||
Upload App to Play store
|
|
||||||
|
|
||||||
----
|
----
|
||||||
|
|
||||||
This README.md is auto-generated and will be re-generated every time [fastlane](https://fastlane.tools) is run.
|
This README.md is auto-generated and will be re-generated every time [_fastlane_](https://fastlane.tools) is run.
|
||||||
More information about fastlane can be found on [fastlane.tools](https://fastlane.tools).
|
More information about fastlane can be found on [fastlane.tools](https://fastlane.tools).
|
||||||
The documentation of fastlane can be found on [docs.fastlane.tools](https://docs.fastlane.tools).
|
The documentation of fastlane can be found on [docs.fastlane.tools](https://docs.fastlane.tools).
|
||||||
|
|
|
@ -7,15 +7,19 @@ import { themes } from '../../constants/colors';
|
||||||
import { LISTENER } from '../Toast';
|
import { LISTENER } from '../Toast';
|
||||||
import EventEmitter from '../../utils/events';
|
import EventEmitter from '../../utils/events';
|
||||||
import I18n from '../../i18n';
|
import I18n from '../../i18n';
|
||||||
|
import openLink from '../../utils/openLink';
|
||||||
|
|
||||||
const Link = React.memo(({
|
const Link = React.memo(({
|
||||||
children, link, theme, onLinkPress
|
children, link, theme, onLinkPress
|
||||||
}) => {
|
}) => {
|
||||||
const handlePress = () => {
|
const handlePress = () => {
|
||||||
if (!link || !onLinkPress) {
|
if (!link) {
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
onLinkPress(link);
|
if (onLinkPress) {
|
||||||
|
return onLinkPress(link);
|
||||||
|
}
|
||||||
|
openLink(link, theme);
|
||||||
};
|
};
|
||||||
|
|
||||||
const childLength = React.Children.toArray(children).filter(o => o).length;
|
const childLength = React.Children.toArray(children).filter(o => o).length;
|
||||||
|
|
|
@ -387,7 +387,6 @@
|
||||||
"Preferences_saved": "تم حفظ التفضيلات",
|
"Preferences_saved": "تم حفظ التفضيلات",
|
||||||
"Privacy_Policy": "سياسة الخصوصية",
|
"Privacy_Policy": "سياسة الخصوصية",
|
||||||
"Private_Channel": "قناة خاصة",
|
"Private_Channel": "قناة خاصة",
|
||||||
"Private_Groups": "مجموعات خاصة",
|
|
||||||
"Private": "خاص",
|
"Private": "خاص",
|
||||||
"Processing": "جار معالجة...",
|
"Processing": "جار معالجة...",
|
||||||
"Profile_saved_successfully": "تم حفظ الملف الشخصي بنجاح!",
|
"Profile_saved_successfully": "تم حفظ الملف الشخصي بنجاح!",
|
||||||
|
|
|
@ -400,7 +400,6 @@
|
||||||
"Preferences_saved": "Einstellungen gespeichert!",
|
"Preferences_saved": "Einstellungen gespeichert!",
|
||||||
"Privacy_Policy": " Datenschutzbestimmungen",
|
"Privacy_Policy": " Datenschutzbestimmungen",
|
||||||
"Private_Channel": "Privater Kanal",
|
"Private_Channel": "Privater Kanal",
|
||||||
"Private_Groups": "Private Gruppen",
|
|
||||||
"Private": "Privat",
|
"Private": "Privat",
|
||||||
"Processing": "Bearbeite …",
|
"Processing": "Bearbeite …",
|
||||||
"Profile_saved_successfully": "Profil erfolgreich gespeichert!",
|
"Profile_saved_successfully": "Profil erfolgreich gespeichert!",
|
||||||
|
|
|
@ -400,7 +400,6 @@
|
||||||
"Preferences_saved": "Preferences saved!",
|
"Preferences_saved": "Preferences saved!",
|
||||||
"Privacy_Policy": " Privacy Policy",
|
"Privacy_Policy": " Privacy Policy",
|
||||||
"Private_Channel": "Private Channel",
|
"Private_Channel": "Private Channel",
|
||||||
"Private_Groups": "Private Groups",
|
|
||||||
"Private": "Private",
|
"Private": "Private",
|
||||||
"Processing": "Processing...",
|
"Processing": "Processing...",
|
||||||
"Profile_saved_successfully": "Profile saved successfully!",
|
"Profile_saved_successfully": "Profile saved successfully!",
|
||||||
|
@ -756,7 +755,7 @@
|
||||||
"member-does-not-exist": "Member does not exist",
|
"member-does-not-exist": "Member does not exist",
|
||||||
"Convert": "Convert",
|
"Convert": "Convert",
|
||||||
"Convert_to_Team": "Convert to Team",
|
"Convert_to_Team": "Convert to Team",
|
||||||
"Convert_to_Team_Warning": "This can't be undone. Once you convert a channel to a team, you can not turn it back to a channel.",
|
"Convert_to_Team_Warning": "You are converting this Channel to a Team. All Members will be kept.",
|
||||||
"Move_to_Team": "Move to Team",
|
"Move_to_Team": "Move to Team",
|
||||||
"Move_Channel_Paragraph": "Moving a channel inside a team means that this channel will be added in the team’s context, however, all channel’s members, which are not members of the respective team, will still have access to this channel, but will not be added as team’s members. \n\nAll channel’s management will still be made by the owners of this channel.\n\nTeam’s members and even team’s owners, if not a member of this channel, can not have access to the channel’s content. \n\nPlease notice that the Team’s owner will be able remove members from the Channel.",
|
"Move_Channel_Paragraph": "Moving a channel inside a team means that this channel will be added in the team’s context, however, all channel’s members, which are not members of the respective team, will still have access to this channel, but will not be added as team’s members. \n\nAll channel’s management will still be made by the owners of this channel.\n\nTeam’s members and even team’s owners, if not a member of this channel, can not have access to the channel’s content. \n\nPlease notice that the Team’s owner will be able remove members from the Channel.",
|
||||||
"Move_to_Team_Warning": "After reading the previous intructions about this behavior, do you still want to move this channel to the selected team?",
|
"Move_to_Team_Warning": "After reading the previous intructions about this behavior, do you still want to move this channel to the selected team?",
|
||||||
|
@ -765,5 +764,9 @@
|
||||||
"Load_Older": "Load Older",
|
"Load_Older": "Load Older",
|
||||||
"Left_The_Room_Successfully": "Left the room successfully",
|
"Left_The_Room_Successfully": "Left the room successfully",
|
||||||
"Deleted_The_Team_Successfully": "Team deleted successfully",
|
"Deleted_The_Team_Successfully": "Team deleted successfully",
|
||||||
"Deleted_The_Room_Successfully": "Room deleted successfully"
|
"Deleted_The_Room_Successfully": "Room deleted successfully",
|
||||||
|
"Convert_to_Channel": "Convert to Channel",
|
||||||
|
"Converting_Team_To_Channel": "Converting Team to Channel",
|
||||||
|
"Select_Team_Channels_To_Delete": "Select the Team’s Channels you would like to delete, the ones you do not select will be moved to the Workspace. \n\nNotice that public Channels will be public and visible to everyone.",
|
||||||
|
"You_are_converting_the_team": "You are converting this Team to a Channel"
|
||||||
}
|
}
|
|
@ -280,7 +280,6 @@
|
||||||
"Preferences_saved": "¡Preferencias guardadas!",
|
"Preferences_saved": "¡Preferencias guardadas!",
|
||||||
"Privacy_Policy": "Política de privacidad",
|
"Privacy_Policy": "Política de privacidad",
|
||||||
"Private_Channel": "Canal privado",
|
"Private_Channel": "Canal privado",
|
||||||
"Private_Groups": "Grupos privados",
|
|
||||||
"Private": "Privado",
|
"Private": "Privado",
|
||||||
"Processing": "Procesando...",
|
"Processing": "Procesando...",
|
||||||
"Profile_saved_successfully": "¡Perfil guardado correctamente!",
|
"Profile_saved_successfully": "¡Perfil guardado correctamente!",
|
||||||
|
|
|
@ -400,7 +400,6 @@
|
||||||
"Preferences_saved": "Préférences sauvegardées !",
|
"Preferences_saved": "Préférences sauvegardées !",
|
||||||
"Privacy_Policy": " Politique de confidentialité",
|
"Privacy_Policy": " Politique de confidentialité",
|
||||||
"Private_Channel": "Canal privé",
|
"Private_Channel": "Canal privé",
|
||||||
"Private_Groups": "Groupes privés",
|
|
||||||
"Private": "Privé",
|
"Private": "Privé",
|
||||||
"Processing": "Traitement...",
|
"Processing": "Traitement...",
|
||||||
"Profile_saved_successfully": "Profil enregistré avec succès !",
|
"Profile_saved_successfully": "Profil enregistré avec succès !",
|
||||||
|
@ -756,7 +755,7 @@
|
||||||
"member-does-not-exist": "Le membre n'existe pas",
|
"member-does-not-exist": "Le membre n'existe pas",
|
||||||
"Convert": "Convertir",
|
"Convert": "Convertir",
|
||||||
"Convert_to_Team": "Convertir en équipe",
|
"Convert_to_Team": "Convertir en équipe",
|
||||||
"Convert_to_Team_Warning": "Ceci ne peut pas être annulé. Une fois que vous avez converti un canal en équipe, vous ne pouvez pas le retransformer en canal.",
|
"Convert_to_Team_Warning": "Vous convertissez ce canal en équipe. Tous les membres seront conservés.",
|
||||||
"Move_to_Team": "Déplacer vers l'équipe",
|
"Move_to_Team": "Déplacer vers l'équipe",
|
||||||
"Move_Channel_Paragraph": "Le déplacement d'un canal dans une équipe signifie que ce canal sera ajouté dans le contexte d'équipe. Cependant, tous les membres du canal, qui ne sont pas membres de l'équipe respective, auront toujours accès à ce canal, mais ne seront pas ajoutés comme membres de l'équipe.\n\nLa gestion de tout le canal sera toujours assurée par les propriétaires de ce canal.\n\nLes membres de l'équipe et même les propriétaires de l'équipe, s'ils ne sont pas membres de ce canal, ne peuvent pas avoir accès au contenu du canal.\n\nVeuillez noter que le propriétaire de l'équipe pourra supprimer des membres du canal.",
|
"Move_Channel_Paragraph": "Le déplacement d'un canal dans une équipe signifie que ce canal sera ajouté dans le contexte d'équipe. Cependant, tous les membres du canal, qui ne sont pas membres de l'équipe respective, auront toujours accès à ce canal, mais ne seront pas ajoutés comme membres de l'équipe.\n\nLa gestion de tout le canal sera toujours assurée par les propriétaires de ce canal.\n\nLes membres de l'équipe et même les propriétaires de l'équipe, s'ils ne sont pas membres de ce canal, ne peuvent pas avoir accès au contenu du canal.\n\nVeuillez noter que le propriétaire de l'équipe pourra supprimer des membres du canal.",
|
||||||
"Move_to_Team_Warning": "Après avoir lu les instructions précédentes sur ce comportement, voulez-vous toujours déplacer ce canal vers l'équipe sélectionnée ?",
|
"Move_to_Team_Warning": "Après avoir lu les instructions précédentes sur ce comportement, voulez-vous toujours déplacer ce canal vers l'équipe sélectionnée ?",
|
||||||
|
@ -765,5 +764,9 @@
|
||||||
"Load_Older": "Charger plus ancien",
|
"Load_Older": "Charger plus ancien",
|
||||||
"Left_The_Room_Successfully": "A quitté le salon avec succès",
|
"Left_The_Room_Successfully": "A quitté le salon avec succès",
|
||||||
"Deleted_The_Team_Successfully": "Equipe supprimée avec succès",
|
"Deleted_The_Team_Successfully": "Equipe supprimée avec succès",
|
||||||
"Deleted_The_Room_Successfully": "Salon supprimé avec succès"
|
"Deleted_The_Room_Successfully": "Salon supprimé avec succès",
|
||||||
|
"Convert_to_Channel": "Convertir en canal",
|
||||||
|
"Converting_Team_To_Channel": "Conversion de l’équipe en canal",
|
||||||
|
"Select_Team_Channels_To_Delete": "Sélectionnez les canaux de l'équipe que vous souhaitez supprimer, ceux que vous ne sélectionnez pas, seront déplacés vers l'espace de travail. \n\n\nNotez que les canaux publics seront publics et visibles par tous.",
|
||||||
|
"You_are_converting_the_team": "Vous convertissez cette équipe en canal"
|
||||||
}
|
}
|
|
@ -392,7 +392,6 @@
|
||||||
"Preferences_saved": "Impostazioni salvate!",
|
"Preferences_saved": "Impostazioni salvate!",
|
||||||
"Privacy_Policy": " Privacy Policy",
|
"Privacy_Policy": " Privacy Policy",
|
||||||
"Private_Channel": "Canale privato",
|
"Private_Channel": "Canale privato",
|
||||||
"Private_Groups": "Gruppi privati",
|
|
||||||
"Private": "Privato",
|
"Private": "Privato",
|
||||||
"Processing": "Elaborazione...",
|
"Processing": "Elaborazione...",
|
||||||
"Profile_saved_successfully": "Profilo salvato correttamente!",
|
"Profile_saved_successfully": "Profilo salvato correttamente!",
|
||||||
|
|
|
@ -296,7 +296,6 @@
|
||||||
"Preferences_saved": "設定が保存されました。",
|
"Preferences_saved": "設定が保存されました。",
|
||||||
"Privacy_Policy": " プライバシーポリシー",
|
"Privacy_Policy": " プライバシーポリシー",
|
||||||
"Private_Channel": "プライベートチャンネル",
|
"Private_Channel": "プライベートチャンネル",
|
||||||
"Private_Groups": "プライベートグループ",
|
|
||||||
"Private": "プライベート",
|
"Private": "プライベート",
|
||||||
"Processing": "処理中...",
|
"Processing": "処理中...",
|
||||||
"Profile_saved_successfully": "プロフィールが保存されました!",
|
"Profile_saved_successfully": "プロフィールが保存されました!",
|
||||||
|
|
|
@ -400,7 +400,6 @@
|
||||||
"Preferences_saved": "Voorkeuren opgeslagen!",
|
"Preferences_saved": "Voorkeuren opgeslagen!",
|
||||||
"Privacy_Policy": " Privacybeleid",
|
"Privacy_Policy": " Privacybeleid",
|
||||||
"Private_Channel": "Privékanaal",
|
"Private_Channel": "Privékanaal",
|
||||||
"Private_Groups": "Privé groepen",
|
|
||||||
"Private": "Privé",
|
"Private": "Privé",
|
||||||
"Processing": "Verwerking...",
|
"Processing": "Verwerking...",
|
||||||
"Profile_saved_successfully": "Profiel succesvol opgeslagen!",
|
"Profile_saved_successfully": "Profiel succesvol opgeslagen!",
|
||||||
|
@ -756,7 +755,7 @@
|
||||||
"member-does-not-exist": "Lid bestaat niet",
|
"member-does-not-exist": "Lid bestaat niet",
|
||||||
"Convert": "Converteren",
|
"Convert": "Converteren",
|
||||||
"Convert_to_Team": "Converteren naar team",
|
"Convert_to_Team": "Converteren naar team",
|
||||||
"Convert_to_Team_Warning": "Dit kan niet ongedaan worden gemaakt. Eens je een kanaal naar een team hebt geconverteerd, kun je het niet meer naar een kanaal terugzetten.",
|
"Convert_to_Team_Warning": "Je converteert dit kanaal naar een team. Alle leden blijven behouden.",
|
||||||
"Move_to_Team": "Verplaats naar team",
|
"Move_to_Team": "Verplaats naar team",
|
||||||
"Move_Channel_Paragraph": "Het verplaatsen van een kanaal binnen een team betekent dat dit kanaal wordt toegevoegd in de context van het team. Maar, alle leden van dit kanaal, die geen lid zijn van het respectieve team, zullen nog steeds toegang hebben tot dit kanaal, maar worden niet als teamleden toegevoegd.\n\nHet volledige beheer van dit kanaal wordt nog steeds door de eigenaren van dit kanaal gedaan.\n\nTeamleden en zelfs teameigenaren, wanneer ze geen lid zijn van dit kanaal, hebben geen toegang tot de content van het kanaal.\n\nHou er rekening mee dat de eigenaar van het team de leden uit het kanaal kan verwijderen.",
|
"Move_Channel_Paragraph": "Het verplaatsen van een kanaal binnen een team betekent dat dit kanaal wordt toegevoegd in de context van het team. Maar, alle leden van dit kanaal, die geen lid zijn van het respectieve team, zullen nog steeds toegang hebben tot dit kanaal, maar worden niet als teamleden toegevoegd.\n\nHet volledige beheer van dit kanaal wordt nog steeds door de eigenaren van dit kanaal gedaan.\n\nTeamleden en zelfs teameigenaren, wanneer ze geen lid zijn van dit kanaal, hebben geen toegang tot de content van het kanaal.\n\nHou er rekening mee dat de eigenaar van het team de leden uit het kanaal kan verwijderen.",
|
||||||
"Move_to_Team_Warning": "Wil je na het lezen van de vorige instructies over dit gedrag, dit kanaal nog steeds naar het geselecteerde team verplaatsen?",
|
"Move_to_Team_Warning": "Wil je na het lezen van de vorige instructies over dit gedrag, dit kanaal nog steeds naar het geselecteerde team verplaatsen?",
|
||||||
|
@ -765,5 +764,9 @@
|
||||||
"Load_Older": "Ouder laden",
|
"Load_Older": "Ouder laden",
|
||||||
"Left_The_Room_Successfully": "Heeft kamer met succes verlaten",
|
"Left_The_Room_Successfully": "Heeft kamer met succes verlaten",
|
||||||
"Deleted_The_Team_Successfully": "Team succesvol verwijderd",
|
"Deleted_The_Team_Successfully": "Team succesvol verwijderd",
|
||||||
"Deleted_The_Room_Successfully": "Kamer succesvol verwijderd"
|
"Deleted_The_Room_Successfully": "Kamer succesvol verwijderd",
|
||||||
|
"Convert_to_Channel": "Converteren naar kanaal",
|
||||||
|
"Converting_Team_To_Channel": "Team converteren naar kanaal",
|
||||||
|
"Select_Team_Channels_To_Delete": "Selecteer de teamkanalen die je wilt verwijderen, de kanalen die u niet selecteert, worden naar de werkruimte verplaatst.\n\nMerk op dat openbare kanalen openbaar en voor iedereen zichtbaar zullen zijn.",
|
||||||
|
"You_are_converting_the_team": "Je converteert dit team naar een kanaal"
|
||||||
}
|
}
|
|
@ -370,7 +370,6 @@
|
||||||
"Preferences_saved": "Preferências salvas!",
|
"Preferences_saved": "Preferências salvas!",
|
||||||
"Privacy_Policy": " Política de Privacidade",
|
"Privacy_Policy": " Política de Privacidade",
|
||||||
"Private_Channel": "Canal Privado",
|
"Private_Channel": "Canal Privado",
|
||||||
"Private_Groups": "Grupo Privado",
|
|
||||||
"Private": "Privado",
|
"Private": "Privado",
|
||||||
"Processing": "Processando...",
|
"Processing": "Processando...",
|
||||||
"Profile_saved_successfully": "Perfil salvo com sucesso!",
|
"Profile_saved_successfully": "Perfil salvo com sucesso!",
|
||||||
|
@ -669,5 +668,6 @@
|
||||||
"invalid-room": "Sala inválida",
|
"invalid-room": "Sala inválida",
|
||||||
"Left_The_Room_Successfully": "Saiu da sala com sucesso",
|
"Left_The_Room_Successfully": "Saiu da sala com sucesso",
|
||||||
"Deleted_The_Team_Successfully": "Time deletado com sucesso",
|
"Deleted_The_Team_Successfully": "Time deletado com sucesso",
|
||||||
"Deleted_The_Room_Successfully": "Sala deletada com sucesso"
|
"Deleted_The_Room_Successfully": "Sala deletada com sucesso",
|
||||||
|
"Convert_to_Channel": "Converter para um Canal"
|
||||||
}
|
}
|
|
@ -399,7 +399,6 @@
|
||||||
"Preferences_saved": "Preferências guardadas!",
|
"Preferences_saved": "Preferências guardadas!",
|
||||||
"Privacy_Policy": " Política de Privacidade",
|
"Privacy_Policy": " Política de Privacidade",
|
||||||
"Private_Channel": "Canal Privado",
|
"Private_Channel": "Canal Privado",
|
||||||
"Private_Groups": "Grupos Privados",
|
|
||||||
"Private": "Privado",
|
"Private": "Privado",
|
||||||
"Processing": "A processar...",
|
"Processing": "A processar...",
|
||||||
"Profile_saved_successfully": "Perfil actualizado com sucesso!",
|
"Profile_saved_successfully": "Perfil actualizado com sucesso!",
|
||||||
|
|
|
@ -400,7 +400,6 @@
|
||||||
"Preferences_saved": "Настройки сохранены!",
|
"Preferences_saved": "Настройки сохранены!",
|
||||||
"Privacy_Policy": " Политика конфиденциальности",
|
"Privacy_Policy": " Политика конфиденциальности",
|
||||||
"Private_Channel": "Приватный канал",
|
"Private_Channel": "Приватный канал",
|
||||||
"Private_Groups": "Приватные группы",
|
|
||||||
"Private": "Приватный",
|
"Private": "Приватный",
|
||||||
"Processing": "Обработка...",
|
"Processing": "Обработка...",
|
||||||
"Profile_saved_successfully": "Профиль успешно сохранен!",
|
"Profile_saved_successfully": "Профиль успешно сохранен!",
|
||||||
|
|
|
@ -393,7 +393,6 @@
|
||||||
"Preferences_saved": "Tercihler kaydedildi!",
|
"Preferences_saved": "Tercihler kaydedildi!",
|
||||||
"Privacy_Policy": " Privacy Policy",
|
"Privacy_Policy": " Privacy Policy",
|
||||||
"Private_Channel": "Özel Kanal",
|
"Private_Channel": "Özel Kanal",
|
||||||
"Private_Groups": "Özel Gruplar",
|
|
||||||
"Private": "Özel",
|
"Private": "Özel",
|
||||||
"Processing": "İşleniyor...",
|
"Processing": "İşleniyor...",
|
||||||
"Profile_saved_successfully": "Profil başarıyla kaydedildi!",
|
"Profile_saved_successfully": "Profil başarıyla kaydedildi!",
|
||||||
|
|
|
@ -390,7 +390,6 @@
|
||||||
"Preferences_saved": "偏好已保存!",
|
"Preferences_saved": "偏好已保存!",
|
||||||
"Privacy_Policy": "隐私政策",
|
"Privacy_Policy": "隐私政策",
|
||||||
"Private_Channel": "私人频道",
|
"Private_Channel": "私人频道",
|
||||||
"Private_Groups": "私人群组",
|
|
||||||
"Private": "私有的",
|
"Private": "私有的",
|
||||||
"Processing": "处理中",
|
"Processing": "处理中",
|
||||||
"Profile_saved_successfully": "个人资料保存成功!",
|
"Profile_saved_successfully": "个人资料保存成功!",
|
||||||
|
|
|
@ -391,7 +391,6 @@
|
||||||
"Preferences_saved": "偏好設定已被儲存!",
|
"Preferences_saved": "偏好設定已被儲存!",
|
||||||
"Privacy_Policy": "隱私政策",
|
"Privacy_Policy": "隱私政策",
|
||||||
"Private_Channel": "私人頻道",
|
"Private_Channel": "私人頻道",
|
||||||
"Private_Groups": "私人群組",
|
|
||||||
"Private": "私有的",
|
"Private": "私有的",
|
||||||
"Processing": "處理中",
|
"Processing": "處理中",
|
||||||
"Profile_saved_successfully": "個人資料儲存成功!",
|
"Profile_saved_successfully": "個人資料儲存成功!",
|
||||||
|
|
|
@ -75,7 +75,7 @@ export default class Root extends React.Component {
|
||||||
theme: defaultTheme(),
|
theme: defaultTheme(),
|
||||||
themePreferences: {
|
themePreferences: {
|
||||||
currentTheme: supportSystemTheme() ? 'automatic' : 'light',
|
currentTheme: supportSystemTheme() ? 'automatic' : 'light',
|
||||||
darkLevel: 'dark'
|
darkLevel: 'black'
|
||||||
},
|
},
|
||||||
width,
|
width,
|
||||||
height,
|
height,
|
||||||
|
|
|
@ -47,7 +47,8 @@ const PERMISSIONS = [
|
||||||
'view-statistics',
|
'view-statistics',
|
||||||
'view-user-administration',
|
'view-user-administration',
|
||||||
'view-all-teams',
|
'view-all-teams',
|
||||||
'view-all-team-channels'
|
'view-all-team-channels',
|
||||||
|
'convert-team'
|
||||||
];
|
];
|
||||||
|
|
||||||
export async function setPermissions() {
|
export async function setPermissions() {
|
||||||
|
|
|
@ -131,12 +131,17 @@ export async function setSettings() {
|
||||||
reduxStore.dispatch(addSettings(RocketChat.parseSettings(parsed.slice(0, parsed.length))));
|
reduxStore.dispatch(addSettings(RocketChat.parseSettings(parsed.slice(0, parsed.length))));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
export function subscribeSettings() {
|
||||||
|
return RocketChat.subscribe('stream-notify-all', 'public-settings-changed');
|
||||||
|
}
|
||||||
|
|
||||||
export default async function() {
|
export default async function() {
|
||||||
try {
|
try {
|
||||||
const db = database.active;
|
const db = database.active;
|
||||||
const settingsParams = JSON.stringify(Object.keys(settings).filter(key => !loginSettings.includes(key)));
|
const settingsParams = Object.keys(settings).filter(key => !loginSettings.includes(key));
|
||||||
// RC 0.60.0
|
// RC 0.60.0
|
||||||
const result = await fetch(`${ this.sdk.client.host }/api/v1/settings.public?query={"_id":{"$in":${ settingsParams }}}`).then(response => response.json());
|
const result = await fetch(`${ this.sdk.client.host }/api/v1/settings.public?query={"_id":{"$in":${ JSON.stringify(settingsParams) }}}&count=${ settingsParams.length }`)
|
||||||
|
.then(response => response.json());
|
||||||
|
|
||||||
if (!result.success) {
|
if (!result.success) {
|
||||||
return;
|
return;
|
||||||
|
@ -146,7 +151,6 @@ export default async function() {
|
||||||
const filteredSettingsIds = filteredSettings.map(s => s._id);
|
const filteredSettingsIds = filteredSettings.map(s => s._id);
|
||||||
|
|
||||||
reduxStore.dispatch(addSettings(this.parseSettings(filteredSettings)));
|
reduxStore.dispatch(addSettings(this.parseSettings(filteredSettings)));
|
||||||
RocketChat.subscribe('stream-notify-all', 'public-settings-changed');
|
|
||||||
|
|
||||||
// filter server info
|
// filter server info
|
||||||
const serverInfo = filteredSettings.filter(i1 => serverInfoKeys.includes(i1._id));
|
const serverInfo = filteredSettings.filter(i1 => serverInfoKeys.includes(i1._id));
|
||||||
|
|
|
@ -28,7 +28,7 @@ import getUsersPresence, { getUserPresence, subscribeUsersPresence } from './met
|
||||||
|
|
||||||
import protectedFunction from './methods/helpers/protectedFunction';
|
import protectedFunction from './methods/helpers/protectedFunction';
|
||||||
import readMessages from './methods/readMessages';
|
import readMessages from './methods/readMessages';
|
||||||
import getSettings, { getLoginSettings, setSettings } from './methods/getSettings';
|
import getSettings, { getLoginSettings, setSettings, subscribeSettings } from './methods/getSettings';
|
||||||
|
|
||||||
import getRooms from './methods/getRooms';
|
import getRooms from './methods/getRooms';
|
||||||
import { setPermissions, getPermissions } from './methods/getPermissions';
|
import { setPermissions, getPermissions } from './methods/getPermissions';
|
||||||
|
@ -866,6 +866,13 @@ const RocketChat = {
|
||||||
};
|
};
|
||||||
return this.sdk.post(type === 'c' ? 'channels.convertToTeam' : 'groups.convertToTeam', params);
|
return this.sdk.post(type === 'c' ? 'channels.convertToTeam' : 'groups.convertToTeam', params);
|
||||||
},
|
},
|
||||||
|
convertTeamToChannel({ teamId, selected }) {
|
||||||
|
const params = {
|
||||||
|
teamId,
|
||||||
|
...(selected.length && { roomsToRemove: selected })
|
||||||
|
};
|
||||||
|
return this.sdk.post('teams.convertToChannel', params);
|
||||||
|
},
|
||||||
joinRoom(roomId, joinCode, type) {
|
joinRoom(roomId, joinCode, type) {
|
||||||
// TODO: join code
|
// TODO: join code
|
||||||
// RC 0.48.0
|
// RC 0.48.0
|
||||||
|
@ -883,6 +890,7 @@ const RocketChat = {
|
||||||
getSettings,
|
getSettings,
|
||||||
getLoginSettings,
|
getLoginSettings,
|
||||||
setSettings,
|
setSettings,
|
||||||
|
subscribeSettings,
|
||||||
getPermissions,
|
getPermissions,
|
||||||
setPermissions,
|
setPermissions,
|
||||||
getCustomEmojis,
|
getCustomEmojis,
|
||||||
|
|
|
@ -41,10 +41,10 @@ const handleRequest = function* handleRequest({ data }) {
|
||||||
encrypted
|
encrypted
|
||||||
} = data;
|
} = data;
|
||||||
logEvent(events.CT_CREATE, {
|
logEvent(events.CT_CREATE, {
|
||||||
type,
|
type: `${ type }`,
|
||||||
readOnly,
|
readOnly: `${ readOnly }`,
|
||||||
broadcast,
|
broadcast: `${ broadcast }`,
|
||||||
encrypted
|
encrypted: `${ encrypted }`
|
||||||
});
|
});
|
||||||
const result = yield call(createTeam, data);
|
const result = yield call(createTeam, data);
|
||||||
sub = {
|
sub = {
|
||||||
|
|
|
@ -80,6 +80,10 @@ const handleLoginRequest = function* handleLoginRequest({ credentials, logoutOnE
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
|
const subscribeSettings = function* subscribeSettings() {
|
||||||
|
yield RocketChat.subscribeSettings();
|
||||||
|
};
|
||||||
|
|
||||||
const fetchPermissions = function* fetchPermissions() {
|
const fetchPermissions = function* fetchPermissions() {
|
||||||
yield RocketChat.getPermissions();
|
yield RocketChat.getPermissions();
|
||||||
};
|
};
|
||||||
|
@ -133,6 +137,7 @@ const handleLoginSuccess = function* handleLoginSuccess({ user }) {
|
||||||
yield fork(registerPushToken);
|
yield fork(registerPushToken);
|
||||||
yield fork(fetchUsersPresence);
|
yield fork(fetchUsersPresence);
|
||||||
yield fork(fetchEnterpriseModules, { user });
|
yield fork(fetchEnterpriseModules, { user });
|
||||||
|
yield fork(subscribeSettings);
|
||||||
yield put(encryptionInit());
|
yield put(encryptionInit());
|
||||||
|
|
||||||
setLanguage(user?.language);
|
setLanguage(user?.language);
|
||||||
|
|
|
@ -124,7 +124,7 @@ class Root extends React.Component {
|
||||||
theme: defaultTheme(),
|
theme: defaultTheme(),
|
||||||
themePreferences: {
|
themePreferences: {
|
||||||
currentTheme: supportSystemTheme() ? 'automatic' : 'light',
|
currentTheme: supportSystemTheme() ? 'automatic' : 'light',
|
||||||
darkLevel: 'dark'
|
darkLevel: 'black'
|
||||||
},
|
},
|
||||||
root: '',
|
root: '',
|
||||||
width,
|
width,
|
||||||
|
|
|
@ -259,6 +259,8 @@ export default {
|
||||||
RA_LEAVE_TEAM_F: 'ra_leave_team_f',
|
RA_LEAVE_TEAM_F: 'ra_leave_team_f',
|
||||||
RA_CONVERT_TO_TEAM: 'ra_convert_to_team',
|
RA_CONVERT_TO_TEAM: 'ra_convert_to_team',
|
||||||
RA_CONVERT_TO_TEAM_F: 'ra_convert_to_team_f',
|
RA_CONVERT_TO_TEAM_F: 'ra_convert_to_team_f',
|
||||||
|
RA_CONVERT_TEAM_TO_CHANNEL: 'ra_convert_team_to_channel',
|
||||||
|
RA_CONVERT_TEAM_TO_CHANNEL_F: 'ra_convert_team_to_channel_f',
|
||||||
RA_MOVE_TO_TEAM: 'ra_move_to_team',
|
RA_MOVE_TO_TEAM: 'ra_move_to_team',
|
||||||
RA_MOVE_TO_TEAM_F: 'ra_move_to_team_f',
|
RA_MOVE_TO_TEAM_F: 'ra_move_to_team_f',
|
||||||
RA_SEARCH_TEAM: 'ra_search_team',
|
RA_SEARCH_TEAM: 'ra_search_team',
|
||||||
|
|
|
@ -39,16 +39,16 @@ const openLink = async(url, theme = 'light') => {
|
||||||
try {
|
try {
|
||||||
const browser = await UserPreferences.getStringAsync(DEFAULT_BROWSER_KEY);
|
const browser = await UserPreferences.getStringAsync(DEFAULT_BROWSER_KEY);
|
||||||
|
|
||||||
if (browser) {
|
if (browser === 'inApp') {
|
||||||
const schemeUrl = appSchemeURL(url, browser.replace(':', ''));
|
|
||||||
await Linking.openURL(schemeUrl);
|
|
||||||
} else {
|
|
||||||
await WebBrowser.openBrowserAsync(url, {
|
await WebBrowser.openBrowserAsync(url, {
|
||||||
toolbarColor: themes[theme].headerBackground,
|
toolbarColor: themes[theme].headerBackground,
|
||||||
controlsColor: themes[theme].headerTintColor,
|
controlsColor: themes[theme].headerTintColor,
|
||||||
collapseToolbar: true,
|
collapseToolbar: true,
|
||||||
showTitle: true
|
showTitle: true
|
||||||
});
|
});
|
||||||
|
} else {
|
||||||
|
const schemeUrl = appSchemeURL(url, browser.replace(':', ''));
|
||||||
|
await Linking.openURL(schemeUrl);
|
||||||
}
|
}
|
||||||
} catch {
|
} catch {
|
||||||
try {
|
try {
|
||||||
|
|
|
@ -83,7 +83,7 @@ class DefaultBrowserView extends React.Component {
|
||||||
|
|
||||||
isSelected = (value) => {
|
isSelected = (value) => {
|
||||||
const { browser } = this.state;
|
const { browser } = this.state;
|
||||||
if (!browser && value === 'inApp') {
|
if (!browser && value === 'systemDefault:') {
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
return browser === value;
|
return browser === value;
|
||||||
|
@ -92,7 +92,7 @@ class DefaultBrowserView extends React.Component {
|
||||||
changeDefaultBrowser = async(newBrowser) => {
|
changeDefaultBrowser = async(newBrowser) => {
|
||||||
logEvent(events.DB_CHANGE_DEFAULT_BROWSER, { browser: newBrowser });
|
logEvent(events.DB_CHANGE_DEFAULT_BROWSER, { browser: newBrowser });
|
||||||
try {
|
try {
|
||||||
const browser = newBrowser !== 'inApp' ? newBrowser : null;
|
const browser = newBrowser !== 'systemDefault:' ? newBrowser : null;
|
||||||
await UserPreferences.setStringAsync(DEFAULT_BROWSER_KEY, browser);
|
await UserPreferences.setStringAsync(DEFAULT_BROWSER_KEY, browser);
|
||||||
this.setState({ browser });
|
this.setState({ browser });
|
||||||
} catch {
|
} catch {
|
||||||
|
|
|
@ -67,7 +67,8 @@ class RoomActionsView extends React.Component {
|
||||||
viewBroadcastMemberListPermission: PropTypes.array,
|
viewBroadcastMemberListPermission: PropTypes.array,
|
||||||
transferLivechatGuestPermission: PropTypes.array,
|
transferLivechatGuestPermission: PropTypes.array,
|
||||||
createTeamPermission: PropTypes.array,
|
createTeamPermission: PropTypes.array,
|
||||||
addTeamChannelPermission: PropTypes.array
|
addTeamChannelPermission: PropTypes.array,
|
||||||
|
convertTeamPermission: PropTypes.array
|
||||||
}
|
}
|
||||||
|
|
||||||
constructor(props) {
|
constructor(props) {
|
||||||
|
@ -91,7 +92,8 @@ class RoomActionsView extends React.Component {
|
||||||
canEdit: false,
|
canEdit: false,
|
||||||
canToggleEncryption: false,
|
canToggleEncryption: false,
|
||||||
canCreateTeam: false,
|
canCreateTeam: false,
|
||||||
canAddChannelToTeam: false
|
canAddChannelToTeam: false,
|
||||||
|
canConvertTeam: false
|
||||||
};
|
};
|
||||||
if (room && room.observe && room.rid) {
|
if (room && room.observe && room.rid) {
|
||||||
this.roomObservable = room.observe();
|
this.roomObservable = room.observe();
|
||||||
|
@ -142,9 +144,10 @@ class RoomActionsView extends React.Component {
|
||||||
const canViewMembers = await this.canViewMembers();
|
const canViewMembers = await this.canViewMembers();
|
||||||
const canCreateTeam = await this.canCreateTeam();
|
const canCreateTeam = await this.canCreateTeam();
|
||||||
const canAddChannelToTeam = await this.canAddChannelToTeam();
|
const canAddChannelToTeam = await this.canAddChannelToTeam();
|
||||||
|
const canConvertTeam = await this.canConvertTeam();
|
||||||
|
|
||||||
this.setState({
|
this.setState({
|
||||||
canAutoTranslate, canAddUser, canInviteUser, canEdit, canToggleEncryption, canViewMembers, canCreateTeam, canAddChannelToTeam
|
canAutoTranslate, canAddUser, canInviteUser, canEdit, canToggleEncryption, canViewMembers, canCreateTeam, canAddChannelToTeam, canConvertTeam
|
||||||
});
|
});
|
||||||
|
|
||||||
// livechat permissions
|
// livechat permissions
|
||||||
|
@ -240,6 +243,16 @@ class RoomActionsView extends React.Component {
|
||||||
return canAddChannelToTeam;
|
return canAddChannelToTeam;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
canConvertTeam = async() => {
|
||||||
|
const { room } = this.state;
|
||||||
|
const { convertTeamPermission } = this.props;
|
||||||
|
const { rid } = room;
|
||||||
|
const permissions = await RocketChat.hasPermission([convertTeamPermission], rid);
|
||||||
|
|
||||||
|
const canConvertTeam = permissions[0];
|
||||||
|
return canConvertTeam;
|
||||||
|
}
|
||||||
|
|
||||||
canToggleEncryption = async() => {
|
canToggleEncryption = async() => {
|
||||||
const { room } = this.state;
|
const { room } = this.state;
|
||||||
const { toggleRoomE2EEncryptionPermission } = this.props;
|
const { toggleRoomE2EEncryptionPermission } = this.props;
|
||||||
|
@ -433,6 +446,59 @@ class RoomActionsView extends React.Component {
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
|
convertTeamToChannel = async() => {
|
||||||
|
const { room } = this.state;
|
||||||
|
const { navigation } = this.props;
|
||||||
|
|
||||||
|
try {
|
||||||
|
const result = await RocketChat.teamListRoomsOfUser({ teamId: room.teamId, userId: room.u._id });
|
||||||
|
|
||||||
|
if (result.rooms?.length) {
|
||||||
|
const teamChannels = result.rooms.map(r => ({
|
||||||
|
rid: r._id,
|
||||||
|
name: r.name,
|
||||||
|
teamId: r.teamId
|
||||||
|
}));
|
||||||
|
navigation.navigate('SelectListView', {
|
||||||
|
title: 'Converting_Team_To_Channel',
|
||||||
|
data: teamChannels,
|
||||||
|
infoText: 'Select_Team_Channels_To_Delete',
|
||||||
|
nextAction: data => this.convertTeamToChannelConfirmation(data)
|
||||||
|
});
|
||||||
|
} else {
|
||||||
|
this.convertTeamToChannelConfirmation();
|
||||||
|
}
|
||||||
|
} catch (e) {
|
||||||
|
this.convertTeamToChannelConfirmation();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
handleConvertTeamToChannel = async(selected) => {
|
||||||
|
logEvent(events.RA_CONVERT_TEAM_TO_CHANNEL);
|
||||||
|
try {
|
||||||
|
const { room } = this.state;
|
||||||
|
const { navigation } = this.props;
|
||||||
|
|
||||||
|
const result = await RocketChat.convertTeamToChannel({ teamId: room.teamId, selected });
|
||||||
|
|
||||||
|
if (result.success) {
|
||||||
|
navigation.navigate('RoomView');
|
||||||
|
}
|
||||||
|
} catch (e) {
|
||||||
|
logEvent(events.RA_CONVERT_TEAM_TO_CHANNEL_F);
|
||||||
|
log(e);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
convertTeamToChannelConfirmation = (selected = []) => {
|
||||||
|
showConfirmationAlert({
|
||||||
|
title: I18n.t('Confirmation'),
|
||||||
|
message: I18n.t('You_are_converting_the_team'),
|
||||||
|
confirmationText: I18n.t('Convert'),
|
||||||
|
onPress: () => this.handleConvertTeamToChannel(selected)
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
leaveTeam = async() => {
|
leaveTeam = async() => {
|
||||||
const { room } = this.state;
|
const { room } = this.state;
|
||||||
const { navigation, leaveRoom } = this.props;
|
const { navigation, leaveRoom } = this.props;
|
||||||
|
@ -806,6 +872,32 @@ class RoomActionsView extends React.Component {
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
teamToChannelActions = (t, room) => {
|
||||||
|
const { canEdit, canConvertTeam } = this.state;
|
||||||
|
const canConvertTeamToChannel = canEdit && canConvertTeam && !!room?.teamMain;
|
||||||
|
|
||||||
|
return (
|
||||||
|
<>
|
||||||
|
{['c', 'p'].includes(t) && canConvertTeamToChannel
|
||||||
|
? (
|
||||||
|
<>
|
||||||
|
<List.Item
|
||||||
|
title='Convert_to_Channel'
|
||||||
|
onPress={() => this.onPressTouchable({
|
||||||
|
event: this.convertTeamToChannel
|
||||||
|
})}
|
||||||
|
testID='room-actions-convert-channel-to-team'
|
||||||
|
left={() => <List.Icon name='channel-public' />}
|
||||||
|
showActionIndicator
|
||||||
|
/>
|
||||||
|
<List.Separator />
|
||||||
|
</>
|
||||||
|
)
|
||||||
|
: null}
|
||||||
|
</>
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
render() {
|
render() {
|
||||||
const {
|
const {
|
||||||
room, membersCount, canViewMembers, canAddUser, canInviteUser, joined, canAutoTranslate, canForwardGuest, canReturnQueue
|
room, membersCount, canViewMembers, canAddUser, canInviteUser, joined, canAutoTranslate, canForwardGuest, canReturnQueue
|
||||||
|
@ -1007,7 +1099,9 @@ class RoomActionsView extends React.Component {
|
||||||
)
|
)
|
||||||
: null}
|
: null}
|
||||||
|
|
||||||
|
|
||||||
{ this.teamChannelActions(t, room) }
|
{ this.teamChannelActions(t, room) }
|
||||||
|
{this.teamToChannelActions(t, room)}
|
||||||
|
|
||||||
{['l'].includes(t) && !this.isOmnichannelPreview
|
{['l'].includes(t) && !this.isOmnichannelPreview
|
||||||
? (
|
? (
|
||||||
|
@ -1099,7 +1193,8 @@ const mapStateToProps = state => ({
|
||||||
viewBroadcastMemberListPermission: state.permissions['view-broadcast-member-list'],
|
viewBroadcastMemberListPermission: state.permissions['view-broadcast-member-list'],
|
||||||
transferLivechatGuestPermission: state.permissions['transfer-livechat-guest'],
|
transferLivechatGuestPermission: state.permissions['transfer-livechat-guest'],
|
||||||
createTeamPermission: state.permissions['create-team'],
|
createTeamPermission: state.permissions['create-team'],
|
||||||
addTeamChannelPermission: state.permissions['add-team-channel']
|
addTeamChannelPermission: state.permissions['add-team-channel'],
|
||||||
|
convertTeamPermission: state.permissions['convert-team']
|
||||||
});
|
});
|
||||||
|
|
||||||
const mapDispatchToProps = dispatch => ({
|
const mapDispatchToProps = dispatch => ({
|
||||||
|
|
|
@ -71,7 +71,6 @@ const DISCUSSIONS_HEADER = 'Discussions';
|
||||||
const TEAMS_HEADER = 'Teams';
|
const TEAMS_HEADER = 'Teams';
|
||||||
const CHANNELS_HEADER = 'Channels';
|
const CHANNELS_HEADER = 'Channels';
|
||||||
const DM_HEADER = 'Direct_Messages';
|
const DM_HEADER = 'Direct_Messages';
|
||||||
const GROUPS_HEADER = 'Private_Groups';
|
|
||||||
const OMNICHANNEL_HEADER = 'Open_Livechats';
|
const OMNICHANNEL_HEADER = 'Open_Livechats';
|
||||||
const QUERY_SIZE = 20;
|
const QUERY_SIZE = 20;
|
||||||
|
|
||||||
|
@ -480,13 +479,11 @@ class RoomsListView extends React.Component {
|
||||||
if (groupByType) {
|
if (groupByType) {
|
||||||
const teams = chats.filter(s => filterIsTeam(s));
|
const teams = chats.filter(s => filterIsTeam(s));
|
||||||
const discussions = chats.filter(s => filterIsDiscussion(s));
|
const discussions = chats.filter(s => filterIsDiscussion(s));
|
||||||
const channels = chats.filter(s => s.t === 'c' && !filterIsDiscussion(s) && !filterIsTeam(s));
|
const channels = chats.filter(s => (s.t === 'c' || s.t === 'p') && !filterIsDiscussion(s) && !filterIsTeam(s));
|
||||||
const privateGroup = chats.filter(s => s.t === 'p' && !filterIsDiscussion(s) && !filterIsTeam(s));
|
|
||||||
const direct = chats.filter(s => s.t === 'd' && !filterIsDiscussion(s) && !filterIsTeam(s));
|
const direct = chats.filter(s => s.t === 'd' && !filterIsDiscussion(s) && !filterIsTeam(s));
|
||||||
tempChats = this.addRoomsGroup(teams, TEAMS_HEADER, tempChats);
|
tempChats = this.addRoomsGroup(teams, TEAMS_HEADER, tempChats);
|
||||||
tempChats = this.addRoomsGroup(discussions, DISCUSSIONS_HEADER, tempChats);
|
tempChats = this.addRoomsGroup(discussions, DISCUSSIONS_HEADER, tempChats);
|
||||||
tempChats = this.addRoomsGroup(channels, CHANNELS_HEADER, tempChats);
|
tempChats = this.addRoomsGroup(channels, CHANNELS_HEADER, tempChats);
|
||||||
tempChats = this.addRoomsGroup(privateGroup, GROUPS_HEADER, tempChats);
|
|
||||||
tempChats = this.addRoomsGroup(direct, DM_HEADER, tempChats);
|
tempChats = this.addRoomsGroup(direct, DM_HEADER, tempChats);
|
||||||
} else if (showUnread || showFavorites || isOmnichannelAgent) {
|
} else if (showUnread || showFavorites || isOmnichannelAgent) {
|
||||||
tempChats = this.addRoomsGroup(chats, CHATS_HEADER, tempChats);
|
tempChats = this.addRoomsGroup(chats, CHATS_HEADER, tempChats);
|
||||||
|
|
|
@ -30,14 +30,14 @@ const THEMES = [
|
||||||
label: 'Dark',
|
label: 'Dark',
|
||||||
value: 'dark',
|
value: 'dark',
|
||||||
group: THEME_GROUP
|
group: THEME_GROUP
|
||||||
}, {
|
|
||||||
label: 'Dark',
|
|
||||||
value: 'dark',
|
|
||||||
group: DARK_GROUP
|
|
||||||
}, {
|
}, {
|
||||||
label: 'Black',
|
label: 'Black',
|
||||||
value: 'black',
|
value: 'black',
|
||||||
group: DARK_GROUP
|
group: DARK_GROUP
|
||||||
|
}, {
|
||||||
|
label: 'Dark',
|
||||||
|
value: 'dark',
|
||||||
|
group: DARK_GROUP
|
||||||
}
|
}
|
||||||
];
|
];
|
||||||
|
|
||||||
|
|
|
@ -51,7 +51,7 @@ describe('Move/Convert Team', () => {
|
||||||
await element(by.id('room-actions-scrollview')).scrollTo('bottom');
|
await element(by.id('room-actions-scrollview')).scrollTo('bottom');
|
||||||
await waitFor(element(by.id('room-actions-convert-to-team'))).toExist().withTimeout(2000);
|
await waitFor(element(by.id('room-actions-convert-to-team'))).toExist().withTimeout(2000);
|
||||||
await element(by.id('room-actions-convert-to-team')).tap();
|
await element(by.id('room-actions-convert-to-team')).tap();
|
||||||
await waitFor(element(by.label('This can\'t be undone. Once you convert a channel to a team, you can not turn it back to a channel.'))).toExist().withTimeout(2000);
|
await waitFor(element(by.label('You are converting this Channel to a Team. All Members will be kept.'))).toExist().withTimeout(2000);
|
||||||
await element(by.text('Convert')).tap();
|
await element(by.text('Convert')).tap();
|
||||||
await waitFor(element(by.id('room-view'))).toExist().withTimeout(20000);
|
await waitFor(element(by.id('room-view'))).toExist().withTimeout(20000);
|
||||||
await waitFor(element(by.id(`room-view-title-${ toBeConverted }`))).toExist().withTimeout(6000);
|
await waitFor(element(by.id(`room-view-title-${ toBeConverted }`))).toExist().withTimeout(6000);
|
||||||
|
@ -84,5 +84,32 @@ describe('Move/Convert Team', () => {
|
||||||
await element(by.text('Yes, move it!')).tap();
|
await element(by.text('Yes, move it!')).tap();
|
||||||
await waitFor(element(by.id('room-view-header-team-channels'))).toExist().withTimeout(10000);
|
await waitFor(element(by.id('room-view-header-team-channels'))).toExist().withTimeout(10000);
|
||||||
});
|
});
|
||||||
|
|
||||||
|
after(async() => {
|
||||||
|
await tapBack();
|
||||||
|
await waitFor(element(by.id('rooms-list-view'))).toExist().withTimeout(2000);
|
||||||
|
});
|
||||||
|
});
|
||||||
|
|
||||||
|
describe('Convert Team to Channel and Delete toBeMoved channel within the Converted', () => {
|
||||||
|
it('should convert a team to a channel', async() => {
|
||||||
|
await navigateToRoomActions(toBeConverted);
|
||||||
|
await element(by.id('room-actions-scrollview')).scrollTo('bottom');
|
||||||
|
await waitFor(element(by.id('room-actions-convert-channel-to-team'))).toExist().withTimeout(2000);
|
||||||
|
await element(by.id('room-actions-convert-channel-to-team')).tap();
|
||||||
|
await sleep(2000);
|
||||||
|
await waitFor(element(by.id('select-list-view'))).toExist().withTimeout(2000);
|
||||||
|
await waitFor(element(by.id(`select-list-view-item-${ toBeMoved }`))).toExist().withTimeout(2000);
|
||||||
|
await element(by.id(`select-list-view-item-${ toBeMoved }`)).tap();
|
||||||
|
await waitFor(element(by.id('select-list-view-submit'))).toExist().withTimeout(2000);
|
||||||
|
await element(by.id('select-list-view-submit')).tap();
|
||||||
|
await waitFor(element(by.label('You are converting this Team to a Channel'))).toExist().withTimeout(2000);
|
||||||
|
await element(by.text('Convert')).tap();
|
||||||
|
await waitFor(element(by.id('room-view'))).toExist().withTimeout(20000);
|
||||||
|
await waitFor(element(by.id(`room-view-title-${ toBeConverted }`))).toExist().withTimeout(6000);
|
||||||
|
await tapBack();
|
||||||
|
await waitFor(element(by.id('rooms-list-view'))).toExist().withTimeout(2000);
|
||||||
|
await waitFor(element(by.id(`rooms-list-view-item-${ toBeMoved }`))).toBeNotVisible().withTimeout(60000);
|
||||||
|
});
|
||||||
});
|
});
|
||||||
});
|
});
|
||||||
|
|
|
@ -1694,7 +1694,7 @@
|
||||||
INFOPLIST_FILE = NotificationService/Info.plist;
|
INFOPLIST_FILE = NotificationService/Info.plist;
|
||||||
IPHONEOS_DEPLOYMENT_TARGET = 11.0;
|
IPHONEOS_DEPLOYMENT_TARGET = 11.0;
|
||||||
LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @executable_path/../../Frameworks";
|
LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @executable_path/../../Frameworks";
|
||||||
MARKETING_VERSION = 4.17.0;
|
MARKETING_VERSION = 4.18.0;
|
||||||
MTL_ENABLE_DEBUG_INFO = INCLUDE_SOURCE;
|
MTL_ENABLE_DEBUG_INFO = INCLUDE_SOURCE;
|
||||||
MTL_FAST_MATH = YES;
|
MTL_FAST_MATH = YES;
|
||||||
PRODUCT_BUNDLE_IDENTIFIER = chat.rocket.reactnative.NotificationService;
|
PRODUCT_BUNDLE_IDENTIFIER = chat.rocket.reactnative.NotificationService;
|
||||||
|
@ -1731,7 +1731,7 @@
|
||||||
INFOPLIST_FILE = NotificationService/Info.plist;
|
INFOPLIST_FILE = NotificationService/Info.plist;
|
||||||
IPHONEOS_DEPLOYMENT_TARGET = 11.0;
|
IPHONEOS_DEPLOYMENT_TARGET = 11.0;
|
||||||
LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @executable_path/../../Frameworks";
|
LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @executable_path/../../Frameworks";
|
||||||
MARKETING_VERSION = 4.17.0;
|
MARKETING_VERSION = 4.18.0;
|
||||||
MTL_FAST_MATH = YES;
|
MTL_FAST_MATH = YES;
|
||||||
PRODUCT_BUNDLE_IDENTIFIER = chat.rocket.reactnative.NotificationService;
|
PRODUCT_BUNDLE_IDENTIFIER = chat.rocket.reactnative.NotificationService;
|
||||||
PRODUCT_NAME = "$(TARGET_NAME)";
|
PRODUCT_NAME = "$(TARGET_NAME)";
|
||||||
|
|
|
@ -23,7 +23,7 @@
|
||||||
<key>CFBundlePackageType</key>
|
<key>CFBundlePackageType</key>
|
||||||
<string>APPL</string>
|
<string>APPL</string>
|
||||||
<key>CFBundleShortVersionString</key>
|
<key>CFBundleShortVersionString</key>
|
||||||
<string>4.17.0</string>
|
<string>4.18.0</string>
|
||||||
<key>CFBundleSignature</key>
|
<key>CFBundleSignature</key>
|
||||||
<string>????</string>
|
<string>????</string>
|
||||||
<key>CFBundleURLTypes</key>
|
<key>CFBundleURLTypes</key>
|
||||||
|
|
|
@ -21,7 +21,7 @@
|
||||||
<key>CFBundlePackageType</key>
|
<key>CFBundlePackageType</key>
|
||||||
<string>XPC!</string>
|
<string>XPC!</string>
|
||||||
<key>CFBundleShortVersionString</key>
|
<key>CFBundleShortVersionString</key>
|
||||||
<string>4.17.0</string>
|
<string>4.18.0</string>
|
||||||
<key>CFBundleVersion</key>
|
<key>CFBundleVersion</key>
|
||||||
<string>1</string>
|
<string>1</string>
|
||||||
<key>KeychainGroup</key>
|
<key>KeychainGroup</key>
|
||||||
|
|
|
@ -1,6 +1,6 @@
|
||||||
{
|
{
|
||||||
"name": "rocket-chat-reactnative",
|
"name": "rocket-chat-reactnative",
|
||||||
"version": "4.17.0",
|
"version": "4.18.0",
|
||||||
"private": true,
|
"private": true,
|
||||||
"scripts": {
|
"scripts": {
|
||||||
"start": "react-native start",
|
"start": "react-native start",
|
||||||
|
|
|
@ -0,0 +1,55 @@
|
||||||
|
diff --git a/node_modules/react-native/Libraries/Components/ScrollView/ScrollView.js b/node_modules/react-native/Libraries/Components/ScrollView/ScrollView.js
|
||||||
|
index c344ac4..479c8c0 100644
|
||||||
|
--- a/node_modules/react-native/Libraries/Components/ScrollView/ScrollView.js
|
||||||
|
+++ b/node_modules/react-native/Libraries/Components/ScrollView/ScrollView.js
|
||||||
|
@@ -1244,9 +1244,17 @@ class ScrollView extends React.Component<Props, State> {
|
||||||
|
// Note: we should split props.style on the inner and outer props
|
||||||
|
// however, the ScrollView still needs the baseStyle to be scrollable
|
||||||
|
const {outer, inner} = splitLayoutProps(flattenStyle(props.style));
|
||||||
|
+
|
||||||
|
+ // Workaround for RefreshControl inverted: https://github.com/facebook/react-native/issues/30034
|
||||||
|
+ let inverted;
|
||||||
|
+ if (inner.scaleY) {
|
||||||
|
+ inverted = { scaleY: -1 };
|
||||||
|
+ delete inner.scaleY;
|
||||||
|
+ }
|
||||||
|
+
|
||||||
|
return React.cloneElement(
|
||||||
|
refreshControl,
|
||||||
|
- {style: [baseStyle, outer]},
|
||||||
|
+ {style: [baseStyle, outer, inverted]},
|
||||||
|
<ScrollViewClass
|
||||||
|
{...props}
|
||||||
|
style={[baseStyle, inner]}
|
||||||
|
diff --git a/node_modules/react-native/Libraries/Lists/VirtualizedList.js b/node_modules/react-native/Libraries/Lists/VirtualizedList.js
|
||||||
|
index 9ec105f..6bb6989 100644
|
||||||
|
--- a/node_modules/react-native/Libraries/Lists/VirtualizedList.js
|
||||||
|
+++ b/node_modules/react-native/Libraries/Lists/VirtualizedList.js
|
||||||
|
@@ -11,6 +11,7 @@
|
||||||
|
'use strict';
|
||||||
|
|
||||||
|
const Batchinator = require('../Interaction/Batchinator');
|
||||||
|
+const Platform = require('../Utilities/Platform');
|
||||||
|
const FillRateHelper = require('./FillRateHelper');
|
||||||
|
const PropTypes = require('prop-types');
|
||||||
|
const React = require('react');
|
||||||
|
@@ -2185,9 +2186,16 @@ function describeNestedLists(childList: {
|
||||||
|
}
|
||||||
|
|
||||||
|
const styles = StyleSheet.create({
|
||||||
|
- verticallyInverted: {
|
||||||
|
- transform: [{scaleY: -1}],
|
||||||
|
- },
|
||||||
|
+ // Workaround found on https://github.com/facebook/react-native/issues/30034#issuecomment-806396274
|
||||||
|
+ // Note: Check ScrollView for a workaround on RefreshControl
|
||||||
|
+ verticallyInverted:
|
||||||
|
+ Platform.OS === 'android'
|
||||||
|
+ ? {
|
||||||
|
+ scaleY: -1,
|
||||||
|
+ }
|
||||||
|
+ : {
|
||||||
|
+ transform: [{scaleY: -1}]
|
||||||
|
+ },
|
||||||
|
horizontallyInverted: {
|
||||||
|
transform: [{scaleX: -1}],
|
||||||
|
},
|
Loading…
Reference in New Issue