diff --git a/.eslintignore b/.eslintignore index 398578ec4..9594dcce6 100644 --- a/.eslintignore +++ b/.eslintignore @@ -1,6 +1,6 @@ __tests__ node_modules coverage -e2e +e2e/docker android ios \ No newline at end of file diff --git a/.eslintrc.js b/.eslintrc.js index 31146aefe..409efb70a 100644 --- a/.eslintrc.js +++ b/.eslintrc.js @@ -29,7 +29,8 @@ module.exports = { "commonjs": true, "es6": true, "node": true, - "jquery": true + "jquery": true, + "mocha": true }, "rules": { "react/jsx-filename-extension": [1, { @@ -155,5 +156,23 @@ module.exports = { }, "globals": { "__DEV__": true - } + }, + overrides: [ + { + files: ['e2e/**'], + globals: { + by: true, + detox: true, + device: true, + element: true, + expect: true, + waitFor: true + }, + rules: { + 'import/no-extraneous-dependencies': 0, + 'no-await-in-loop': 0, + 'no-restricted-syntax': 0 + } + } + ] }; diff --git a/__tests__/__snapshots__/Storyshots.test.js.snap b/__tests__/__snapshots__/Storyshots.test.js.snap index 3e3106d94..f7291f458 100644 --- a/__tests__/__snapshots__/Storyshots.test.js.snap +++ b/__tests__/__snapshots__/Storyshots.test.js.snap @@ -11490,7 +11490,7 @@ exports[`Storyshots LoadMore black theme 1`] = ` }, undefined, Object { - "color": "#e8ebed", + "color": "#cbced1", }, ] } @@ -11593,7 +11593,7 @@ exports[`Storyshots LoadMore black theme 1`] = ` }, undefined, Object { - "color": "#e8ebed", + "color": "#cbced1", }, ] } @@ -11696,7 +11696,7 @@ exports[`Storyshots LoadMore black theme 1`] = ` }, undefined, Object { - "color": "#e8ebed", + "color": "#cbced1", }, ] } @@ -11973,7 +11973,7 @@ exports[`Storyshots LoadMore black theme 1`] = ` }, undefined, Object { - "color": "#e8ebed", + "color": "#cbced1", }, ] } @@ -12076,7 +12076,7 @@ exports[`Storyshots LoadMore black theme 1`] = ` }, undefined, Object { - "color": "#e8ebed", + "color": "#cbced1", }, ] } @@ -12179,7 +12179,7 @@ exports[`Storyshots LoadMore black theme 1`] = ` }, undefined, Object { - "color": "#e8ebed", + "color": "#cbced1", }, ] } @@ -12420,7 +12420,7 @@ exports[`Storyshots LoadMore black theme 1`] = ` }, undefined, Object { - "color": "#e8ebed", + "color": "#cbced1", }, ] } @@ -12692,7 +12692,7 @@ exports[`Storyshots LoadMore dark theme 1`] = ` }, undefined, Object { - "color": "#e8ebed", + "color": "#cbced1", }, ] } @@ -12795,7 +12795,7 @@ exports[`Storyshots LoadMore dark theme 1`] = ` }, undefined, Object { - "color": "#e8ebed", + "color": "#cbced1", }, ] } @@ -12898,7 +12898,7 @@ exports[`Storyshots LoadMore dark theme 1`] = ` }, undefined, Object { - "color": "#e8ebed", + "color": "#cbced1", }, ] } @@ -13175,7 +13175,7 @@ exports[`Storyshots LoadMore dark theme 1`] = ` }, undefined, Object { - "color": "#e8ebed", + "color": "#cbced1", }, ] } @@ -13278,7 +13278,7 @@ exports[`Storyshots LoadMore dark theme 1`] = ` }, undefined, Object { - "color": "#e8ebed", + "color": "#cbced1", }, ] } @@ -13381,7 +13381,7 @@ exports[`Storyshots LoadMore dark theme 1`] = ` }, undefined, Object { - "color": "#e8ebed", + "color": "#cbced1", }, ] } @@ -13622,7 +13622,7 @@ exports[`Storyshots LoadMore dark theme 1`] = ` }, undefined, Object { - "color": "#e8ebed", + "color": "#cbced1", }, ] } @@ -67631,7 +67631,7 @@ Array [ "textAlign": "left", }, Object { - "color": "#e8ebed", + "color": "#cbced1", }, Object { "backgroundColor": "transparent", @@ -67791,7 +67791,7 @@ Array [ "textAlign": "left", }, Object { - "color": "#e8ebed", + "color": "#cbced1", }, Object { "backgroundColor": "transparent", @@ -74309,7 +74309,7 @@ exports[`Storyshots Thread Messages.Item themes 1`] = ` "textAlign": "left", }, Object { - "color": "#e8ebed", + "color": "#cbced1", }, Object { "flex": 1, @@ -74661,7 +74661,7 @@ exports[`Storyshots Thread Messages.Item themes 1`] = ` "textAlign": "left", }, Object { - "color": "#e8ebed", + "color": "#cbced1", }, Object { "flex": 1, diff --git a/android/app/build.gradle b/android/app/build.gradle index e3da57bb9..95628ac2f 100644 --- a/android/app/build.gradle +++ b/android/app/build.gradle @@ -144,7 +144,7 @@ android { minSdkVersion rootProject.ext.minSdkVersion targetSdkVersion rootProject.ext.targetSdkVersion versionCode VERSIONCODE as Integer - versionName "4.17.0" + versionName "4.18.0" vectorDrawables.useSupportLibrary = true if (!isFoss) { manifestPlaceholders = [BugsnagAPIKey: BugsnagAPIKey as String] diff --git a/app/actions/actionsTypes.js b/app/actions/actionsTypes.js index 1fd8679bc..0790b7bad 100644 --- a/app/actions/actionsTypes.js +++ b/app/actions/actionsTypes.js @@ -66,9 +66,10 @@ export const INVITE_LINKS = createRequestTypes('INVITE_LINKS', [ 'CLEAR', ...defaultTypes ]); -export const SETTINGS = createRequestTypes('SETTINGS', ['CLEAR', 'ADD']); +export const SETTINGS = createRequestTypes('SETTINGS', ['CLEAR', 'ADD', 'UPDATE']); export const APP_STATE = createRequestTypes('APP_STATE', ['FOREGROUND', 'BACKGROUND']); export const ENTERPRISE_MODULES = createRequestTypes('ENTERPRISE_MODULES', ['CLEAR', 'SET']); export const ENCRYPTION = createRequestTypes('ENCRYPTION', ['INIT', 'STOP', 'DECODE_KEY', 'SET', 'SET_BANNER']); -export const PERMISSIONS = createRequestTypes('PERMISSIONS', ['SET']); +export const PERMISSIONS = createRequestTypes('PERMISSIONS', ['SET', 'UPDATE']); +export const ROLES = createRequestTypes('ROLES', ['SET', 'UPDATE', 'REMOVE']); diff --git a/app/actions/login.js b/app/actions/login.js index daf13d3b4..e0f4c1e28 100644 --- a/app/actions/login.js +++ b/app/actions/login.js @@ -1,10 +1,11 @@ import * as types from './actionsTypes'; -export function loginRequest(credentials, logoutOnError) { +export function loginRequest(credentials, logoutOnError, isFromWebView) { return { type: types.LOGIN.REQUEST, credentials, - logoutOnError + logoutOnError, + isFromWebView }; } diff --git a/app/actions/permissions.js b/app/actions/permissions.js index 88179c34f..444d9f11c 100644 --- a/app/actions/permissions.js +++ b/app/actions/permissions.js @@ -6,3 +6,10 @@ export function setPermissions(permissions) { permissions }; } + +export function updatePermission(id, roles) { + return { + type: types.PERMISSIONS.UPDATE, + payload: { id, roles } + }; +} diff --git a/app/actions/roles.js b/app/actions/roles.js new file mode 100644 index 000000000..8ee30425b --- /dev/null +++ b/app/actions/roles.js @@ -0,0 +1,20 @@ +import * as types from './actionsTypes'; + +export function setRoles(roles) { + return { + type: types.ROLES.SET, + roles + }; +} +export function updateRoles(id, desc) { + return { + type: types.ROLES.UPDATE, + payload: { id, desc } + }; +} +export function removeRoles(id) { + return { + type: types.ROLES.REMOVE, + payload: { id } + }; +} diff --git a/app/actions/room.js b/app/actions/room.js index 4ad7e87f6..2753d7b9a 100644 --- a/app/actions/room.js +++ b/app/actions/room.js @@ -23,11 +23,12 @@ export function leaveRoom(roomType, room, selected) { }; } -export function deleteRoom(rid, t) { +export function deleteRoom(roomType, room, selected) { return { type: types.ROOM.DELETE, - rid, - t + room, + roomType, + selected }; } diff --git a/app/actions/settings.js b/app/actions/settings.js index 381958c54..6fae375bc 100644 --- a/app/actions/settings.js +++ b/app/actions/settings.js @@ -7,6 +7,13 @@ export function addSettings(settings) { }; } +export function updateSettings(id, value) { + return { + type: SETTINGS.UPDATE, + payload: { id, value } + }; +} + export function clearSettings() { return { type: SETTINGS.CLEAR diff --git a/app/constants/colors.js b/app/constants/colors.js index 554d7f8d3..1172b4bc9 100644 --- a/app/constants/colors.js +++ b/app/constants/colors.js @@ -74,7 +74,7 @@ export const themes = { auxiliaryBackground: '#07101e', bannerBackground: '#0e1f38', titleText: '#f9f9f9', - bodyText: '#e8ebed', + bodyText: '#cbced1', backdropColor: '#000000', dangerColor: '#f5455c', successColor: '#2de0a5', @@ -121,7 +121,7 @@ export const themes = { auxiliaryBackground: '#080808', bannerBackground: '#1f2329', titleText: '#f9f9f9', - bodyText: '#e8ebed', + bodyText: '#cbced1', backdropColor: '#000000', dangerColor: '#f5455c', successColor: '#2de0a5', diff --git a/app/constants/settings.js b/app/constants/settings.js index d684a11c1..14ad8fb36 100644 --- a/app/constants/settings.js +++ b/app/constants/settings.js @@ -196,5 +196,11 @@ export default { }, Accounts_AllowInvisibleStatusOption: { type: 'valueAsString' + }, + Jitsi_Enable_Teams: { + type: 'valueAsBoolean' + }, + Jitsi_Enable_Channels: { + type: 'valuesAsBoolean' } }; diff --git a/app/containers/InAppNotification/NotifierComponent.js b/app/containers/InAppNotification/NotifierComponent.js index b69704359..6268cd098 100644 --- a/app/containers/InAppNotification/NotifierComponent.js +++ b/app/containers/InAppNotification/NotifierComponent.js @@ -76,7 +76,7 @@ const NotifierComponent = React.memo(({ notification, isMasterDetail }) => { const { title = name, avatar = name } = notification; const onPress = () => { - const { prid } = payload; + const { prid, _id } = payload; if (!rid) { return; } @@ -89,7 +89,7 @@ const NotifierComponent = React.memo(({ notification, isMasterDetail }) => { } else { Navigation.navigate('RoomsListView'); } - goRoom({ item, isMasterDetail }); + goRoom({ item, isMasterDetail, jumpToMessageId: _id }); hideNotification(); }; diff --git a/app/containers/Loading.js b/app/containers/Loading.js index 03561a8fd..656e476af 100644 --- a/app/containers/Loading.js +++ b/app/containers/Loading.js @@ -103,7 +103,7 @@ export default class Loading extends React.PureComponent { transparent onRequestClose={() => {}} > - + { const handlePress = () => { - if (!link || !onLinkPress) { + if (!link) { return; } - onLinkPress(link); + if (onLinkPress) { + return onLinkPress(link); + } + openLink(link, theme); }; const childLength = React.Children.toArray(children).filter(o => o).length; diff --git a/app/i18n/locales/ar.json b/app/i18n/locales/ar.json index 6f188ca55..8b08c047d 100644 --- a/app/i18n/locales/ar.json +++ b/app/i18n/locales/ar.json @@ -387,7 +387,6 @@ "Preferences_saved": "تم حفظ التفضيلات", "Privacy_Policy": "سياسة الخصوصية", "Private_Channel": "قناة خاصة", - "Private_Groups": "مجموعات خاصة", "Private": "خاص", "Processing": "جار معالجة...", "Profile_saved_successfully": "تم حفظ الملف الشخصي بنجاح!", diff --git a/app/i18n/locales/de.json b/app/i18n/locales/de.json index 0a7f7e1ff..cf61aac86 100644 --- a/app/i18n/locales/de.json +++ b/app/i18n/locales/de.json @@ -400,7 +400,6 @@ "Preferences_saved": "Einstellungen gespeichert!", "Privacy_Policy": " Datenschutzbestimmungen", "Private_Channel": "Privater Kanal", - "Private_Groups": "Private Gruppen", "Private": "Privat", "Processing": "Bearbeite …", "Profile_saved_successfully": "Profil erfolgreich gespeichert!", @@ -685,7 +684,7 @@ "Following": "verfolgte", "Threads_displaying_all": "zeige alle", "Threads_displaying_following": "zeige gefolgte", - "Threads_displaying_unread": "zeige ungelesene", + "Threads_displaying_unread": "Zeige ungelesene", "No_threads": "Es gibt keine Threads", "No_threads_following": "Du folgst keinen Threads", "No_threads_unread": "Es gibt keine ungelesenen Threads", @@ -724,6 +723,7 @@ "creating_team": "Team erstellen", "team-name-already-exists": "Ein Team mit diesem Namen existiert bereits", "Add_Channel_to_Team": "Kanal zum Team hinzufügen", + "Left_The_Team_Successfully": "Das Team erfolgreich verlassen", "Create_New": "Neu erstellen", "Add_Existing": "Vorhandenes hinzufügen", "Add_Existing_Channel": "Vorhandenen Kanal hinzufügen", diff --git a/app/i18n/locales/en.json b/app/i18n/locales/en.json index 926b0c674..194031660 100644 --- a/app/i18n/locales/en.json +++ b/app/i18n/locales/en.json @@ -400,7 +400,6 @@ "Preferences_saved": "Preferences saved!", "Privacy_Policy": " Privacy Policy", "Private_Channel": "Private Channel", - "Private_Groups": "Private Groups", "Private": "Private", "Processing": "Processing...", "Profile_saved_successfully": "Profile saved successfully!", @@ -756,11 +755,18 @@ "member-does-not-exist": "Member does not exist", "Convert": "Convert", "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_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?", "Load_More": "Load More", "Load_Newer": "Load Newer", - "Load_Older": "Load Older" + "Load_Older": "Load Older", + "Left_The_Room_Successfully": "Left the room successfully", + "Deleted_The_Team_Successfully": "Team 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" } \ No newline at end of file diff --git a/app/i18n/locales/es-ES.json b/app/i18n/locales/es-ES.json index ac6657042..25a65523d 100644 --- a/app/i18n/locales/es-ES.json +++ b/app/i18n/locales/es-ES.json @@ -280,7 +280,6 @@ "Preferences_saved": "¡Preferencias guardadas!", "Privacy_Policy": "Política de privacidad", "Private_Channel": "Canal privado", - "Private_Groups": "Grupos privados", "Private": "Privado", "Processing": "Procesando...", "Profile_saved_successfully": "¡Perfil guardado correctamente!", diff --git a/app/i18n/locales/fr.json b/app/i18n/locales/fr.json index 91388e2de..07d441eed 100644 --- a/app/i18n/locales/fr.json +++ b/app/i18n/locales/fr.json @@ -400,7 +400,6 @@ "Preferences_saved": "Préférences sauvegardées !", "Privacy_Policy": " Politique de confidentialité", "Private_Channel": "Canal privé", - "Private_Groups": "Groupes privés", "Private": "Privé", "Processing": "Traitement...", "Profile_saved_successfully": "Profil enregistré avec succès !", @@ -724,6 +723,7 @@ "creating_team": "création de l'équipe", "team-name-already-exists": "Une équipe portant ce nom existe déjà", "Add_Channel_to_Team": "Ajouter un canal à l'équipe", + "Left_The_Team_Successfully": "A quitté l'équipe avec succès", "Create_New": "Créer un nouveau", "Add_Existing": "Ajouter existant", "Add_Existing_Channel": "Ajouter un canal existant", @@ -755,11 +755,18 @@ "member-does-not-exist": "Le membre n'existe pas", "Convert": "Convertir", "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_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 ?", "Load_More": "Charger plus", "Load_Newer": "Charger plus récent", - "Load_Older": "Charger plus ancien" + "Load_Older": "Charger plus ancien", + "Left_The_Room_Successfully": "A quitté le salon avec succès", + "Deleted_The_Team_Successfully": "Equipe supprimée 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" } \ No newline at end of file diff --git a/app/i18n/locales/it.json b/app/i18n/locales/it.json index 505282dd5..e8618f28e 100644 --- a/app/i18n/locales/it.json +++ b/app/i18n/locales/it.json @@ -392,7 +392,6 @@ "Preferences_saved": "Impostazioni salvate!", "Privacy_Policy": " Privacy Policy", "Private_Channel": "Canale privato", - "Private_Groups": "Gruppi privati", "Private": "Privato", "Processing": "Elaborazione...", "Profile_saved_successfully": "Profilo salvato correttamente!", diff --git a/app/i18n/locales/ja.json b/app/i18n/locales/ja.json index 994753fbb..61accdd79 100644 --- a/app/i18n/locales/ja.json +++ b/app/i18n/locales/ja.json @@ -296,7 +296,6 @@ "Preferences_saved": "設定が保存されました。", "Privacy_Policy": " プライバシーポリシー", "Private_Channel": "プライベートチャンネル", - "Private_Groups": "プライベートグループ", "Private": "プライベート", "Processing": "処理中...", "Profile_saved_successfully": "プロフィールが保存されました!", diff --git a/app/i18n/locales/nl.json b/app/i18n/locales/nl.json index 8a48d3c74..7c823c9ba 100644 --- a/app/i18n/locales/nl.json +++ b/app/i18n/locales/nl.json @@ -400,7 +400,6 @@ "Preferences_saved": "Voorkeuren opgeslagen!", "Privacy_Policy": " Privacybeleid", "Private_Channel": "Privékanaal", - "Private_Groups": "Privé groepen", "Private": "Privé", "Processing": "Verwerking...", "Profile_saved_successfully": "Profiel succesvol opgeslagen!", @@ -724,6 +723,7 @@ "creating_team": "team maken", "team-name-already-exists": "Er bestaat al een team met die naam", "Add_Channel_to_Team": "Kanaal toevoegen aan team", + "Left_The_Team_Successfully": "Het team met succes verlaten", "Create_New": "Maak nieuw", "Add_Existing": "Voeg bestaande", "Add_Existing_Channel": "Bestaand kanaal toevoegen", @@ -755,11 +755,18 @@ "member-does-not-exist": "Lid bestaat niet", "Convert": "Converteren", "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_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?", "Load_More": "Meer laden", "Load_Newer": "Nieuwer laden", - "Load_Older": "Ouder laden" + "Load_Older": "Ouder laden", + "Left_The_Room_Successfully": "Heeft kamer met succes verlaten", + "Deleted_The_Team_Successfully": "Team 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" } \ No newline at end of file diff --git a/app/i18n/locales/pt-BR.json b/app/i18n/locales/pt-BR.json index 9b34d87d3..a6fed1be2 100644 --- a/app/i18n/locales/pt-BR.json +++ b/app/i18n/locales/pt-BR.json @@ -370,7 +370,6 @@ "Preferences_saved": "Preferências salvas!", "Privacy_Policy": " Política de Privacidade", "Private_Channel": "Canal Privado", - "Private_Groups": "Grupo Privado", "Private": "Privado", "Processing": "Processando...", "Profile_saved_successfully": "Perfil salvo com sucesso!", @@ -664,6 +663,11 @@ "No_team_channels_found": "Nenhum canal encontrado", "Team_not_found": "Time não encontrado", "Private_Team": "Equipe Privada", + "Left_The_Team_Successfully": "Saiu do time com sucesso", "Add_Existing_Channel": "Adicionar Canal Existente", - "invalid-room": "Sala inválida" + "invalid-room": "Sala inválida", + "Left_The_Room_Successfully": "Saiu da sala com sucesso", + "Deleted_The_Team_Successfully": "Time deletado com sucesso", + "Deleted_The_Room_Successfully": "Sala deletada com sucesso", + "Convert_to_Channel": "Converter para um Canal" } \ No newline at end of file diff --git a/app/i18n/locales/pt-PT.json b/app/i18n/locales/pt-PT.json index ca7d4dc59..fa10dcd36 100644 --- a/app/i18n/locales/pt-PT.json +++ b/app/i18n/locales/pt-PT.json @@ -10,19 +10,22 @@ "error-could-not-change-email": "Não foi possível alterar o e-mail", "error-could-not-change-name": "Não foi possível alterar o nome", "error-could-not-change-username": "Não foi possível alterar o nome de utilizador", + "error-could-not-change-status": "Impossível mudar estado", "error-delete-protected-role": "Não é possível eliminar uma função protegida", "error-department-not-found": "Departamento não encontrado", "error-direct-message-file-upload-not-allowed": "Partilha de ficheiros não permitido em mensagens diretas", - "error-duplicate-channel-name": "Um canal com o nome {{channel_name}} existe", + "error-duplicate-channel-name": "Existe um canal com o nome {{room_name}}", "error-email-domain-blacklisted": "O domínio de e-mail está na lista negra", "error-email-send-failed": "Erro ao tentar enviar e-mail: {{message}}", + "error-save-image": "Erro ao salvar imagem", + "error-save-video": "Erro ao salvar vídeo", "error-field-unavailable": "{{field}} já está em uso :(", "error-file-too-large": "Ficheiro demasiado grande", "error-importer-not-defined": "O importador não foi definido correctamente, a classe Import está em falta.", "error-input-is-not-a-valid-field": "{{input}} não é um {{field}} válido", "error-invalid-actionlink": "Link de acção inválido", "error-invalid-arguments": "Argumentos inválidos", - "error-invalid-asset": "Ficheiro inválida", + "error-invalid-asset": "Ficheiro inválido", "error-invalid-channel": "Canal inválido.", "error-invalid-channel-start-with-chars": "Canal inválido. Começa por @ ou #", "error-invalid-custom-field": "Campo personalizado inválido", @@ -58,6 +61,7 @@ "error-message-editing-blocked": "A edição de mensagens está bloqueada", "error-message-size-exceeded": "O tamanho da mensagem excede Message_MaxAllowedSize", "error-missing-unsubscribe-link": "Você deve fornecer o link para cancelar a subscrição: [unsubscribe].", + "error-no-owner-channel": "Você não é dono do canal", "error-no-tokens-for-this-user": "Não há tokens para este utilizador", "error-not-allowed": "Não permitido", "error-not-authorized": "Não autorizado", @@ -75,33 +79,46 @@ "error-user-registration-disabled": "O registo de utilizadores está desactivado", "error-user-registration-secret": "O registo de utilizadores só é permitido por meio de um URL secreto", "error-you-are-last-owner": "Você é o último proprietário. Por favor, defina novo proprietário antes de sair da sala.", + "error-status-not-allowed": "O estado invisível está desactivado", "Actions": "Acções", "activity": "actividade", "Activity": "Actividade", "Add_Reaction": "Adicionar Reacção", "Add_Server": "Adicionar Servidor", "Add_users": "Adicionar utilizadores", + "Admin_Panel": "Painel de Administração", + "Agent": "Agente", "Alert": "Alerta", "alert": "alerta", "alerts": "alertas", "All_users_in_the_channel_can_write_new_messages": "Todos os utilizadores no canal podem escrever novas mensagens", + "All_users_in_the_team_can_write_new_messages": "Todos os usuários da equipa podem escrever novas mensagens", + "A_meaningful_name_for_the_discussion_room": "Um nome significativo para a sala de discussão", "All": "Todos", + "All_Messages": "Todas as Mensagens", "Allow_Reactions": "Permitir Reacções", "Alphabetical": "Alfabética", "and_more": "e mais", "and": "e", "announcement": "anúncio", "Announcement": "Anúncio", + "Apply_Your_Certificate": "Aplique o seu Certificado", "ARCHIVE": "ARQUIVAR", "archive": "arquivar", "are_typing": "estão a escrever", "Are_you_sure_question_mark": "Tem a certeza?", "Are_you_sure_you_want_to_leave_the_room": "Tem certeza de que quer sair da sala {{room}}?", + "Audio": "Áudio", "Authenticating": "Autenticando", + "Automatic": "Automático", + "Auto_Translate": "Auto-Tradução", "Avatar_changed_successfully": "Avatar alterado com sucesso!", "Avatar_Url": "URL do Avatar", "Away": "Ausente", + "Back": "Voltar", + "Black": "Preto", "Block_user": "Bloquear utilizador", + "Browser": "Navegador", "Broadcast_channel_Description": "Apenas utilizadores autorizados podem escrever novas mensagens, mas os outros utilizadores poderão responder", "Broadcast_Channel": "Canal de Transmissão", "Busy": "Ocupado", @@ -111,80 +128,187 @@ "Cancel": "Cancelar", "changing_avatar": "a alterar avatar", "creating_channel": "a criar canal", + "creating_invite": "a criar convite", "Channel_Name": "Nome do Canal", "Channels": "Canais", "Chats": "Chats", + "Call_already_ended": "Chamada já terminada!", + "Clear_cookies_alert": "Quer limpar todas as cookies?", + "Clear_cookies_desc": "Esta acção irá limpar todos os cookies de login, permitindo que você faça login em outras contas.", + "Clear_cookies_yes": "Sim, limpar cookies", + "Clear_cookies_no": "Não, guardar cookies", + "Click_to_join": "Clique para Entrar!", "Close": "Fechar", "Close_emoji_selector": "Fechar selector de emoticons", + "Closing_chat": "A fechar o chat", + "Change_language_loading": "Mudança de idioma.", + "Chat_closed_by_agent": "Chat fechado por agente", "Choose": "Escolher", "Choose_from_library": "Escolher da biblioteca", + "Choose_file": "Escolher arquivo", + "Choose_where_you_want_links_be_opened": "Escolha onde você quer que os links sejam abertos", "Code": "Código", + "Code_or_password_invalid": "Código ou senha inválidos", "Collaborative": "Colaborativa", "Confirm": "Confirmar", "Connect": "Ligar", "Connected": "Ligado", + "connecting_server": "conexão ao servidor", "Connecting": "A ligar...", + "Contact_us": "Contacte-nos", + "Contact_your_server_admin": "Contacte o administrador do seu servidor.", "Continue_with": "Continuar com", "Copied_to_clipboard": "Copiado para a área de transferência!", "Copy": "Copiar", + "Conversation": "Conversa", "Permalink": "Link permanente", + "Certificate_password": "Senha do Certificado", + "Clear_cache": "Limpar a cache do servidor local", + "Clear_cache_loading": "A limpar a cache.", + "Whats_the_password_for_your_certificate": "Qual é a senha para o seu certificado?", "Create_account": "Criar uma conta", "Create_Channel": "Criar Canal", + "Create_Direct_Messages": "Criar Mensagens Diretas", + "Create_Discussion": "Criar Discussão", "Created_snippet": "criado um extracto", "Create_a_new_workspace": "Criar um novo espaço de trabalho", "Create": "Criar", + "Custom_Status": "Status Personalizado", + "Dark": "Escuro", + "Dark_level": "Nível Escuro", + "Default": "Predefinição", + "Default_browser": "Navegador predefinido", "Delete_Room_Warning": "Apagar uma sala irá remover todas as mensagens contidas nela. Isto não pode ser desfeito.", + "Department": "Departamento", "delete": "apagar", "Delete": "Apagar", "DELETE": "APAGAR", + "move": "mover", "deleting_room": "apagando sala", "description": "descrição", "Description": "Descrição", + "Desktop_Options": "Opções da área de trabalho", + "Desktop_Notifications": "Notificações da área de trabalho", + "Desktop_Alert_info": "Estas notificações são entregues na área de trabalho", + "Directory": "Directório", "Direct_Messages": "Mensagens Directas", "Disable_notifications": "Desactivar notificações", + "Discussions": "Discussões", + "Discussion_Desc": "Ajude a manter uma visão geral sobre o que está acontecendo! Ao criar uma discussão, é criado um sub-canal do que você selecionou e ambos estão ligados.", + "Discussion_name": "Nome da discussão", + "Done": "Feito", "Dont_Have_An_Account": "Não tem uma conta?", + "Do_you_have_an_account": "Você tem uma conta?", + "Do_you_have_a_certificate": "Você tem um certificado?", "Do_you_really_want_to_key_this_room_question_mark": "Você quer mesmo {{key}} esta sala?", + "E2E_Encryption": "Encriptação E2E", + "E2E_How_It_Works_info1": "Agora você pode criar grupos privados criptografados e mensagens diretas. Você também pode alterar grupos privados existentes ou DMs para criptografados.", + "E2E_How_It_Works_info2": "Isto é *criptografia ponto a ponto* portanto a chave para codificar/descodificar as suas mensagens não será salva no servidor. Por essa razão *você precisa armazenar esta senha em algum lugar seguro* que você posa aceder mais tarde, se precisar.", + "E2E_How_It_Works_info3": "Se você prosseguir, uma senha E2E será gerada automaticamente.", + "E2E_How_It_Works_info4": "Você também pode configurar uma nova senha para sua chave de criptografia a qualquer momento a partir de qualquer navegador que você tenha inserido a senha existente do E2E.", "edit": "editar", + "edited": "editado", "Edit": "Editar", + "Edit_Status": "Editar Status", + "Edit_Invite": "Editar Convite", + "End_to_end_encrypted_room": "Sala encriptada de ponta a ponta", + "end_to_end_encryption": "encriptação de ponta a ponta", + "Email_Notification_Mode_All": "Cada Menção/DM", + "Email_Notification_Mode_Disabled": "Desactivado", "Email_or_password_field_is_empty": "O campo de e-mail ou palavra-passe está vazio", "Email": "E-mail", "email": "e-mail", + "Empty_title": "Título vazio", + "Enable_Auto_Translate": "Activar Auto-Tradução", "Enable_notifications": "Activar notificações", + "Encrypted": "Encriptado", + "Encrypted_message": "Mensagem encriptada", + "Enter_Your_E2E_Password": "Digite a sua senha E2E", + "Enter_Your_Encryption_Password_desc1": "Isto permitir-lhe-á aceder aos seus grupos privados encriptados e às suas mensagens directas.", + "Enter_Your_Encryption_Password_desc2": "Você precisa digitar a senha para codificar/descodificar mensagens em cada lugar que você usar o chat.", + "Encryption_error_title": "A sua senha de encriptação parece errada", + "Encryption_error_desc": "Não foi possível descodificar a sua chave de encriptação para ser importada.", "Everyone_can_access_this_channel": "Todos podem aceder a este canal", + "Everyone_can_access_this_team": "Todos podem aceder a esta equipa", "Error_uploading": "Erro ao fazer o envio", + "Expiration_Days": "Validade (Dias)", + "Favorite": "Favorito", "Favorites": "Favoritos", "Files": "Ficheiros", "File_description": "Descrição do ficheiro", "File_name": "Nome do ficheiro", "Finish_recording": "Terminar a gravação", + "Following_thread": "Seguir discussão", "For_your_security_you_must_enter_your_current_password_to_continue": "Para sua segurança, você deve escrever a sua palavra-passe actual para continuar", "Forgot_password_If_this_email_is_registered": "Se este e-mail estiver registado, enviaremos instruções sobre como repor a sua palavra-passe. Se você não receber um e-mail em breve, volte e tente novamente.", "Forgot_password": "Esquecer palavra-passe", "Forgot_Password": "Esquecer Palavra-passe", + "Forward": "Reencaminhar", + "Forward_Chat": "Reencaminhar Chat", + "Forward_to_department": "Reencaminhar para o departamento", + "Forward_to_user": "Reencaminhar para o utilizador", + "Full_table": "Clique para ver a tabela completa", + "Generate_New_Link": "Gerar Novo Link", "Group_by_favorites": "Agrupar por favoritos", "Group_by_type": "Agrupar por tipo", + "Hide": "Esconder", "Has_joined_the_channel": "entrou no canal", "Has_joined_the_conversation": "entrou na conversa", "Has_left_the_channel": "saiu do canal", + "Hide_System_Messages": "Esconder mensagens do sistema", + "Hide_type_messages": "Esconder mensagens \"{{type}}\"", + "How_It_Works": "Como Funciona", + "Message_HideType_uj": "Utilizador entrou", + "Message_HideType_ul": "Utilizador saiu", + "Message_HideType_ru": "Utilizador removido", + "Message_HideType_au": "Utilizador adicionado", + "Message_HideType_mute_unmute": "Utilizador silenciado/de-silenciado", + "Message_HideType_r": "Nome da sala alterado", + "Message_HideType_ut": "Utilizador entrou na conversação", + "Message_HideType_wm": "Bem-vindo", + "Message_HideType_rm": "Mensagem Removida", + "Message_HideType_subscription_role_added": "Foi definido o estatuto", + "Message_HideType_subscription_role_removed": "Definição de estatuto removida", + "Message_HideType_room_archived": "Sala arquivada", + "Message_HideType_room_unarchived": "Sala desarquivada", + "I_Saved_My_E2E_Password": "Guardei a minha senha E2E", + "IP": "IP", + "In_app": "Na aplicação", + "In_App_And_Desktop": "Na aplicação e área de trabalho", + "In_App_and_Desktop_Alert_info": "Exibe um banner no topo da tela quando a aplicação está aberto, e exibe uma notificação na área de trabalho", "Invisible": "Invisível", "Invite": "Convidar", "is_a_valid_RocketChat_instance": "é uma instância válida do Rocket.Chat", "is_not_a_valid_RocketChat_instance": "is not a valid Rocket.Chat instance", "is_typing": "está a escrever", + "Invalid_or_expired_invite_token": "Token de convite invalido ou expirado", "Invalid_server_version": "O servidor ao qual esta tentando ligar-se, utiliza uma versão que não é suporta pela aplicação: {{currentVersion}}.\n\nA versão mínima requerida é {{minVersion}}", + "Invite_Link": "Link de convite", + "Invite_users": "Convidar utilizadores", "Join": "Entrar", + "Join_Code": "Código de entrada", + "Insert_Join_Code": "Insira o código de entrada", + "Join_our_open_workspace": "Junte-se ao nosso espaço de trabalho aberto", + "Join_your_workspace": "Junte-se ao seu espaço de trabalho", "Just_invited_people_can_access_this_channel": "Apenas utilizadores convidados podem aceder a este canal", + "Just_invited_people_can_access_this_team": "Apenas pessoas convidadas podem aceder a esta equipa", "Language": "Idioma", "last_message": "última mensagem", "Leave_channel": "Sair do canal", "leaving_room": "a sair da sala", + "Leave": "Sair", "leave": "sair", "Legal": "Legal", + "Light": "Luz", + "License": "Licença", "Livechat": "Livechat", "Login": "Entrar", "Login_error": "As suas credenciais foram rejeitadas! Por favor, tente novamente.", "Login_with": "Entrar com", + "Logging_out": "A terminar a sessão.", "Logout": "Sair", + "Max_number_of_uses": "Número máximo de utilizações", + "Max_number_of_users_allowed_is_number": "O número máximo de utilizadores permitido é {{maxUsers}}", "members": "membros", "Members": "Membros", "Mentioned_Messages": "Mensagens Mencionadas", @@ -194,7 +318,13 @@ "Message_actions": "Acções de mensagem", "Message_pinned": "Mensagem afixada", "Message_removed": "Mensagem removida", + "Message_starred": "Mensagem estrelada", + "Message_unstarred": "Mensagem não estrelada", + "message": "mensagem", + "messages": "mensagens", + "Message": "Mensagem", "Messages": "Mensagens", + "Message_Reported": "Mensagem reportada", "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", @@ -202,52 +332,91 @@ "My_servers": "Meus servidores", "N_people_reacted": "{{n}} pessoas reagiram", "N_users": "{{n}} utilizadores", + "N_channels": "{{n}} canais", "name": "nome", "Name": "Nome", + "Navigation_history": "Histórico de navegação", + "Never": "Nunca", "New_Message": "Nova Mensagem", "New_Password": "Nova Palavra-passe", "New_Server": "Novo Servidor", "Next": "Próximo", "No_files": "Nenhum ficheiro", + "No_limit": "Sem limite", "No_mentioned_messages": "Nenhuma mensagem mencionada", "No_pinned_messages": "Nenhuma mensagem afixada", "No_results_found": "Nenhum resultado encontrado", "No_starred_messages": "Nenhuma mensagem marcada com estrela", + "No_thread_messages": "Sem mensagens de discussão ", + "No_label_provided": "{{label}} não fornecida/o", "No_Message": "Nenhuma mensagem", + "No_messages_yet": "Ainda sem mensagens", "No_Reactions": "Nenhuma reação", + "No_Read_Receipts": "Sem recibos de leitura", "Not_logged": "Não ligado", + "Not_RC_Server": "Isto não é um servidor Rocket.Chat.\n{{contact}}", + "Nothing": "Nada", "Nothing_to_save": "Nada para guardar!", "Notify_active_in_this_room": "Notifica utilizadores activos nesta sala", "Notify_all_in_this_room": "Notifica todos os utilizadores nesta sala", + "Notifications": "Notificações", + "Notification_Duration": "Duração da Notificação", + "Notification_Preferences": "Preferências de Notificação", + "No_available_agents_to_transfer": "Não há agentes disponíveis para transferir", "Offline": "Desligado", "Oops": "Oops!", + "Omnichannel": "Omnichannel", + "Open_Livechats": "Chats em andamento", + "Omnichannel_enable_alert": "Você não está disponível no Omnichannel. Você gostaria de estar disponível?", + "Onboarding_description": "Um espaço de trabalho é o espaço da sua equipa ou organização para colaborar. Peça ao administrador do espaço de trabalho um endereço para se juntar ou criar um para a sua equipa.", + "Onboarding_join_workspace": "Junte-se a um espaço de trabalho", + "Onboarding_subtitle": "Além da Colaboração da Equipe", "Onboarding_title": "Bem vindo(a) ao Rocket.Chat", + "Onboarding_join_open_description": "Junte-se ao nosso espaço de trabalho aberto para conversar com a equipa e comunidade Rocket.Chat.", + "Onboarding_agree_terms": "Ao continuar, você concorda com Rocket.Chat", + "Onboarding_less_options": "Menos opções", + "Onboarding_more_options": "Mais opções", "Online": "Ligado", "Only_authorized_users_can_write_new_messages": "Apenas utilizadores autorizados podem escrever novas mensagens", "Open_emoji_selector": "Abra o selector de emoticons", "Open_Source_Communication": "Comunicação Open Source", + "Open_your_authentication_app_and_enter_the_code": "Abra o seu aplicativo de autenticação e digite o código.", + "OR": "OU", + "OS": "OS", + "Overwrites_the_server_configuration_and_use_room_config": "Sobrescreve a configuração do servidor e a configuração da sala de uso", "Password": "Palavra-passe", + "Parent_channel_or_group": "Canal de origem ou grupo", "Permalink_copied_to_clipboard": "Link permanente copiado para a área de transferência!", + "Phone": "Telefone", "Pin": "Afixar", "Pinned_Messages": "Mensagens Afixadas", "pinned": "afixada", "Pinned": "Afixada", + "Please_add_a_comment": "Por favor, acrescente um comentário", "Please_enter_your_password": "Por favor, introduza a sua palavra-passe", + "Please_wait": "Por favor, espere.", + "Preferences": "Preferências", "Preferences_saved": "Preferências guardadas!", "Privacy_Policy": " Política de Privacidade", "Private_Channel": "Canal Privado", - "Private_Groups": "Grupos Privados", "Private": "Privado", + "Processing": "A processar...", "Profile_saved_successfully": "Perfil actualizado com sucesso!", "Profile": "Perfil", "Public_Channel": "Canal Público", "Public": "Público", + "Push_Notifications": "Notificações Push", + "Push_Notifications_Alert_Info": "Estas notificações são entregues quando o aplicativo não está aberto", "Quote": "Citar", "Reactions_are_disabled": "Reacções desactivadas", "Reactions_are_enabled": "Reacções activadas", "Reactions": "Reacções", + "Read": "Ler", + "Read_External_Permission_Message": "Rocket.Chat precisa acessar fotos, média e arquivos em seu dispositivo", + "Read_External_Permission": "Permissão de leitura da média", "Read_Only_Channel": "Canal só de leitura", "Read_Only": "Só de Leitura", + "Read_Receipt": "Recibos de leitura", "Register": "Registar", "Repeat_Password": "Repita a palavra-passe", "Reply": "Responder", diff --git a/app/i18n/locales/ru.json b/app/i18n/locales/ru.json index e5fca9504..58174b8ea 100644 --- a/app/i18n/locales/ru.json +++ b/app/i18n/locales/ru.json @@ -400,7 +400,6 @@ "Preferences_saved": "Настройки сохранены!", "Privacy_Policy": " Политика конфиденциальности", "Private_Channel": "Приватный канал", - "Private_Groups": "Приватные группы", "Private": "Приватный", "Processing": "Обработка...", "Profile_saved_successfully": "Профиль успешно сохранен!", @@ -724,6 +723,7 @@ "creating_team": "создание Команды", "team-name-already-exists": "Команда с таким названием уже существует", "Add_Channel_to_Team": "Добавить канал в Команду", + "Left_The_Team_Successfully": "Успешно покинул команду", "Create_New": "Создать", "Add_Existing": "Добавить существующее", "Add_Existing_Channel": "Добавить существующий канал", diff --git a/app/i18n/locales/tr.json b/app/i18n/locales/tr.json index 82959de8b..bc58ee92b 100644 --- a/app/i18n/locales/tr.json +++ b/app/i18n/locales/tr.json @@ -393,7 +393,6 @@ "Preferences_saved": "Tercihler kaydedildi!", "Privacy_Policy": " Privacy Policy", "Private_Channel": "Özel Kanal", - "Private_Groups": "Özel Gruplar", "Private": "Özel", "Processing": "İşleniyor...", "Profile_saved_successfully": "Profil başarıyla kaydedildi!", diff --git a/app/i18n/locales/zh-CN.json b/app/i18n/locales/zh-CN.json index 1b6fe974c..4836d9a83 100644 --- a/app/i18n/locales/zh-CN.json +++ b/app/i18n/locales/zh-CN.json @@ -390,7 +390,6 @@ "Preferences_saved": "偏好已保存!", "Privacy_Policy": "隐私政策", "Private_Channel": "私人频道", - "Private_Groups": "私人群组", "Private": "私有的", "Processing": "处理中", "Profile_saved_successfully": "个人资料保存成功!", diff --git a/app/i18n/locales/zh-TW.json b/app/i18n/locales/zh-TW.json index 6f60d155a..29626191c 100644 --- a/app/i18n/locales/zh-TW.json +++ b/app/i18n/locales/zh-TW.json @@ -391,7 +391,6 @@ "Preferences_saved": "偏好設定已被儲存!", "Privacy_Policy": "隱私政策", "Private_Channel": "私人頻道", - "Private_Groups": "私人群組", "Private": "私有的", "Processing": "處理中", "Profile_saved_successfully": "個人資料儲存成功!", diff --git a/app/index.js b/app/index.js index 048323a5b..efcf1557e 100644 --- a/app/index.js +++ b/app/index.js @@ -75,7 +75,7 @@ export default class Root extends React.Component { theme: defaultTheme(), themePreferences: { currentTheme: supportSystemTheme() ? 'automatic' : 'light', - darkLevel: 'dark' + darkLevel: 'black' }, width, height, diff --git a/app/lib/database/model/servers/User.js b/app/lib/database/model/servers/User.js index 5b4d3d65a..6d78c27fa 100644 --- a/app/lib/database/model/servers/User.js +++ b/app/lib/database/model/servers/User.js @@ -22,7 +22,7 @@ export default class User extends Model { @field('avatar_etag') avatarETag; - @field('login_email_password') loginEmailPassword; - @field('show_message_in_main_thread') showMessageInMainThread; + + @field('is_from_webview') isFromWebView; } diff --git a/app/lib/database/model/servers/migrations.js b/app/lib/database/model/servers/migrations.js index 782700a37..80954d475 100644 --- a/app/lib/database/model/servers/migrations.js +++ b/app/lib/database/model/servers/migrations.js @@ -95,6 +95,16 @@ export default schemaMigrations({ ] }) ] + }, { + toVersion: 11, + steps: [ + addColumns({ + table: 'users', + columns: [ + { name: 'is_from_webview', type: 'boolean', isOptional: true } + ] + }) + ] } ] }); diff --git a/app/lib/database/schema/servers.js b/app/lib/database/schema/servers.js index 0c81a72fc..1105cf165 100644 --- a/app/lib/database/schema/servers.js +++ b/app/lib/database/schema/servers.js @@ -1,7 +1,7 @@ import { appSchema, tableSchema } from '@nozbe/watermelondb'; export default appSchema({ - version: 10, + version: 11, tables: [ tableSchema({ name: 'users', @@ -15,7 +15,8 @@ export default appSchema({ { name: 'roles', type: 'string', isOptional: true }, { name: 'login_email_password', type: 'boolean', isOptional: true }, { name: 'show_message_in_main_thread', type: 'boolean', isOptional: true }, - { name: 'avatar_etag', type: 'string', isOptional: true } + { name: 'avatar_etag', type: 'string', isOptional: true }, + { name: 'is_from_webview', type: 'boolean', isOptional: true } ] }), tableSchema({ diff --git a/app/lib/methods/getPermissions.js b/app/lib/methods/getPermissions.js index 2b7da4765..1c4c56b46 100644 --- a/app/lib/methods/getPermissions.js +++ b/app/lib/methods/getPermissions.js @@ -6,6 +6,7 @@ import { compareServerVersion, methods } from '../utils'; import database from '../database'; import log from '../../utils/log'; import reduxStore from '../createStore'; +import RocketChat from '../rocketchat'; import protectedFunction from './helpers/protectedFunction'; import { setPermissions as setPermissionsAction } from '../../actions/permissions'; @@ -46,7 +47,8 @@ const PERMISSIONS = [ 'view-statistics', 'view-user-administration', 'view-all-teams', - 'view-all-team-channels' + 'view-all-team-channels', + 'convert-team' ]; export async function setPermissions() { @@ -128,7 +130,7 @@ export function getPermissions() { const db = database.active; const permissionsCollection = db.get('permissions'); const allRecords = await permissionsCollection.query().fetch(); - + RocketChat.subscribe('stream-notify-logged', 'permissions-changed'); // if server version is lower than 0.73.0, fetches from old api if (compareServerVersion(serverVersion, '0.73.0', methods.lowerThan)) { // RC 0.66.0 diff --git a/app/lib/methods/getRoles.js b/app/lib/methods/getRoles.js index df22d382b..98a3895e3 100644 --- a/app/lib/methods/getRoles.js +++ b/app/lib/methods/getRoles.js @@ -2,9 +2,66 @@ import { sanitizedRaw } from '@nozbe/watermelondb/RawRecord'; import database from '../database'; import log from '../../utils/log'; +import reduxStore from '../createStore'; import protectedFunction from './helpers/protectedFunction'; +import { + removeRoles, setRoles as setRolesAction, updateRoles +} from '../../actions/roles'; -export default function() { +export async function setRoles() { + const db = database.active; + const rolesCollection = db.collections.get('roles'); + const allRoles = await rolesCollection.query().fetch(); + const parsed = allRoles.reduce((acc, item) => ({ ...acc, [item.id]: item.description || item.id }), {}); + reduxStore.dispatch(setRolesAction(parsed)); +} + +export async function onRolesChanged(ddpMessage) { + const { type, _id, description } = ddpMessage.fields.args[0]; + if (/changed/.test(type)) { + const db = database.active; + const rolesCollection = db.get('roles'); + try { + const rolesRecord = await rolesCollection.find(_id); + try { + await db.action(async() => { + await rolesRecord.update((u) => { + u.description = description; + }); + }); + } catch (e) { + log(e); + } + reduxStore.dispatch(updateRoles(_id, description)); + } catch (err) { + try { + await db.action(async() => { + await rolesCollection.create((post) => { + post._raw = sanitizedRaw({ id: _id, description }, rolesCollection.schema); + }); + }); + } catch (e) { + log(e); + } + reduxStore.dispatch(updateRoles(_id, description || _id)); + } + } + if (/removed/.test(type)) { + const db = database.active; + const rolesCollection = db.get('roles'); + try { + const rolesRecord = await rolesCollection.find(_id); + await db.action(async() => { + await rolesRecord.destroyPermanently(); + }); + reduxStore.dispatch(removeRoles(_id)); + } catch (err) { + console.log(err); + } + } +} + +export function getRoles() { const db = database.active; return new Promise(async(resolve) => { try { @@ -50,6 +107,7 @@ export default function() { } catch (e) { log(e); } + setRoles(); return allRecords.length; }); return resolve(); diff --git a/app/lib/methods/getSettings.js b/app/lib/methods/getSettings.js index 6935631ef..be6ef1ee3 100644 --- a/app/lib/methods/getSettings.js +++ b/app/lib/methods/getSettings.js @@ -131,12 +131,17 @@ export async function setSettings() { 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() { try { 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 - 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) { return; diff --git a/app/lib/rocketchat.js b/app/lib/rocketchat.js index 6e7b3bcb2..59ee94fc5 100644 --- a/app/lib/rocketchat.js +++ b/app/lib/rocketchat.js @@ -28,7 +28,7 @@ import getUsersPresence, { getUserPresence, subscribeUsersPresence } from './met import protectedFunction from './methods/helpers/protectedFunction'; 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 { setPermissions, getPermissions } from './methods/getPermissions'; @@ -37,7 +37,7 @@ import { getEnterpriseModules, setEnterpriseModules, hasLicense, isOmnichannelModuleAvailable } from './methods/enterpriseModules'; import getSlashCommands from './methods/getSlashCommands'; -import getRoles from './methods/getRoles'; +import { getRoles, setRoles, onRolesChanged } from './methods/getRoles'; import canOpenRoom from './methods/canOpenRoom'; import triggerBlockAction, { triggerSubmitView, triggerCancel } from './methods/actions'; @@ -63,7 +63,9 @@ import UserPreferences from './userPreferences'; import { Encryption } from './encryption'; import EventEmitter from '../utils/events'; import { sanitizeLikeString } from './database/utils'; +import { updatePermission } from '../actions/permissions'; import { TEAM_TYPE } from '../definition/ITeam'; +import { updateSettings } from '../actions/settings'; const TOKEN_KEY = 'reactnativemeteor_usertoken'; const CURRENT_SERVER = 'currentServer'; @@ -225,6 +227,14 @@ const RocketChat = { this.usersListener.then(this.stopListener); } + if (this.notifyAllListener) { + this.notifyAllListener.then(this.stopListener); + } + + if (this.rolesListener) { + this.rolesListener.then(this.stopListener); + } + if (this.notifyLoggedListener) { this.notifyLoggedListener.then(this.stopListener); } @@ -274,6 +284,31 @@ const RocketChat = { this.usersListener = this.sdk.onStreamData('users', protectedFunction(ddpMessage => RocketChat._setUser(ddpMessage))); + this.notifyAllListener = this.sdk.onStreamData('stream-notify-all', protectedFunction(async(ddpMessage) => { + const { eventName } = ddpMessage.fields; + if (/public-settings-changed/.test(eventName)) { + const { _id, value } = ddpMessage.fields.args[1]; + const db = database.active; + const settingsCollection = db.get('settings'); + try { + const settingsRecord = await settingsCollection.find(_id); + const { type } = defaultSettings[_id]; + if (type) { + await db.action(async() => { + await settingsRecord.update((u) => { + u[type] = value; + }); + }); + } + reduxStore.dispatch(updateSettings(_id, value)); + } catch (e) { + log(e); + } + } + })); + + this.rolesListener = this.sdk.onStreamData('stream-roles', protectedFunction(ddpMessage => onRolesChanged(ddpMessage))); + this.notifyLoggedListener = this.sdk.onStreamData('stream-notify-logged', protectedFunction(async(ddpMessage) => { const { eventName } = ddpMessage.fields; if (/user-status/.test(eventName)) { @@ -310,6 +345,21 @@ const RocketChat = { } catch { // We can't create a new record since we don't receive the user._id } + } else if (/permissions-changed/.test(eventName)) { + const { _id, roles } = ddpMessage.fields.args[1]; + const db = database.active; + const permissionsCollection = db.get('permissions'); + try { + const permissionsRecord = await permissionsCollection.find(_id); + await db.action(async() => { + await permissionsRecord.update((u) => { + u.roles = roles; + }); + }); + reduxStore.dispatch(updatePermission(_id, roles)); + } catch (err) { + // + } } else if (/Users:NameChanged/.test(eventName)) { const userNameChanged = ddpMessage.fields.args[0]; const db = database.active; @@ -476,10 +526,10 @@ const RocketChat = { return this.post('users.forgotPassword', { email }, false); }, - loginTOTP(params, loginEmailPassword) { + loginTOTP(params, loginEmailPassword, isFromWebView = false) { return new Promise(async(resolve, reject) => { try { - const result = await this.login(params, loginEmailPassword); + const result = await this.login(params, isFromWebView); return resolve(result); } catch (e) { if (e.data?.error && (e.data.error === 'totp-required' || e.data.error === 'totp-invalid')) { @@ -542,15 +592,15 @@ const RocketChat = { return this.loginTOTP(params, true); }, - async loginOAuthOrSso(params) { - const result = await this.loginTOTP(params); - reduxStore.dispatch(loginRequest({ resume: result.token })); + async loginOAuthOrSso(params, isFromWebView = true) { + const result = await this.loginTOTP(params, false, isFromWebView); + reduxStore.dispatch(loginRequest({ resume: result.token }, false, isFromWebView)); }, - async login(params, loginEmailPassword) { + async login(credentials, isFromWebView = false) { const sdk = this.shareSDK || this.sdk; // RC 0.64.0 - await sdk.login(params); + await sdk.login(credentials); const { result } = sdk.currentLogin; const user = { id: result.userId, @@ -565,7 +615,7 @@ const RocketChat = { emails: result.me.emails, roles: result.me.roles, avatarETag: result.me.avatarETag, - loginEmailPassword, + isFromWebView, showMessageInMainThread: result.me.settings?.preferences?.showMessageInMainThread ?? true }; return user; @@ -816,6 +866,13 @@ const RocketChat = { }; 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) { // TODO: join code // RC 0.48.0 @@ -833,6 +890,7 @@ const RocketChat = { getSettings, getLoginSettings, setSettings, + subscribeSettings, getPermissions, setPermissions, getCustomEmojis, @@ -843,6 +901,7 @@ const RocketChat = { isOmnichannelModuleAvailable, getSlashCommands, getRoles, + setRoles, parseSettings: settings => settings.reduce((ret, item) => { ret[item._id] = defaultSettings[item._id] && item[defaultSettings[item._id].type]; if (item._id === 'Hide_System_Messages') { diff --git a/app/reducers/index.js b/app/reducers/index.js index dfee5f3eb..eb8f09d82 100644 --- a/app/reducers/index.js +++ b/app/reducers/index.js @@ -19,6 +19,7 @@ import createDiscussion from './createDiscussion'; import enterpriseModules from './enterpriseModules'; import encryption from './encryption'; import permissions from './permissions'; +import roles from './roles'; import inquiry from '../ee/omnichannel/reducers/inquiry'; @@ -43,5 +44,6 @@ export default combineReducers({ inquiry, enterpriseModules, encryption, - permissions + permissions, + roles }); diff --git a/app/reducers/permissions.js b/app/reducers/permissions.js index 1b3a14ec2..034c51420 100644 --- a/app/reducers/permissions.js +++ b/app/reducers/permissions.js @@ -1,13 +1,16 @@ import { PERMISSIONS } from '../actions/actionsTypes'; -const initialState = { - permissions: {} -}; +const initialState = {}; export default function permissions(state = initialState, action) { switch (action.type) { case PERMISSIONS.SET: return action.permissions; + case PERMISSIONS.UPDATE: + return { + ...state, + [action.payload.id]: action.payload.roles + }; default: return state; } diff --git a/app/reducers/roles.js b/app/reducers/roles.js new file mode 100644 index 000000000..93cbffcb0 --- /dev/null +++ b/app/reducers/roles.js @@ -0,0 +1,22 @@ +import { ROLES } from '../actions/actionsTypes'; + +const initialState = {}; + +export default function permissions(state = initialState, action) { + switch (action.type) { + case ROLES.SET: + return action.roles; + case ROLES.UPDATE: + return { + ...state, + [action.payload.id]: action.payload.desc || action.payload.id + }; + case ROLES.REMOVE: { + const newState = { ...state }; + delete newState[action.payload.id]; + return newState; + } + default: + return state; + } +} diff --git a/app/reducers/room.js b/app/reducers/room.js index de47fcede..980715051 100644 --- a/app/reducers/room.js +++ b/app/reducers/room.js @@ -28,7 +28,7 @@ export default function(state = initialState, action) { case ROOM.DELETE: return { ...state, - rid: action.rid, + rid: action.room.rid, isDeleting: true }; case ROOM.CLOSE: diff --git a/app/reducers/settings.js b/app/reducers/settings.js index 9e037b1d0..6e9ab5005 100644 --- a/app/reducers/settings.js +++ b/app/reducers/settings.js @@ -9,6 +9,11 @@ export default (state = initialState, action) => { ...state, ...action.payload }; + case SETTINGS.UPDATE: + return { + ...state, + [action.payload.id]: action.payload.value + }; case SETTINGS.CLEAR: return initialState; default: diff --git a/app/sagas/createChannel.js b/app/sagas/createChannel.js index a768916c8..9493d5405 100644 --- a/app/sagas/createChannel.js +++ b/app/sagas/createChannel.js @@ -41,10 +41,10 @@ const handleRequest = function* handleRequest({ data }) { encrypted } = data; logEvent(events.CT_CREATE, { - type, - readOnly, - broadcast, - encrypted + type: `${ type }`, + readOnly: `${ readOnly }`, + broadcast: `${ broadcast }`, + encrypted: `${ encrypted }` }); const result = yield call(createTeam, data); sub = { diff --git a/app/sagas/deepLinking.js b/app/sagas/deepLinking.js index 556573a54..a406f56a9 100644 --- a/app/sagas/deepLinking.js +++ b/app/sagas/deepLinking.js @@ -97,7 +97,7 @@ const fallbackNavigation = function* fallbackNavigation() { const handleOAuth = function* handleOAuth({ params }) { const { credentialToken, credentialSecret } = params; try { - yield RocketChat.loginOAuthOrSso({ oauth: { credentialToken, credentialSecret } }); + yield RocketChat.loginOAuthOrSso({ oauth: { credentialToken, credentialSecret } }, false); } catch (e) { log(e); } diff --git a/app/sagas/login.js b/app/sagas/login.js index 77eda7611..9381e0459 100644 --- a/app/sagas/login.js +++ b/app/sagas/login.js @@ -30,15 +30,15 @@ import Navigation from '../lib/Navigation'; const getServer = state => state.server.server; const loginWithPasswordCall = args => RocketChat.loginWithPassword(args); -const loginCall = args => RocketChat.login(args); +const loginCall = (credentials, isFromWebView) => RocketChat.login(credentials, isFromWebView); const logoutCall = args => RocketChat.logout(args); -const handleLoginRequest = function* handleLoginRequest({ credentials, logoutOnError = false }) { +const handleLoginRequest = function* handleLoginRequest({ credentials, logoutOnError = false, isFromWebView = false }) { logEvent(events.LOGIN_DEFAULT_LOGIN); try { let result; if (credentials.resume) { - result = yield call(loginCall, credentials); + result = yield loginCall(credentials, isFromWebView); } else { result = yield call(loginWithPasswordCall, credentials); } @@ -68,7 +68,6 @@ const handleLoginRequest = function* handleLoginRequest({ credentials, logoutOnE log(e); } }); - yield put(loginSuccess(result)); } } catch (e) { @@ -81,6 +80,10 @@ const handleLoginRequest = function* handleLoginRequest({ credentials, logoutOnE } }; +const subscribeSettings = function* subscribeSettings() { + yield RocketChat.subscribeSettings(); +}; + const fetchPermissions = function* fetchPermissions() { yield RocketChat.getPermissions(); }; @@ -90,6 +93,7 @@ const fetchCustomEmojis = function* fetchCustomEmojis() { }; const fetchRoles = function* fetchRoles() { + RocketChat.subscribe('stream-roles', 'roles'); yield RocketChat.getRoles(); }; @@ -133,6 +137,7 @@ const handleLoginSuccess = function* handleLoginSuccess({ user }) { yield fork(registerPushToken); yield fork(fetchUsersPresence); yield fork(fetchEnterpriseModules, { user }); + yield fork(subscribeSettings); yield put(encryptionInit()); setLanguage(user?.language); @@ -147,14 +152,13 @@ const handleLoginSuccess = function* handleLoginSuccess({ user }) { status: user.status, statusText: user.statusText, roles: user.roles, - loginEmailPassword: user.loginEmailPassword, + isFromWebView: user.isFromWebView, showMessageInMainThread: user.showMessageInMainThread, avatarETag: user.avatarETag }; yield serversDB.action(async() => { try { const userRecord = await usersCollection.find(user.id); - u.loginEmailPassword = userRecord?.loginEmailPassword; await userRecord.update((record) => { record._raw = sanitizedRaw({ id: user.id, ...record._raw }, usersCollection.schema); Object.assign(record, u); diff --git a/app/sagas/room.js b/app/sagas/room.js index e17a06da9..70a0bc4da 100644 --- a/app/sagas/room.js +++ b/app/sagas/room.js @@ -32,7 +32,7 @@ const watchUserTyping = function* watchUserTyping({ rid, status }) { } }; -const handleRemovedRoom = function* handleRemovedRoom(roomType) { +const handleRemovedRoom = function* handleRemovedRoom(roomType, actionType) { const isMasterDetail = yield select(state => state.app.isMasterDetail); if (isMasterDetail) { yield Navigation.navigate('DrawerNavigator'); @@ -40,9 +40,13 @@ const handleRemovedRoom = function* handleRemovedRoom(roomType) { yield Navigation.navigate('RoomsListView'); } - if (roomType === 'team') { - EventEmitter.emit(LISTENER, { message: I18n.t('Left_The_Team_Successfully') }); + if (actionType === 'leave') { + EventEmitter.emit(LISTENER, { message: roomType === 'team' ? I18n.t('Left_The_Team_Successfully') : I18n.t('Left_The_Room_Successfully') }); } + if (actionType === 'delete') { + EventEmitter.emit(LISTENER, { message: roomType === 'team' ? I18n.t('Deleted_The_Team_Successfully') : I18n.t('Deleted_The_Room_Successfully') }); + } + // types.ROOM.REMOVE is triggered by `subscriptions-changed` with `removed` arg const { timeout } = yield race({ @@ -66,7 +70,7 @@ const handleLeaveRoom = function* handleLeaveRoom({ room, roomType, selected }) } if (result?.success) { - yield handleRemovedRoom(roomType); + yield handleRemovedRoom(roomType, 'leave'); } } catch (e) { logEvent(events.RA_LEAVE_F); @@ -80,16 +84,23 @@ const handleLeaveRoom = function* handleLeaveRoom({ room, roomType, selected }) } }; -const handleDeleteRoom = function* handleDeleteRoom({ rid, t }) { +const handleDeleteRoom = function* handleDeleteRoom({ room, roomType, selected }) { logEvent(events.RI_EDIT_DELETE); try { - const result = yield RocketChat.deleteRoom(rid, t); - if (result.success) { - yield handleRemovedRoom(); + let result = {}; + + if (roomType === 'channel') { + result = yield RocketChat.deleteRoom(room.rid, room.t); + } else if (roomType === 'team') { + result = yield RocketChat.deleteTeam({ teamId: room.teamId, ...(selected && { roomsToRemove: selected }) }); + } + + if (result?.success) { + yield handleRemovedRoom(roomType, 'delete'); } } catch (e) { logEvent(events.RI_EDIT_DELETE_F); - Alert.alert(I18n.t('Oops'), I18n.t('There_was_an_error_while_action', { action: I18n.t('deleting_room') })); + Alert.alert(I18n.t('Oops'), I18n.t('There_was_an_error_while_action', { action: roomType === 'team' ? I18n.t('deleting_team') : I18n.t('deleting_room') })); } }; diff --git a/app/sagas/selectServer.js b/app/sagas/selectServer.js index d367274a3..2abf47061 100644 --- a/app/sagas/selectServer.js +++ b/app/sagas/selectServer.js @@ -125,6 +125,7 @@ const handleSelectServer = function* handleSelectServer({ server, version, fetch RocketChat.setSettings(); RocketChat.setCustomEmojis(); RocketChat.setPermissions(); + RocketChat.setRoles(); RocketChat.setEnterpriseModules(); let serverInfo; diff --git a/app/share.js b/app/share.js index bfe011264..dbf0bfbff 100644 --- a/app/share.js +++ b/app/share.js @@ -124,7 +124,7 @@ class Root extends React.Component { theme: defaultTheme(), themePreferences: { currentTheme: supportSystemTheme() ? 'automatic' : 'light', - darkLevel: 'dark' + darkLevel: 'black' }, root: '', width, diff --git a/app/utils/log/events.js b/app/utils/log/events.js index a183735ba..2ab3f539b 100644 --- a/app/utils/log/events.js +++ b/app/utils/log/events.js @@ -259,6 +259,8 @@ export default { RA_LEAVE_TEAM_F: 'ra_leave_team_f', RA_CONVERT_TO_TEAM: 'ra_convert_to_team', 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_F: 'ra_move_to_team_f', RA_SEARCH_TEAM: 'ra_search_team', diff --git a/app/utils/openLink.js b/app/utils/openLink.js index 36f72c0e2..703625497 100644 --- a/app/utils/openLink.js +++ b/app/utils/openLink.js @@ -39,16 +39,16 @@ const openLink = async(url, theme = 'light') => { try { const browser = await UserPreferences.getStringAsync(DEFAULT_BROWSER_KEY); - if (browser) { - const schemeUrl = appSchemeURL(url, browser.replace(':', '')); - await Linking.openURL(schemeUrl); - } else { + if (browser === 'inApp') { await WebBrowser.openBrowserAsync(url, { toolbarColor: themes[theme].headerBackground, controlsColor: themes[theme].headerTintColor, collapseToolbar: true, showTitle: true }); + } else { + const schemeUrl = appSchemeURL(url, browser.replace(':', '')); + await Linking.openURL(schemeUrl); } } catch { try { diff --git a/app/views/DefaultBrowserView.js b/app/views/DefaultBrowserView.js index 119ce9fa8..568802360 100644 --- a/app/views/DefaultBrowserView.js +++ b/app/views/DefaultBrowserView.js @@ -83,7 +83,7 @@ class DefaultBrowserView extends React.Component { isSelected = (value) => { const { browser } = this.state; - if (!browser && value === 'inApp') { + if (!browser && value === 'systemDefault:') { return true; } return browser === value; @@ -92,7 +92,7 @@ class DefaultBrowserView extends React.Component { changeDefaultBrowser = async(newBrowser) => { logEvent(events.DB_CHANGE_DEFAULT_BROWSER, { browser: newBrowser }); try { - const browser = newBrowser !== 'inApp' ? newBrowser : null; + const browser = newBrowser !== 'systemDefault:' ? newBrowser : null; await UserPreferences.setStringAsync(DEFAULT_BROWSER_KEY, browser); this.setState({ browser }); } catch { diff --git a/app/views/RoomActionsView/index.js b/app/views/RoomActionsView/index.js index d16ea5768..914a42913 100644 --- a/app/views/RoomActionsView/index.js +++ b/app/views/RoomActionsView/index.js @@ -50,6 +50,8 @@ class RoomActionsView extends React.Component { route: PropTypes.object, leaveRoom: PropTypes.func, jitsiEnabled: PropTypes.bool, + jitsiEnableTeams: PropTypes.bool, + jitsiEnableChannels: PropTypes.bool, encryptionEnabled: PropTypes.bool, setLoadingInvite: PropTypes.func, closeRoom: PropTypes.func, @@ -65,7 +67,8 @@ class RoomActionsView extends React.Component { viewBroadcastMemberListPermission: PropTypes.array, transferLivechatGuestPermission: PropTypes.array, createTeamPermission: PropTypes.array, - addTeamChannelPermission: PropTypes.array + addTeamChannelPermission: PropTypes.array, + convertTeamPermission: PropTypes.array } constructor(props) { @@ -89,7 +92,8 @@ class RoomActionsView extends React.Component { canEdit: false, canToggleEncryption: false, canCreateTeam: false, - canAddChannelToTeam: false + canAddChannelToTeam: false, + canConvertTeam: false }; if (room && room.observe && room.rid) { this.roomObservable = room.observe(); @@ -140,9 +144,10 @@ class RoomActionsView extends React.Component { const canViewMembers = await this.canViewMembers(); const canCreateTeam = await this.canCreateTeam(); const canAddChannelToTeam = await this.canAddChannelToTeam(); + const canConvertTeam = await this.canConvertTeam(); this.setState({ - canAutoTranslate, canAddUser, canInviteUser, canEdit, canToggleEncryption, canViewMembers, canCreateTeam, canAddChannelToTeam + canAutoTranslate, canAddUser, canInviteUser, canEdit, canToggleEncryption, canViewMembers, canCreateTeam, canAddChannelToTeam, canConvertTeam }); // livechat permissions @@ -238,6 +243,16 @@ class RoomActionsView extends React.Component { 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() => { const { room } = this.state; const { toggleRoomE2EEncryptionPermission } = this.props; @@ -431,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() => { const { room } = this.state; const { navigation, leaveRoom } = this.props; @@ -655,10 +723,15 @@ class RoomActionsView extends React.Component { renderJitsi = () => { const { room } = this.state; - const { jitsiEnabled } = this.props; - if (!jitsiEnabled || room.teamMain) { + const { jitsiEnabled, jitsiEnableTeams, jitsiEnableChannels } = this.props; + + const isJitsiDisabledForTeams = room.teamMain && !jitsiEnableTeams; + const isJitsiDisabledForChannels = !room.teamMain && (room.t === 'p' || room.t === 'c') && !jitsiEnableChannels; + + if (!jitsiEnabled || isJitsiDisabledForTeams || isJitsiDisabledForChannels) { return null; } + return ( @@ -799,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 + ? ( + <> + this.onPressTouchable({ + event: this.convertTeamToChannel + })} + testID='room-actions-convert-channel-to-team' + left={() => } + showActionIndicator + /> + + + ) + : null} + + ); + } + render() { const { room, membersCount, canViewMembers, canAddUser, canInviteUser, joined, canAutoTranslate, canForwardGuest, canReturnQueue @@ -1000,7 +1099,9 @@ class RoomActionsView extends React.Component { ) : null} + { this.teamChannelActions(t, room) } + {this.teamToChannelActions(t, room)} {['l'].includes(t) && !this.isOmnichannelPreview ? ( @@ -1078,6 +1179,8 @@ class RoomActionsView extends React.Component { const mapStateToProps = state => ({ jitsiEnabled: state.settings.Jitsi_Enabled || false, + jitsiEnableTeams: state.settings.Jitsi_Enable_Teams || false, + jitsiEnableChannels: state.settings.Jitsi_Enable_Channels || false, encryptionEnabled: state.encryption.enabled, serverVersion: state.server.version, isMasterDetail: state.app.isMasterDetail, @@ -1090,7 +1193,8 @@ const mapStateToProps = state => ({ viewBroadcastMemberListPermission: state.permissions['view-broadcast-member-list'], transferLivechatGuestPermission: state.permissions['transfer-livechat-guest'], 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 => ({ diff --git a/app/views/RoomInfoEditView/index.js b/app/views/RoomInfoEditView/index.js index d5dd7f0c5..28666b2ca 100644 --- a/app/views/RoomInfoEditView/index.js +++ b/app/views/RoomInfoEditView/index.js @@ -292,34 +292,11 @@ class RoomInfoEditView extends React.Component { }, 100); } - handleDeleteTeam = async(selected) => { - logEvent(events.RI_EDIT_DELETE_TEAM); - const { navigation, isMasterDetail } = this.props; - const { room } = this.state; - try { - const result = await RocketChat.deleteTeam({ teamId: room.teamId, ...(selected && { roomsToRemove: selected }) }); - if (result.success) { - if (isMasterDetail) { - navigation.navigate('DrawerNavigator'); - } else { - navigation.navigate('RoomsListView'); - } - } - } catch (e) { - logEvent(events.RI_EDIT_DELETE_TEAM_F); - log(e); - showErrorAlert( - e.data.error - ? I18n.t(e.data.error) - : I18n.t('There_was_an_error_while_action', { action: I18n.t('deleting_team') }), - I18n.t('Cannot_delete') - ); - } - } - deleteTeam = async() => { const { room } = this.state; - const { navigation } = this.props; + const { + navigation, deleteCPermission, deletePPermission, deleteRoom + } = this.props; try { const db = database.active; @@ -329,16 +306,27 @@ class RoomInfoEditView extends React.Component { Q.where('team_main', Q.notEq(true)) ); - if (teamChannels.length) { + const teamChannelOwner = []; + for (let i = 0; i < teamChannels.length; i += 1) { + const permissionType = teamChannels[i].t === 'c' ? deleteCPermission : deletePPermission; + // eslint-disable-next-line no-await-in-loop + const permissions = await RocketChat.hasPermission([ + permissionType + ], teamChannels[i].rid); + + if (permissions[0]) { teamChannelOwner.push(teamChannels[i]); } + } + + if (teamChannelOwner.length) { navigation.navigate('SelectListView', { title: 'Delete_Team', - data: teamChannels, + data: teamChannelOwner, infoText: 'Select_channels_to_delete', nextAction: (selected) => { showConfirmationAlert({ message: I18n.t('You_are_deleting_the_team', { team: RocketChat.getRoomTitle(room) }), confirmationText: I18n.t('Yes_action_it', { action: I18n.t('delete') }), - onPress: () => this.handleDeleteTeam(selected) + onPress: () => deleteRoom('team', room, selected) }); } }); @@ -346,7 +334,7 @@ class RoomInfoEditView extends React.Component { showConfirmationAlert({ message: I18n.t('You_are_deleting_the_team', { team: RocketChat.getRoomTitle(room) }), confirmationText: I18n.t('Yes_action_it', { action: I18n.t('delete') }), - onPress: () => this.handleDeleteTeam() + onPress: () => deleteRoom('team', room) }); } } catch (e) { @@ -375,7 +363,7 @@ class RoomInfoEditView extends React.Component { { text: I18n.t('Yes_action_it', { action: I18n.t('delete') }), style: 'destructive', - onPress: () => deleteRoom(room.rid, room.t) + onPress: () => deleteRoom('channel', room) } ], { cancelable: false } @@ -767,7 +755,7 @@ const mapStateToProps = state => ({ }); const mapDispatchToProps = dispatch => ({ - deleteRoom: (rid, t) => dispatch(deleteRoomAction(rid, t)) + deleteRoom: (roomType, room, selected) => dispatch(deleteRoomAction(roomType, room, selected)) }); export default connect(mapStateToProps, mapDispatchToProps)(withTheme(RoomInfoEditView)); diff --git a/app/views/RoomInfoView/index.js b/app/views/RoomInfoView/index.js index 93a7e3a16..a966463bf 100644 --- a/app/views/RoomInfoView/index.js +++ b/app/views/RoomInfoView/index.js @@ -6,7 +6,6 @@ import { connect } from 'react-redux'; import UAParser from 'ua-parser-js'; import isEmpty from 'lodash/isEmpty'; -import database from '../../lib/database'; import { CustomIcon } from '../../lib/Icons'; import Status from '../../containers/Status'; import Avatar from '../../containers/Avatar'; @@ -55,7 +54,8 @@ class RoomInfoView extends React.Component { theme: PropTypes.string, isMasterDetail: PropTypes.bool, jitsiEnabled: PropTypes.bool, - editRoomPermission: PropTypes.array + editRoomPermission: PropTypes.array, + roles: PropTypes.array } constructor(props) { @@ -133,18 +133,9 @@ class RoomInfoView extends React.Component { return room.t === 'l'; } - getRoleDescription = async(id) => { - const db = database.active; - try { - const rolesCollection = db.get('roles'); - const role = await rolesCollection.find(id); - if (role) { - return role.description; - } - return null; - } catch (e) { - return null; - } + getRoleDescription = (id) => { + const { roles } = this.props; + return roles[id]; }; loadVisitor = async() => { @@ -378,7 +369,8 @@ const mapStateToProps = state => ({ rooms: state.room.rooms, isMasterDetail: state.app.isMasterDetail, jitsiEnabled: state.settings.Jitsi_Enabled || false, - editRoomPermission: state.permissions['edit-room'] + editRoomPermission: state.permissions['edit-room'], + roles: state.roles }); export default connect(mapStateToProps)(withTheme(RoomInfoView)); diff --git a/app/views/RoomMembersView/index.js b/app/views/RoomMembersView/index.js index 5f0deb326..aaa0c98f9 100644 --- a/app/views/RoomMembersView/index.js +++ b/app/views/RoomMembersView/index.js @@ -49,7 +49,8 @@ class RoomMembersView extends React.Component { room: PropTypes.object, user: PropTypes.shape({ id: PropTypes.string, - token: PropTypes.string + token: PropTypes.string, + roles: PropTypes.array }), showActionSheet: PropTypes.func, theme: PropTypes.string, diff --git a/app/views/RoomView/List/NavBottomFAB.js b/app/views/RoomView/List/NavBottomFAB.js index 5c5aee746..481ac79a6 100644 --- a/app/views/RoomView/List/NavBottomFAB.js +++ b/app/views/RoomView/List/NavBottomFAB.js @@ -52,7 +52,7 @@ const NavBottomFAB = ({ y, onPress, isThread }) => { bottom += SEND_TO_CHANNEL_HEIGHT; } return ( - + item.id === messageId); if (index > -1) { - listRef.current.getNode().scrollToIndex({ index, viewPosition: 0.5 }); + listRef.current.getNode().scrollToIndex({ index, viewPosition: 0.5, viewOffset: 100 }); await new Promise(res => setTimeout(res, 300)); if (!this.viewableItems.map(vi => vi.key).includes(messageId)) { if (!this.jumping) { diff --git a/app/views/RoomsListView/index.js b/app/views/RoomsListView/index.js index 19df2c3b0..214f213e4 100644 --- a/app/views/RoomsListView/index.js +++ b/app/views/RoomsListView/index.js @@ -71,7 +71,6 @@ const DISCUSSIONS_HEADER = 'Discussions'; const TEAMS_HEADER = 'Teams'; const CHANNELS_HEADER = 'Channels'; const DM_HEADER = 'Direct_Messages'; -const GROUPS_HEADER = 'Private_Groups'; const OMNICHANNEL_HEADER = 'Open_Livechats'; const QUERY_SIZE = 20; @@ -480,13 +479,11 @@ class RoomsListView extends React.Component { if (groupByType) { const teams = chats.filter(s => filterIsTeam(s)); const discussions = chats.filter(s => filterIsDiscussion(s)); - const channels = chats.filter(s => s.t === 'c' && !filterIsDiscussion(s) && !filterIsTeam(s)); - const privateGroup = chats.filter(s => s.t === 'p' && !filterIsDiscussion(s) && !filterIsTeam(s)); + const channels = chats.filter(s => (s.t === 'c' || s.t === 'p') && !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(discussions, DISCUSSIONS_HEADER, tempChats); tempChats = this.addRoomsGroup(channels, CHANNELS_HEADER, tempChats); - tempChats = this.addRoomsGroup(privateGroup, GROUPS_HEADER, tempChats); tempChats = this.addRoomsGroup(direct, DM_HEADER, tempChats); } else if (showUnread || showFavorites || isOmnichannelAgent) { tempChats = this.addRoomsGroup(chats, CHATS_HEADER, tempChats); diff --git a/app/views/SettingsView/index.js b/app/views/SettingsView/index.js index 55687cf0f..5e696144b 100644 --- a/app/views/SettingsView/index.js +++ b/app/views/SettingsView/index.js @@ -65,7 +65,7 @@ class SettingsView extends React.Component { const usersCollection = db.get('users'); try { const userRecord = await usersCollection.find(user.id); - if (!userRecord.loginEmailPassword) { + if (userRecord.isFromWebView) { showConfirmationAlert({ title: I18n.t('Clear_cookies_alert'), message: I18n.t('Clear_cookies_desc'), diff --git a/app/views/SidebarView/index.js b/app/views/SidebarView/index.js index fd9d9bcc9..5bb465fd0 100644 --- a/app/views/SidebarView/index.js +++ b/app/views/SidebarView/index.js @@ -154,7 +154,7 @@ class Sidebar extends Component { text={I18n.t('Admin_Panel')} left={} onPress={() => this.sidebarNavigate(routeName)} - testID='sidebar-settings' + testID='sidebar-admin' current={this.currentItemKey === routeName} /> diff --git a/app/views/ThemeView.js b/app/views/ThemeView.js index e62d7ca58..1152a920c 100644 --- a/app/views/ThemeView.js +++ b/app/views/ThemeView.js @@ -30,14 +30,14 @@ const THEMES = [ label: 'Dark', value: 'dark', group: THEME_GROUP - }, { - label: 'Dark', - value: 'dark', - group: DARK_GROUP }, { label: 'Black', value: 'black', group: DARK_GROUP + }, { + label: 'Dark', + value: 'dark', + group: DARK_GROUP } ]; diff --git a/e2e/data.js b/e2e/data.js index 98257f71d..4dc093cc6 100644 --- a/e2e/data.js +++ b/e2e/data.js @@ -1,75 +1,76 @@ const random = require('./helpers/random'); + const value = random(20); const data = { - server: 'https://mobile.rocket.chat', - adminUser: 'e2e_admin', - adminPassword: 'p7mFh4yLwCRXSnMvG', - alternateServer: 'https://stable.rocket.chat', - users: { - regular: { - username: `userone${ value }`, - password: '123', - email: `mobile+regular${ value }@rocket.chat` - }, - alternate: { - username: `usertwo${ value }`, - password: '123', - email: `mobile+alternate${ value }@rocket.chat`, - totpSecret: 'NA4GOMZGHBQSK6KEFRVT62DMGJJGSYZJFZIHO3ZOGVXWCYZ6MMZQ' - }, - profileChanges: { - username: `userthree${ value }`, - password: '123', - email: `mobile+profileChanges${ value }@rocket.chat` - }, - existing: { - username: `existinguser${ value }`, - password: '123', - email: `mobile+existing${ value }@rocket.chat` - } - }, - channels: { - detoxpublic: { - name: 'detox-public' - }, - detoxpublicprotected: { - name: 'detox-public-protected', - joinCode: '123' - } - }, - groups: { - private: { - name: `detox-private-${ value }` - }, - alternate: { - name: `detox-alternate-${ value }` - } - }, - teams: { - private: { - name: `detox-team-${ value }` - } - }, - registeringUser: { - username: `newuser${ value }`, - password: `password${ value }`, - email: `mobile+registering${ value }@rocket.chat` - }, - registeringUser2: { - username: `newusertwo${ value }`, - password: `passwordtwo${ value }`, - email: `mobile+registeringtwo${ value }@rocket.chat` - }, - registeringUser3: { - username: `newuserthree${ value }`, - password: `passwordthree${ value }`, - email: `mobile+registeringthree${ value }@rocket.chat` - }, - registeringUser4: { - username: `newuserfour${ value }`, - password: `passwordfour${ value }`, - email: `mobile+registeringfour${ value }@rocket.chat` - }, - random: value -} + server: 'https://mobile.rocket.chat', + adminUser: 'e2e_admin', + adminPassword: 'p7mFh4yLwCRXSnMvG', + alternateServer: 'https://stable.rocket.chat', + users: { + regular: { + username: `userone${ value }`, + password: '123', + email: `mobile+regular${ value }@rocket.chat` + }, + alternate: { + username: `usertwo${ value }`, + password: '123', + email: `mobile+alternate${ value }@rocket.chat`, + totpSecret: 'NA4GOMZGHBQSK6KEFRVT62DMGJJGSYZJFZIHO3ZOGVXWCYZ6MMZQ' + }, + profileChanges: { + username: `userthree${ value }`, + password: '123', + email: `mobile+profileChanges${ value }@rocket.chat` + }, + existing: { + username: `existinguser${ value }`, + password: '123', + email: `mobile+existing${ value }@rocket.chat` + } + }, + channels: { + detoxpublic: { + name: 'detox-public' + }, + detoxpublicprotected: { + name: 'detox-public-protected', + joinCode: '123' + } + }, + groups: { + private: { + name: `detox-private-${ value }` + }, + alternate: { + name: `detox-alternate-${ value }` + } + }, + teams: { + private: { + name: `detox-team-${ value }` + } + }, + registeringUser: { + username: `newuser${ value }`, + password: `password${ value }`, + email: `mobile+registering${ value }@rocket.chat` + }, + registeringUser2: { + username: `newusertwo${ value }`, + password: `passwordtwo${ value }`, + email: `mobile+registeringtwo${ value }@rocket.chat` + }, + registeringUser3: { + username: `newuserthree${ value }`, + password: `passwordthree${ value }`, + email: `mobile+registeringthree${ value }@rocket.chat` + }, + registeringUser4: { + username: `newuserfour${ value }`, + password: `passwordfour${ value }`, + email: `mobile+registeringfour${ value }@rocket.chat` + }, + random: value +}; module.exports = data; diff --git a/e2e/data/data.cloud.js b/e2e/data/data.cloud.js index c69b72515..df98fdd7a 100644 --- a/e2e/data/data.cloud.js +++ b/e2e/data/data.cloud.js @@ -1,72 +1,74 @@ +// eslint-disable-next-line import/no-unresolved const random = require('./helpers/random'); + const value = random(20); const data = { - server: 'https://mobile.rocket.chat', - adminUser: 'e2e_admin', - adminPassword: 'p7mFh4yLwCRXSnMvG', - alternateServer: 'https://stable.rocket.chat', - users: { - regular: { - username: `userone${ value }`, - password: '123', - email: `mobile+regular${ value }@rocket.chat` - }, - alternate: { - username: `usertwo${ value }`, - password: '123', - email: `mobile+alternate${ value }@rocket.chat`, - totpSecret: 'NA4GOMZGHBQSK6KEFRVT62DMGJJGSYZJFZIHO3ZOGVXWCYZ6MMZQ' - }, - profileChanges: { - username: `userthree${ value }`, - password: '123', - email: `mobile+profileChanges${ value }@rocket.chat` - }, - existing: { - username: `existinguser${ value }`, - password: '123', - email: `mobile+existing${ value }@rocket.chat` - } - }, - channels: { - detoxpublic: { - name: 'detox-public' - }, - detoxpublicprotected: { - name: 'detox-public-protected', - joinCode: '123' - } - }, - groups: { - private: { - name: `detox-private-${ value }` - } - }, - teams: { - private: { - name: `detox-team-${ value }` - } - }, - registeringUser: { - username: `newuser${ value }`, - password: `password${ value }`, - email: `mobile+registering${ value }@rocket.chat` - }, - registeringUser2: { - username: `newusertwo${ value }`, - password: `passwordtwo${ value }`, - email: `mobile+registeringtwo${ value }@rocket.chat` - }, - registeringUser3: { - username: `newuserthree${ value }`, - password: `passwordthree${ value }`, - email: `mobile+registeringthree${ value }@rocket.chat` - }, - registeringUser4: { - username: `newuserfour${ value }`, - password: `passwordfour${ value }`, - email: `mobile+registeringfour${ value }@rocket.chat` - }, - random: value -} + server: 'https://mobile.rocket.chat', + adminUser: 'e2e_admin', + adminPassword: 'p7mFh4yLwCRXSnMvG', + alternateServer: 'https://stable.rocket.chat', + users: { + regular: { + username: `userone${ value }`, + password: '123', + email: `mobile+regular${ value }@rocket.chat` + }, + alternate: { + username: `usertwo${ value }`, + password: '123', + email: `mobile+alternate${ value }@rocket.chat`, + totpSecret: 'NA4GOMZGHBQSK6KEFRVT62DMGJJGSYZJFZIHO3ZOGVXWCYZ6MMZQ' + }, + profileChanges: { + username: `userthree${ value }`, + password: '123', + email: `mobile+profileChanges${ value }@rocket.chat` + }, + existing: { + username: `existinguser${ value }`, + password: '123', + email: `mobile+existing${ value }@rocket.chat` + } + }, + channels: { + detoxpublic: { + name: 'detox-public' + }, + detoxpublicprotected: { + name: 'detox-public-protected', + joinCode: '123' + } + }, + groups: { + private: { + name: `detox-private-${ value }` + } + }, + teams: { + private: { + name: `detox-team-${ value }` + } + }, + registeringUser: { + username: `newuser${ value }`, + password: `password${ value }`, + email: `mobile+registering${ value }@rocket.chat` + }, + registeringUser2: { + username: `newusertwo${ value }`, + password: `passwordtwo${ value }`, + email: `mobile+registeringtwo${ value }@rocket.chat` + }, + registeringUser3: { + username: `newuserthree${ value }`, + password: `passwordthree${ value }`, + email: `mobile+registeringthree${ value }@rocket.chat` + }, + registeringUser4: { + username: `newuserfour${ value }`, + password: `passwordfour${ value }`, + email: `mobile+registeringfour${ value }@rocket.chat` + }, + random: value +}; module.exports = data; diff --git a/e2e/data/data.docker.js b/e2e/data/data.docker.js index 31fb5c8e2..6c3ce1925 100644 --- a/e2e/data/data.docker.js +++ b/e2e/data/data.docker.js @@ -1,75 +1,77 @@ +// eslint-disable-next-line import/no-unresolved const random = require('./helpers/random'); + const value = random(20); const data = { - server: 'http://localhost:3000', - adminUser: 'admin', - adminPassword: 'password', - alternateServer: 'https://stable.rocket.chat', - users: { - regular: { - username: `userone${ value }`, - password: '123', - email: `mobile+regular${ value }@rocket.chat` - }, - alternate: { - username: `usertwo${ value }`, - password: '123', - email: `mobile+alternate${ value }@rocket.chat`, - totpSecret: 'NA4GOMZGHBQSK6KEFRVT62DMGJJGSYZJFZIHO3ZOGVXWCYZ6MMZQ' - }, - profileChanges: { - username: `userthree${ value }`, - password: '123', - email: `mobile+profileChanges${ value }@rocket.chat` - }, - existing: { - username: `existinguser${ value }`, - password: '123', - email: `mobile+existing${ value }@rocket.chat` - } - }, - channels: { - detoxpublic: { - name: 'detox-public' - }, - detoxpublicprotected: { - name: 'detox-public-protected', - joinCode: '123' - } - }, - groups: { - private: { - name: `detox-private-${ value }` - }, - alternate: { - name: `detox-alternate-${ value }` - } - }, - teams: { - private: { - name: `detox-team-${ value }` - } - }, - registeringUser: { - username: `newuser${ value }`, - password: `password${ value }`, - email: `mobile+registering${ value }@rocket.chat` - }, - registeringUser2: { - username: `newusertwo${ value }`, - password: `passwordtwo${ value }`, - email: `mobile+registeringtwo${ value }@rocket.chat` - }, - registeringUser3: { - username: `newuserthree${ value }`, - password: `passwordthree${ value }`, - email: `mobile+registeringthree${ value }@rocket.chat` - }, - registeringUser4: { - username: `newuserfour${ value }`, - password: `passwordfour${ value }`, - email: `mobile+registeringfour${ value }@rocket.chat` - }, - random: value -} + server: 'http://localhost:3000', + adminUser: 'admin', + adminPassword: 'password', + alternateServer: 'https://stable.rocket.chat', + users: { + regular: { + username: `userone${ value }`, + password: '123', + email: `mobile+regular${ value }@rocket.chat` + }, + alternate: { + username: `usertwo${ value }`, + password: '123', + email: `mobile+alternate${ value }@rocket.chat`, + totpSecret: 'NA4GOMZGHBQSK6KEFRVT62DMGJJGSYZJFZIHO3ZOGVXWCYZ6MMZQ' + }, + profileChanges: { + username: `userthree${ value }`, + password: '123', + email: `mobile+profileChanges${ value }@rocket.chat` + }, + existing: { + username: `existinguser${ value }`, + password: '123', + email: `mobile+existing${ value }@rocket.chat` + } + }, + channels: { + detoxpublic: { + name: 'detox-public' + }, + detoxpublicprotected: { + name: 'detox-public-protected', + joinCode: '123' + } + }, + groups: { + private: { + name: `detox-private-${ value }` + }, + alternate: { + name: `detox-alternate-${ value }` + } + }, + teams: { + private: { + name: `detox-team-${ value }` + } + }, + registeringUser: { + username: `newuser${ value }`, + password: `password${ value }`, + email: `mobile+registering${ value }@rocket.chat` + }, + registeringUser2: { + username: `newusertwo${ value }`, + password: `passwordtwo${ value }`, + email: `mobile+registeringtwo${ value }@rocket.chat` + }, + registeringUser3: { + username: `newuserthree${ value }`, + password: `passwordthree${ value }`, + email: `mobile+registeringthree${ value }@rocket.chat` + }, + registeringUser4: { + username: `newuserfour${ value }`, + password: `passwordfour${ value }`, + email: `mobile+registeringfour${ value }@rocket.chat` + }, + random: value +}; module.exports = data; diff --git a/e2e/docker/docker-entrypoint-initdb.d/rocketchat_message.js b/e2e/docker/docker-entrypoint-initdb.d/rocketchat_message.js index 407e7a93a..a553fcfe5 100644 --- a/e2e/docker/docker-entrypoint-initdb.d/rocketchat_message.js +++ b/e2e/docker/docker-entrypoint-initdb.d/rocketchat_message.js @@ -1 +1,336 @@ -db.getCollection("rocketchat_message").insert({"_id":"fsy2dZJgmmboowJ8N","t":"uj","rid":"GENERAL","ts":new Date(1584022608462),"msg":"admin","u":{"_id":"nM6vXyDLGGzSPsLNy","username":"admin"},"groupable":false,"_updatedAt":new Date(1584022608462)}); +db.getCollection("rocketchat_message").insert({"_id":"25g4bk7cQTqeyW9xX","alias":"","msg":"269","attachments":[],"parseUrls":true,"groupable":false,"ts":new Date("2021-06-14T21:27:44.857Z"),"u":{"_id":"nM6vXyDLGGzSPsLNy","username":"admin","name":"Admin"},"rid":"GFR2xxircSsyJxx9F","_updatedAt":new Date("2021-06-14T21:27:44.877Z"),"urls":[],"mentions":[],"channels":[],"md":[{"type":"PARAGRAPH","value":[{"type":"PLAIN_TEXT","value":"269"}]}]}); +db.getCollection("rocketchat_message").insert({"_id":"27T4qRvruK3gEjecs","alias":"","msg":"65","attachments":[],"parseUrls":true,"groupable":false,"ts":new Date("2021-06-14T21:26:26.854Z"),"u":{"_id":"nM6vXyDLGGzSPsLNy","username":"admin","name":"Admin"},"rid":"GFR2xxircSsyJxx9F","_updatedAt":new Date("2021-06-14T21:26:26.877Z"),"urls":[],"mentions":[],"channels":[],"md":[{"type":"PARAGRAPH","value":[{"type":"PLAIN_TEXT","value":"65"}]}]}); +db.getCollection("rocketchat_message").insert({"_id":"28TThiTu5Zg8wQY9v","alias":"","msg":"140","attachments":[],"parseUrls":true,"groupable":false,"ts":new Date("2021-06-14T21:26:56.012Z"),"u":{"_id":"nM6vXyDLGGzSPsLNy","username":"admin","name":"Admin"},"rid":"GFR2xxircSsyJxx9F","_updatedAt":new Date("2021-06-14T21:26:56.077Z"),"urls":[],"mentions":[],"channels":[],"md":[{"type":"PARAGRAPH","value":[{"type":"PLAIN_TEXT","value":"140"}]}]}); +db.getCollection("rocketchat_message").insert({"_id":"2DgDaqyxjmY4svGae","alias":"","msg":"6","attachments":[],"parseUrls":true,"groupable":false,"ts":new Date("2021-06-14T21:26:06.180Z"),"u":{"_id":"nM6vXyDLGGzSPsLNy","username":"admin","name":"Admin"},"rid":"GFR2xxircSsyJxx9F","_updatedAt":new Date("2021-06-14T21:26:06.216Z"),"urls":[],"mentions":[],"channels":[],"md":[{"type":"PARAGRAPH","value":[{"type":"PLAIN_TEXT","value":"6"}]}]}); +db.getCollection("rocketchat_message").insert({"_id":"2SFwgauKjRMRR7xAw","alias":"","msg":"69","attachments":[],"parseUrls":true,"groupable":false,"ts":new Date("2021-06-14T21:26:28.291Z"),"u":{"_id":"nM6vXyDLGGzSPsLNy","username":"admin","name":"Admin"},"rid":"GFR2xxircSsyJxx9F","_updatedAt":new Date("2021-06-14T21:26:28.313Z"),"urls":[],"mentions":[],"channels":[],"md":[{"type":"PARAGRAPH","value":[{"type":"PLAIN_TEXT","value":"69"}]}]}); +db.getCollection("rocketchat_message").insert({"_id":"3G7XJ6EEy3vQdBQeh","alias":"","msg":"14","attachments":[],"parseUrls":true,"groupable":false,"ts":new Date("2021-06-14T21:26:09.074Z"),"u":{"_id":"nM6vXyDLGGzSPsLNy","username":"admin","name":"Admin"},"rid":"GFR2xxircSsyJxx9F","_updatedAt":new Date("2021-06-14T21:26:09.095Z"),"urls":[],"mentions":[],"channels":[],"md":[{"type":"PARAGRAPH","value":[{"type":"PLAIN_TEXT","value":"14"}]}]}); +db.getCollection("rocketchat_message").insert({"_id":"3T5juo5b4Co7uApwW","alias":"","msg":"277","attachments":[],"parseUrls":true,"groupable":false,"ts":new Date("2021-06-14T21:27:47.697Z"),"u":{"_id":"nM6vXyDLGGzSPsLNy","username":"admin","name":"Admin"},"rid":"GFR2xxircSsyJxx9F","_updatedAt":new Date("2021-06-14T21:27:47.749Z"),"urls":[],"mentions":[],"channels":[],"md":[{"type":"PARAGRAPH","value":[{"type":"PLAIN_TEXT","value":"277"}]}]}); +db.getCollection("rocketchat_message").insert({"_id":"3bMfuSmJ3iunG2kWG","alias":"","msg":"156","attachments":[],"parseUrls":true,"groupable":false,"ts":new Date("2021-06-14T21:27:02.432Z"),"u":{"_id":"nM6vXyDLGGzSPsLNy","username":"admin","name":"Admin"},"rid":"GFR2xxircSsyJxx9F","_updatedAt":new Date("2021-06-14T21:27:02.450Z"),"urls":[],"mentions":[],"channels":[],"md":[{"type":"PARAGRAPH","value":[{"type":"PLAIN_TEXT","value":"156"}]}]}); +db.getCollection("rocketchat_message").insert({"_id":"4AcYis8t69TC9hxJp","alias":"","msg":"7","attachments":[],"parseUrls":true,"groupable":false,"ts":new Date("2021-06-14T21:26:06.556Z"),"u":{"_id":"nM6vXyDLGGzSPsLNy","username":"admin","name":"Admin"},"rid":"GFR2xxircSsyJxx9F","_updatedAt":new Date("2021-06-14T21:26:06.581Z"),"urls":[],"mentions":[],"channels":[],"md":[{"type":"PARAGRAPH","value":[{"type":"PLAIN_TEXT","value":"7"}]}]}); +db.getCollection("rocketchat_message").insert({"_id":"4FiDijAfM3ANmQrkz","alias":"","msg":"141","attachments":[],"parseUrls":true,"groupable":false,"ts":new Date("2021-06-14T21:26:56.415Z"),"u":{"_id":"nM6vXyDLGGzSPsLNy","username":"admin","name":"Admin"},"rid":"GFR2xxircSsyJxx9F","_updatedAt":new Date("2021-06-14T21:26:56.436Z"),"urls":[],"mentions":[],"channels":[],"md":[{"type":"PARAGRAPH","value":[{"type":"PLAIN_TEXT","value":"141"}]}]}); +db.getCollection("rocketchat_message").insert({"_id":"4S9c9YvEogNtfNH4c","alias":"","msg":"119","attachments":[],"parseUrls":true,"groupable":false,"ts":new Date("2021-06-14T21:26:46.073Z"),"u":{"_id":"nM6vXyDLGGzSPsLNy","username":"admin","name":"Admin"},"rid":"GFR2xxircSsyJxx9F","_updatedAt":new Date("2021-06-14T21:26:46.091Z"),"urls":[],"mentions":[],"channels":[],"md":[{"type":"PARAGRAPH","value":[{"type":"PLAIN_TEXT","value":"119"}]}]}); +db.getCollection("rocketchat_message").insert({"_id":"4SzoQmu5hrY4a3M33","alias":"","msg":"252","attachments":[],"parseUrls":true,"groupable":false,"ts":new Date("2021-06-14T21:27:38.832Z"),"u":{"_id":"nM6vXyDLGGzSPsLNy","username":"admin","name":"Admin"},"rid":"GFR2xxircSsyJxx9F","_updatedAt":new Date("2021-06-14T21:27:38.859Z"),"urls":[],"mentions":[],"channels":[],"md":[{"type":"PARAGRAPH","value":[{"type":"PLAIN_TEXT","value":"252"}]}]}); +db.getCollection("rocketchat_message").insert({"_id":"4fmsF37sxqF3LaKg8","alias":"","msg":"158","attachments":[],"parseUrls":true,"groupable":false,"ts":new Date("2021-06-14T21:27:03.277Z"),"u":{"_id":"nM6vXyDLGGzSPsLNy","username":"admin","name":"Admin"},"rid":"GFR2xxircSsyJxx9F","_updatedAt":new Date("2021-06-14T21:27:03.310Z"),"urls":[],"mentions":[],"channels":[],"md":[{"type":"PARAGRAPH","value":[{"type":"PLAIN_TEXT","value":"158"}]}]}); +db.getCollection("rocketchat_message").insert({"_id":"4jZn8QgT2zggqpbtK","alias":"","msg":"230","attachments":[],"parseUrls":true,"groupable":false,"ts":new Date("2021-06-14T21:27:30.893Z"),"u":{"_id":"nM6vXyDLGGzSPsLNy","username":"admin","name":"Admin"},"rid":"GFR2xxircSsyJxx9F","_updatedAt":new Date("2021-06-14T21:27:30.929Z"),"urls":[],"mentions":[],"channels":[],"md":[{"type":"PARAGRAPH","value":[{"type":"PLAIN_TEXT","value":"230"}]}]}); +db.getCollection("rocketchat_message").insert({"_id":"4mGv8Pz8o4CDdN2oC","alias":"","msg":"264","attachments":[],"parseUrls":true,"groupable":false,"ts":new Date("2021-06-14T21:27:43.105Z"),"u":{"_id":"nM6vXyDLGGzSPsLNy","username":"admin","name":"Admin"},"rid":"GFR2xxircSsyJxx9F","_updatedAt":new Date("2021-06-14T21:27:43.131Z"),"urls":[],"mentions":[],"channels":[],"md":[{"type":"PARAGRAPH","value":[{"type":"PLAIN_TEXT","value":"264"}]}]}); +db.getCollection("rocketchat_message").insert({"_id":"5JuWjrs4ZgYa3CXxk","alias":"","msg":"49","attachments":[],"parseUrls":true,"groupable":false,"ts":new Date("2021-06-14T21:26:21.227Z"),"u":{"_id":"nM6vXyDLGGzSPsLNy","username":"admin","name":"Admin"},"rid":"GFR2xxircSsyJxx9F","_updatedAt":new Date("2021-06-14T21:26:21.244Z"),"urls":[],"mentions":[],"channels":[],"md":[{"type":"PARAGRAPH","value":[{"type":"PLAIN_TEXT","value":"49"}]}]}); +db.getCollection("rocketchat_message").insert({"_id":"5W9TAvaKJQfoFnftA","alias":"","msg":"37","attachments":[],"parseUrls":true,"groupable":false,"ts":new Date("2021-06-14T21:26:17.145Z"),"u":{"_id":"nM6vXyDLGGzSPsLNy","username":"admin","name":"Admin"},"rid":"GFR2xxircSsyJxx9F","_updatedAt":new Date("2021-06-14T21:26:17.159Z"),"urls":[],"mentions":[],"channels":[],"md":[{"type":"PARAGRAPH","value":[{"type":"PLAIN_TEXT","value":"37"}]}]}); +db.getCollection("rocketchat_message").insert({"_id":"5bqiprtBR4RAxWAcL","alias":"","msg":"43","attachments":[],"parseUrls":true,"groupable":false,"ts":new Date("2021-06-14T21:26:19.185Z"),"u":{"_id":"nM6vXyDLGGzSPsLNy","username":"admin","name":"Admin"},"rid":"GFR2xxircSsyJxx9F","_updatedAt":new Date("2021-06-14T21:26:19.198Z"),"urls":[],"mentions":[],"channels":[],"md":[{"type":"PARAGRAPH","value":[{"type":"PLAIN_TEXT","value":"43"}]}]}); +db.getCollection("rocketchat_message").insert({"_id":"5nCCCn7KHyca899Lj","rid":"5iyMRT843rNn4wwHv","tmid":"NAXDFHoxA44rsyujh","msg":"23","ts":new Date("2021-06-14T21:27:07.177Z"),"u":{"_id":"nM6vXyDLGGzSPsLNy","username":"admin","name":"Admin"},"_updatedAt":new Date("2021-06-14T21:27:07.273Z"),"urls":[],"mentions":[],"channels":[],"md":[{"type":"PARAGRAPH","value":[{"type":"PLAIN_TEXT","value":"23"}]}]}); +db.getCollection("rocketchat_message").insert({"_id":"6HicGvqNRy6dsDehP","alias":"","msg":"240","attachments":[],"parseUrls":true,"groupable":false,"ts":new Date("2021-06-14T21:27:34.481Z"),"u":{"_id":"nM6vXyDLGGzSPsLNy","username":"admin","name":"Admin"},"rid":"GFR2xxircSsyJxx9F","_updatedAt":new Date("2021-06-14T21:27:34.519Z"),"urls":[],"mentions":[],"channels":[],"md":[{"type":"PARAGRAPH","value":[{"type":"PLAIN_TEXT","value":"240"}]}]}); +db.getCollection("rocketchat_message").insert({"_id":"6oNMwTjCXmcXTWeLj","alias":"","msg":"279","attachments":[],"parseUrls":true,"groupable":false,"ts":new Date("2021-06-14T21:27:48.701Z"),"u":{"_id":"nM6vXyDLGGzSPsLNy","username":"admin","name":"Admin"},"rid":"GFR2xxircSsyJxx9F","_updatedAt":new Date("2021-06-14T21:27:48.797Z"),"urls":[],"mentions":[],"channels":[],"md":[{"type":"PARAGRAPH","value":[{"type":"PLAIN_TEXT","value":"279"}]}]}); +db.getCollection("rocketchat_message").insert({"_id":"6tHmYHoJAZqKSP7uw","alias":"","msg":"176","attachments":[],"parseUrls":true,"groupable":false,"ts":new Date("2021-06-14T21:27:10.472Z"),"u":{"_id":"nM6vXyDLGGzSPsLNy","username":"admin","name":"Admin"},"rid":"GFR2xxircSsyJxx9F","_updatedAt":new Date("2021-06-14T21:27:10.490Z"),"urls":[],"mentions":[],"channels":[],"md":[{"type":"PARAGRAPH","value":[{"type":"PLAIN_TEXT","value":"176"}]}]}); +db.getCollection("rocketchat_message").insert({"_id":"7QNXvEFxMPLDtemuA","alias":"","msg":"223","attachments":[],"parseUrls":true,"groupable":false,"ts":new Date("2021-06-14T21:27:28.287Z"),"u":{"_id":"nM6vXyDLGGzSPsLNy","username":"admin","name":"Admin"},"rid":"GFR2xxircSsyJxx9F","_updatedAt":new Date("2021-06-14T21:27:28.311Z"),"urls":[],"mentions":[],"channels":[],"md":[{"type":"PARAGRAPH","value":[{"type":"PLAIN_TEXT","value":"223"}]}]}); +db.getCollection("rocketchat_message").insert({"_id":"7f3WTwk9pZkbjDrZG","alias":"","msg":"52","attachments":[],"parseUrls":true,"groupable":false,"ts":new Date("2021-06-14T21:26:22.277Z"),"u":{"_id":"nM6vXyDLGGzSPsLNy","username":"admin","name":"Admin"},"rid":"GFR2xxircSsyJxx9F","_updatedAt":new Date("2021-06-14T21:26:22.290Z"),"urls":[],"mentions":[],"channels":[],"md":[{"type":"PARAGRAPH","value":[{"type":"PLAIN_TEXT","value":"52"}]}]}); +db.getCollection("rocketchat_message").insert({"_id":"7gkmpM68YanWe3JP2","alias":"","msg":"287","attachments":[],"parseUrls":true,"groupable":false,"ts":new Date("2021-06-14T21:27:51.637Z"),"u":{"_id":"nM6vXyDLGGzSPsLNy","username":"admin","name":"Admin"},"rid":"GFR2xxircSsyJxx9F","_updatedAt":new Date("2021-06-14T21:27:51.660Z"),"urls":[],"mentions":[],"channels":[],"md":[{"type":"PARAGRAPH","value":[{"type":"PLAIN_TEXT","value":"287"}]}]}); +db.getCollection("rocketchat_message").insert({"_id":"7mSpBnb8Bdt2aZoWL","rid":"5iyMRT843rNn4wwHv","tmid":"NAXDFHoxA44rsyujh","msg":"19","ts":new Date("2021-06-14T21:27:02.653Z"),"u":{"_id":"nM6vXyDLGGzSPsLNy","username":"admin","name":"Admin"},"_updatedAt":new Date("2021-06-14T21:27:02.754Z"),"urls":[],"mentions":[],"channels":[],"md":[{"type":"PARAGRAPH","value":[{"type":"PLAIN_TEXT","value":"19"}]}]}); +db.getCollection("rocketchat_message").insert({"_id":"7r8wpE8yzyiZEgpcw","alias":"","msg":"28","attachments":[],"parseUrls":true,"groupable":false,"ts":new Date("2021-06-14T21:26:14.018Z"),"u":{"_id":"nM6vXyDLGGzSPsLNy","username":"admin","name":"Admin"},"rid":"GFR2xxircSsyJxx9F","_updatedAt":new Date("2021-06-14T21:26:14.042Z"),"urls":[],"mentions":[],"channels":[],"md":[{"type":"PARAGRAPH","value":[{"type":"PLAIN_TEXT","value":"28"}]}]}); +db.getCollection("rocketchat_message").insert({"_id":"8KnWQxmRM5NGYt97J","alias":"","msg":"33","attachments":[],"parseUrls":true,"groupable":false,"ts":new Date("2021-06-14T21:26:15.789Z"),"u":{"_id":"nM6vXyDLGGzSPsLNy","username":"admin","name":"Admin"},"rid":"GFR2xxircSsyJxx9F","_updatedAt":new Date("2021-06-14T21:26:15.808Z"),"urls":[],"mentions":[],"channels":[],"md":[{"type":"PARAGRAPH","value":[{"type":"PLAIN_TEXT","value":"33"}]}]}); +db.getCollection("rocketchat_message").insert({"_id":"8vPWvDmtXEzEFwg4d","alias":"","msg":"96","attachments":[],"parseUrls":true,"groupable":false,"ts":new Date("2021-06-14T21:26:37.960Z"),"u":{"_id":"nM6vXyDLGGzSPsLNy","username":"admin","name":"Admin"},"rid":"GFR2xxircSsyJxx9F","_updatedAt":new Date("2021-06-14T21:26:37.980Z"),"urls":[],"mentions":[],"channels":[],"md":[{"type":"PARAGRAPH","value":[{"type":"PLAIN_TEXT","value":"96"}]}]}); +db.getCollection("rocketchat_message").insert({"_id":"9DR7WEyTEAR6ExK4n","alias":"","msg":"19","attachments":[],"parseUrls":true,"groupable":false,"ts":new Date("2021-06-14T21:26:10.849Z"),"u":{"_id":"nM6vXyDLGGzSPsLNy","username":"admin","name":"Admin"},"rid":"GFR2xxircSsyJxx9F","_updatedAt":new Date("2021-06-14T21:26:10.868Z"),"urls":[],"mentions":[],"channels":[],"md":[{"type":"PARAGRAPH","value":[{"type":"PLAIN_TEXT","value":"19"}]}]}); +db.getCollection("rocketchat_message").insert({"_id":"9FSFRTmi68FXt8xdT","alias":"","msg":"185","attachments":[],"parseUrls":true,"groupable":false,"ts":new Date("2021-06-14T21:27:14.428Z"),"u":{"_id":"nM6vXyDLGGzSPsLNy","username":"admin","name":"Admin"},"rid":"GFR2xxircSsyJxx9F","_updatedAt":new Date("2021-06-14T21:27:14.457Z"),"urls":[],"mentions":[],"channels":[],"md":[{"type":"PARAGRAPH","value":[{"type":"PLAIN_TEXT","value":"185"}]}]}); +db.getCollection("rocketchat_message").insert({"_id":"9Nc4sS2DozyAiH8is","alias":"","msg":"13","attachments":[],"parseUrls":true,"groupable":false,"ts":new Date("2021-06-14T21:26:08.724Z"),"u":{"_id":"nM6vXyDLGGzSPsLNy","username":"admin","name":"Admin"},"rid":"GFR2xxircSsyJxx9F","_updatedAt":new Date("2021-06-14T21:26:08.740Z"),"urls":[],"mentions":[],"channels":[],"md":[{"type":"PARAGRAPH","value":[{"type":"PLAIN_TEXT","value":"13"}]}]}); +db.getCollection("rocketchat_message").insert({"_id":"9R36G3Pe8yhFxWzar","alias":"","msg":"3","attachments":[],"parseUrls":true,"groupable":false,"ts":new Date("2021-06-14T21:25:53.009Z"),"u":{"_id":"nM6vXyDLGGzSPsLNy","username":"admin","name":"Admin"},"rid":"GFR2xxircSsyJxx9F","_updatedAt":new Date("2021-06-14T21:25:53.045Z"),"urls":[],"mentions":[],"channels":[],"md":[{"type":"PARAGRAPH","value":[{"type":"PLAIN_TEXT","value":"3"}]}]}); +db.getCollection("rocketchat_message").insert({"_id":"9S5QEDoXxXZbf9Fsw","rid":"5iyMRT843rNn4wwHv","tmid":"NAXDFHoxA44rsyujh","msg":"15","ts":new Date("2021-06-14T21:26:57.249Z"),"u":{"_id":"nM6vXyDLGGzSPsLNy","username":"admin","name":"Admin"},"_updatedAt":new Date("2021-06-14T21:26:57.352Z"),"urls":[],"mentions":[],"channels":[],"md":[{"type":"PARAGRAPH","value":[{"type":"PLAIN_TEXT","value":"15"}]}]}); +db.getCollection("rocketchat_message").insert({"_id":"9TXDBQRA375tcDAJG","alias":"","msg":"108","attachments":[],"parseUrls":true,"groupable":false,"ts":new Date("2021-06-14T21:26:42.213Z"),"u":{"_id":"nM6vXyDLGGzSPsLNy","username":"admin","name":"Admin"},"rid":"GFR2xxircSsyJxx9F","_updatedAt":new Date("2021-06-14T21:26:42.225Z"),"urls":[],"mentions":[],"channels":[],"md":[{"type":"PARAGRAPH","value":[{"type":"PLAIN_TEXT","value":"108"}]}]}); +db.getCollection("rocketchat_message").insert({"_id":"9WvB32ZFdk7v7yrNb","alias":"","msg":"53","attachments":[],"parseUrls":true,"groupable":false,"ts":new Date("2021-06-14T21:26:22.619Z"),"u":{"_id":"nM6vXyDLGGzSPsLNy","username":"admin","name":"Admin"},"rid":"GFR2xxircSsyJxx9F","_updatedAt":new Date("2021-06-14T21:26:22.646Z"),"urls":[],"mentions":[],"channels":[],"md":[{"type":"PARAGRAPH","value":[{"type":"PLAIN_TEXT","value":"53"}]}]}); +db.getCollection("rocketchat_message").insert({"_id":"9x8puw8kLeqXxajNW","alias":"","msg":"293","attachments":[],"parseUrls":true,"groupable":false,"ts":new Date("2021-06-14T21:27:53.759Z"),"u":{"_id":"nM6vXyDLGGzSPsLNy","username":"admin","name":"Admin"},"rid":"GFR2xxircSsyJxx9F","_updatedAt":new Date("2021-06-14T21:27:53.787Z"),"urls":[],"mentions":[],"channels":[],"md":[{"type":"PARAGRAPH","value":[{"type":"PLAIN_TEXT","value":"293"}]}]}); +db.getCollection("rocketchat_message").insert({"_id":"9xfhY2uCdwbGALd49","alias":"","msg":"91","attachments":[],"parseUrls":true,"groupable":false,"ts":new Date("2021-06-14T21:26:36.152Z"),"u":{"_id":"nM6vXyDLGGzSPsLNy","username":"admin","name":"Admin"},"rid":"GFR2xxircSsyJxx9F","_updatedAt":new Date("2021-06-14T21:26:36.169Z"),"urls":[],"mentions":[],"channels":[],"md":[{"type":"PARAGRAPH","value":[{"type":"PLAIN_TEXT","value":"91"}]}]}); +db.getCollection("rocketchat_message").insert({"_id":"AmnEoreNR26FcXbnh","alias":"","msg":"130","attachments":[],"parseUrls":true,"groupable":false,"ts":new Date("2021-06-14T21:26:51.034Z"),"u":{"_id":"nM6vXyDLGGzSPsLNy","username":"admin","name":"Admin"},"rid":"GFR2xxircSsyJxx9F","_updatedAt":new Date("2021-06-14T21:26:51.171Z"),"urls":[],"mentions":[],"channels":[],"md":[{"type":"PARAGRAPH","value":[{"type":"PLAIN_TEXT","value":"130"}]}]}); +db.getCollection("rocketchat_message").insert({"_id":"ApW3E6fzGtuQLfvSX","alias":"","msg":"282","attachments":[],"parseUrls":true,"groupable":false,"ts":new Date("2021-06-14T21:27:49.845Z"),"u":{"_id":"nM6vXyDLGGzSPsLNy","username":"admin","name":"Admin"},"rid":"GFR2xxircSsyJxx9F","_updatedAt":new Date("2021-06-14T21:27:49.862Z"),"urls":[],"mentions":[],"channels":[],"md":[{"type":"PARAGRAPH","value":[{"type":"PLAIN_TEXT","value":"282"}]}]}); +db.getCollection("rocketchat_message").insert({"_id":"AqMwxaxRzT5neeEfe","alias":"","msg":"187","attachments":[],"parseUrls":true,"groupable":false,"ts":new Date("2021-06-14T21:27:15.298Z"),"u":{"_id":"nM6vXyDLGGzSPsLNy","username":"admin","name":"Admin"},"rid":"GFR2xxircSsyJxx9F","_updatedAt":new Date("2021-06-14T21:27:15.331Z"),"urls":[],"mentions":[],"channels":[],"md":[{"type":"PARAGRAPH","value":[{"type":"PLAIN_TEXT","value":"187"}]}]}); +db.getCollection("rocketchat_message").insert({"_id":"BE8zexooqkDwuKcu4","alias":"","msg":"56","attachments":[],"parseUrls":true,"groupable":false,"ts":new Date("2021-06-14T21:26:23.666Z"),"u":{"_id":"nM6vXyDLGGzSPsLNy","username":"admin","name":"Admin"},"rid":"GFR2xxircSsyJxx9F","_updatedAt":new Date("2021-06-14T21:26:23.691Z"),"urls":[],"mentions":[],"channels":[],"md":[{"type":"PARAGRAPH","value":[{"type":"PLAIN_TEXT","value":"56"}]}]}); +db.getCollection("rocketchat_message").insert({"_id":"BFMr3FJ9NNLP5wESf","rid":"5iyMRT843rNn4wwHv","tmid":"NAXDFHoxA44rsyujh","msg":"27","ts":new Date("2021-06-14T21:27:11.827Z"),"u":{"_id":"nM6vXyDLGGzSPsLNy","username":"admin","name":"Admin"},"_updatedAt":new Date("2021-06-14T21:27:11.887Z"),"urls":[],"mentions":[],"channels":[],"md":[{"type":"PARAGRAPH","value":[{"type":"PLAIN_TEXT","value":"27"}]}]}); +db.getCollection("rocketchat_message").insert({"_id":"BXRu9xh39qwHnEXka","alias":"","msg":"94","attachments":[],"parseUrls":true,"groupable":false,"ts":new Date("2021-06-14T21:26:37.229Z"),"u":{"_id":"nM6vXyDLGGzSPsLNy","username":"admin","name":"Admin"},"rid":"GFR2xxircSsyJxx9F","_updatedAt":new Date("2021-06-14T21:26:37.275Z"),"urls":[],"mentions":[],"channels":[],"md":[{"type":"PARAGRAPH","value":[{"type":"PLAIN_TEXT","value":"94"}]}]}); +db.getCollection("rocketchat_message").insert({"_id":"Bs8ReZaE4SiwXH49J","alias":"","msg":"300","attachments":[],"parseUrls":true,"groupable":false,"ts":new Date("2021-06-14T21:27:56.256Z"),"u":{"_id":"nM6vXyDLGGzSPsLNy","username":"admin","name":"Admin"},"rid":"GFR2xxircSsyJxx9F","_updatedAt":new Date("2021-06-14T21:27:56.274Z"),"urls":[],"mentions":[],"channels":[],"md":[{"type":"PARAGRAPH","value":[{"type":"PLAIN_TEXT","value":"300"}]}]}); +db.getCollection("rocketchat_message").insert({"_id":"Bsb2nDT8oPwFvj9gN","alias":"","msg":"217","attachments":[],"parseUrls":true,"groupable":false,"ts":new Date("2021-06-14T21:27:26.154Z"),"u":{"_id":"nM6vXyDLGGzSPsLNy","username":"admin","name":"Admin"},"rid":"GFR2xxircSsyJxx9F","_updatedAt":new Date("2021-06-14T21:27:26.179Z"),"urls":[],"mentions":[],"channels":[],"md":[{"type":"PARAGRAPH","value":[{"type":"PLAIN_TEXT","value":"217"}]}]}); +db.getCollection("rocketchat_message").insert({"_id":"BvrzmaZKFccyhkrf3","alias":"","msg":"296","attachments":[],"parseUrls":true,"groupable":false,"ts":new Date("2021-06-14T21:27:54.842Z"),"u":{"_id":"nM6vXyDLGGzSPsLNy","username":"admin","name":"Admin"},"rid":"GFR2xxircSsyJxx9F","_updatedAt":new Date("2021-06-14T21:27:54.879Z"),"urls":[],"mentions":[],"channels":[],"md":[{"type":"PARAGRAPH","value":[{"type":"PLAIN_TEXT","value":"296"}]}]}); +db.getCollection("rocketchat_message").insert({"_id":"C89pRcerYNnApXwKZ","rid":"GFR2xxircSsyJxx9F","msg":"http://localhost:3000/group/jumping-thread?msg=rMbGKvG834q8EeNGs Go to a thread from another room","ts":new Date("2021-06-14T21:28:09.973Z"),"u":{"_id":"nM6vXyDLGGzSPsLNy","username":"admin","name":"Admin"},"_updatedAt":new Date("2021-06-14T21:28:10.019Z"),"attachments":[{"text":"Go to jumping-thread's thread","author_name":"admin","author_icon":"/avatar/admin","message_link":"http://localhost:3000/group/jumping-thread?msg=rMbGKvG834q8EeNGs","attachments":[],"ts":new Date("2021-06-14T21:26:48.151Z")}],"urls":[{"url":"http://localhost:3000/group/jumping-thread?msg=rMbGKvG834q8EeNGs","ignoreParse":true}],"mentions":[],"channels":[],"md":[{"type":"PARAGRAPH","value":[{"type":"LINK","value":{"src":{"type":"PLAIN_TEXT","value":"http://localhost:3000/group/jumping-thread?msg=rMbGKvG834q8EeNGs"},"label":{"type":"PLAIN_TEXT","value":"http://localhost:3000/group/jumping-thread?msg=rMbGKvG834q8EeNGs"}}},{"type":"PLAIN_TEXT","value":" Go to a thread from another room"}]}]}); +db.getCollection("rocketchat_message").insert({"_id":"CRefYtg5f6n2oZhJx","alias":"","msg":"274","attachments":[],"parseUrls":true,"groupable":false,"ts":new Date("2021-06-14T21:27:46.586Z"),"u":{"_id":"nM6vXyDLGGzSPsLNy","username":"admin","name":"Admin"},"rid":"GFR2xxircSsyJxx9F","_updatedAt":new Date("2021-06-14T21:27:46.637Z"),"urls":[],"mentions":[],"channels":[],"md":[{"type":"PARAGRAPH","value":[{"type":"PLAIN_TEXT","value":"274"}]}]}); +db.getCollection("rocketchat_message").insert({"_id":"CpMDo5fbb9Np54Xr7","rid":"5iyMRT843rNn4wwHv","tmid":"NAXDFHoxA44rsyujh","msg":"30","ts":new Date("2021-06-14T21:27:14.710Z"),"u":{"_id":"nM6vXyDLGGzSPsLNy","username":"admin","name":"Admin"},"_updatedAt":new Date("2021-06-14T21:27:14.781Z"),"urls":[],"mentions":[],"channels":[],"md":[{"type":"PARAGRAPH","value":[{"type":"PLAIN_TEXT","value":"30"}]}]}); +db.getCollection("rocketchat_message").insert({"_id":"CwHLm3reBwwttySP4","alias":"","msg":"117","attachments":[],"parseUrls":true,"groupable":false,"ts":new Date("2021-06-14T21:26:45.367Z"),"u":{"_id":"nM6vXyDLGGzSPsLNy","username":"admin","name":"Admin"},"rid":"GFR2xxircSsyJxx9F","_updatedAt":new Date("2021-06-14T21:26:45.387Z"),"urls":[],"mentions":[],"channels":[],"md":[{"type":"PARAGRAPH","value":[{"type":"PLAIN_TEXT","value":"117"}]}]}); +db.getCollection("rocketchat_message").insert({"_id":"D7kQQ9vtmq7LfJdFk","rid":"5iyMRT843rNn4wwHv","tmid":"NAXDFHoxA44rsyujh","msg":"18","ts":new Date("2021-06-14T21:27:01.154Z"),"u":{"_id":"nM6vXyDLGGzSPsLNy","username":"admin","name":"Admin"},"_updatedAt":new Date("2021-06-14T21:27:01.218Z"),"urls":[],"mentions":[],"channels":[],"md":[{"type":"PARAGRAPH","value":[{"type":"PLAIN_TEXT","value":"18"}]}]}); +db.getCollection("rocketchat_message").insert({"_id":"DR2ZakcJvyi3BTJLR","alias":"","msg":"54","attachments":[],"parseUrls":true,"groupable":false,"ts":new Date("2021-06-14T21:26:22.975Z"),"u":{"_id":"nM6vXyDLGGzSPsLNy","username":"admin","name":"Admin"},"rid":"GFR2xxircSsyJxx9F","_updatedAt":new Date("2021-06-14T21:26:22.992Z"),"urls":[],"mentions":[],"channels":[],"md":[{"type":"PARAGRAPH","value":[{"type":"PLAIN_TEXT","value":"54"}]}]}); +db.getCollection("rocketchat_message").insert({"_id":"DRAftv7fhYwBSF98P","alias":"","msg":"24","attachments":[],"parseUrls":true,"groupable":false,"ts":new Date("2021-06-14T21:26:12.620Z"),"u":{"_id":"nM6vXyDLGGzSPsLNy","username":"admin","name":"Admin"},"rid":"GFR2xxircSsyJxx9F","_updatedAt":new Date("2021-06-14T21:26:12.640Z"),"urls":[],"mentions":[],"channels":[],"md":[{"type":"PARAGRAPH","value":[{"type":"PLAIN_TEXT","value":"24"}]}]}); +db.getCollection("rocketchat_message").insert({"_id":"DuShMW4P9kiXnzMr4","alias":"","msg":"239","attachments":[],"parseUrls":true,"groupable":false,"ts":new Date("2021-06-14T21:27:34.091Z"),"u":{"_id":"nM6vXyDLGGzSPsLNy","username":"admin","name":"Admin"},"rid":"GFR2xxircSsyJxx9F","_updatedAt":new Date("2021-06-14T21:27:34.112Z"),"urls":[],"mentions":[],"channels":[],"md":[{"type":"PARAGRAPH","value":[{"type":"PLAIN_TEXT","value":"239"}]}]}); +db.getCollection("rocketchat_message").insert({"_id":"DvKX5qbzg8CWE3oNC","alias":"","msg":"1","attachments":[],"parseUrls":true,"groupable":false,"ts":new Date("2021-06-14T21:24:50.182Z"),"u":{"_id":"nM6vXyDLGGzSPsLNy","username":"admin","name":"Admin"},"rid":"GFR2xxircSsyJxx9F","_updatedAt":new Date("2021-06-14T21:24:50.225Z"),"urls":[],"mentions":[],"channels":[],"md":[{"type":"PARAGRAPH","value":[{"type":"PLAIN_TEXT","value":"1"}]}]}); +db.getCollection("rocketchat_message").insert({"_id":"DyAyQRLtPHqKwRYZb","alias":"","msg":"235","attachments":[],"parseUrls":true,"groupable":false,"ts":new Date("2021-06-14T21:27:32.703Z"),"u":{"_id":"nM6vXyDLGGzSPsLNy","username":"admin","name":"Admin"},"rid":"GFR2xxircSsyJxx9F","_updatedAt":new Date("2021-06-14T21:27:32.719Z"),"urls":[],"mentions":[],"channels":[],"md":[{"type":"PARAGRAPH","value":[{"type":"PLAIN_TEXT","value":"235"}]}]}); +db.getCollection("rocketchat_message").insert({"_id":"E5ntzuwrjmcGiyQFd","alias":"","msg":"299","attachments":[],"parseUrls":true,"groupable":false,"ts":new Date("2021-06-14T21:27:55.903Z"),"u":{"_id":"nM6vXyDLGGzSPsLNy","username":"admin","name":"Admin"},"rid":"GFR2xxircSsyJxx9F","_updatedAt":new Date("2021-06-14T21:27:55.925Z"),"urls":[],"mentions":[],"channels":[],"md":[{"type":"PARAGRAPH","value":[{"type":"PLAIN_TEXT","value":"299"}]}]}); +db.getCollection("rocketchat_message").insert({"_id":"EamwALjFX46fhnDC6","alias":"","msg":"268","attachments":[],"parseUrls":true,"groupable":false,"ts":new Date("2021-06-14T21:27:44.506Z"),"u":{"_id":"nM6vXyDLGGzSPsLNy","username":"admin","name":"Admin"},"rid":"GFR2xxircSsyJxx9F","_updatedAt":new Date("2021-06-14T21:27:44.520Z"),"urls":[],"mentions":[],"channels":[],"md":[{"type":"PARAGRAPH","value":[{"type":"PLAIN_TEXT","value":"268"}]}]}); +db.getCollection("rocketchat_message").insert({"_id":"EiMDrXBS86EqZGZhs","alias":"","msg":"234","attachments":[],"parseUrls":true,"groupable":false,"ts":new Date("2021-06-14T21:27:32.356Z"),"u":{"_id":"nM6vXyDLGGzSPsLNy","username":"admin","name":"Admin"},"rid":"GFR2xxircSsyJxx9F","_updatedAt":new Date("2021-06-14T21:27:32.376Z"),"urls":[],"mentions":[],"channels":[],"md":[{"type":"PARAGRAPH","value":[{"type":"PLAIN_TEXT","value":"234"}]}]}); +db.getCollection("rocketchat_message").insert({"_id":"EvEcMv66r75xb8FjX","alias":"","msg":"266","attachments":[],"parseUrls":true,"groupable":false,"ts":new Date("2021-06-14T21:27:43.803Z"),"u":{"_id":"nM6vXyDLGGzSPsLNy","username":"admin","name":"Admin"},"rid":"GFR2xxircSsyJxx9F","_updatedAt":new Date("2021-06-14T21:27:43.823Z"),"urls":[],"mentions":[],"channels":[],"md":[{"type":"PARAGRAPH","value":[{"type":"PLAIN_TEXT","value":"266"}]}]}); +db.getCollection("rocketchat_message").insert({"_id":"FAzwPcfoLftoNXBLQ","alias":"","msg":"257","attachments":[],"parseUrls":true,"groupable":false,"ts":new Date("2021-06-14T21:27:40.641Z"),"u":{"_id":"nM6vXyDLGGzSPsLNy","username":"admin","name":"Admin"},"rid":"GFR2xxircSsyJxx9F","_updatedAt":new Date("2021-06-14T21:27:40.661Z"),"urls":[],"mentions":[],"channels":[],"md":[{"type":"PARAGRAPH","value":[{"type":"PLAIN_TEXT","value":"257"}]}]}); +db.getCollection("rocketchat_message").insert({"_id":"FHdJd7cStGBRp6cRv","alias":"","msg":"215","attachments":[],"parseUrls":true,"groupable":false,"ts":new Date("2021-06-14T21:27:25.459Z"),"u":{"_id":"nM6vXyDLGGzSPsLNy","username":"admin","name":"Admin"},"rid":"GFR2xxircSsyJxx9F","_updatedAt":new Date("2021-06-14T21:27:25.478Z"),"urls":[],"mentions":[],"channels":[],"md":[{"type":"PARAGRAPH","value":[{"type":"PLAIN_TEXT","value":"215"}]}]}); +db.getCollection("rocketchat_message").insert({"_id":"FKR35Rpc8zFnMAmSg","alias":"","msg":"160","attachments":[],"parseUrls":true,"groupable":false,"ts":new Date("2021-06-14T21:27:04.127Z"),"u":{"_id":"nM6vXyDLGGzSPsLNy","username":"admin","name":"Admin"},"rid":"GFR2xxircSsyJxx9F","_updatedAt":new Date("2021-06-14T21:27:04.167Z"),"urls":[],"mentions":[],"channels":[],"md":[{"type":"PARAGRAPH","value":[{"type":"PLAIN_TEXT","value":"160"}]}]}); +db.getCollection("rocketchat_message").insert({"_id":"FKT9KKE4u8gW2jpSL","alias":"","msg":"281","attachments":[],"parseUrls":true,"groupable":false,"ts":new Date("2021-06-14T21:27:49.486Z"),"u":{"_id":"nM6vXyDLGGzSPsLNy","username":"admin","name":"Admin"},"rid":"GFR2xxircSsyJxx9F","_updatedAt":new Date("2021-06-14T21:27:49.509Z"),"urls":[],"mentions":[],"channels":[],"md":[{"type":"PARAGRAPH","value":[{"type":"PLAIN_TEXT","value":"281"}]}]}); +db.getCollection("rocketchat_message").insert({"_id":"FLtBpqa6bPBqSYPMA","alias":"","msg":"100","attachments":[],"parseUrls":true,"groupable":false,"ts":new Date("2021-06-14T21:26:39.373Z"),"u":{"_id":"nM6vXyDLGGzSPsLNy","username":"admin","name":"Admin"},"rid":"GFR2xxircSsyJxx9F","_updatedAt":new Date("2021-06-14T21:26:39.392Z"),"urls":[],"mentions":[],"channels":[],"md":[{"type":"PARAGRAPH","value":[{"type":"PLAIN_TEXT","value":"100"}]}]}); +db.getCollection("rocketchat_message").insert({"_id":"FcTYu6fzMbb28M75G","rid":"5iyMRT843rNn4wwHv","tmid":"NAXDFHoxA44rsyujh","msg":"24","ts":new Date("2021-06-14T21:27:08.255Z"),"u":{"_id":"nM6vXyDLGGzSPsLNy","username":"admin","name":"Admin"},"_updatedAt":new Date("2021-06-14T21:27:08.360Z"),"urls":[],"mentions":[],"channels":[],"md":[{"type":"PARAGRAPH","value":[{"type":"PLAIN_TEXT","value":"24"}]}]}); +db.getCollection("rocketchat_message").insert({"_id":"FhcwPfvAtFQ5D8MYQ","alias":"","msg":"22","attachments":[],"parseUrls":true,"groupable":false,"ts":new Date("2021-06-14T21:26:11.904Z"),"u":{"_id":"nM6vXyDLGGzSPsLNy","username":"admin","name":"Admin"},"rid":"GFR2xxircSsyJxx9F","_updatedAt":new Date("2021-06-14T21:26:11.922Z"),"urls":[],"mentions":[],"channels":[],"md":[{"type":"PARAGRAPH","value":[{"type":"PLAIN_TEXT","value":"22"}]}]}); +db.getCollection("rocketchat_message").insert({"_id":"G7zgSoyJuWhax8P3x","alias":"","msg":"95","attachments":[],"parseUrls":true,"groupable":false,"ts":new Date("2021-06-14T21:26:37.608Z"),"u":{"_id":"nM6vXyDLGGzSPsLNy","username":"admin","name":"Admin"},"rid":"GFR2xxircSsyJxx9F","_updatedAt":new Date("2021-06-14T21:26:37.628Z"),"urls":[],"mentions":[],"channels":[],"md":[{"type":"PARAGRAPH","value":[{"type":"PLAIN_TEXT","value":"95"}]}]}); +db.getCollection("rocketchat_message").insert({"_id":"GBzrEAwBbEPPXD3M9","alias":"","msg":"74","attachments":[],"parseUrls":true,"groupable":false,"ts":new Date("2021-06-14T21:26:30.074Z"),"u":{"_id":"nM6vXyDLGGzSPsLNy","username":"admin","name":"Admin"},"rid":"GFR2xxircSsyJxx9F","_updatedAt":new Date("2021-06-14T21:26:30.091Z"),"urls":[],"mentions":[],"channels":[],"md":[{"type":"PARAGRAPH","value":[{"type":"PLAIN_TEXT","value":"74"}]}]}); +db.getCollection("rocketchat_message").insert({"_id":"GEWmTKitDazAuaz6h","alias":"","msg":"86","attachments":[],"parseUrls":true,"groupable":false,"ts":new Date("2021-06-14T21:26:34.353Z"),"u":{"_id":"nM6vXyDLGGzSPsLNy","username":"admin","name":"Admin"},"rid":"GFR2xxircSsyJxx9F","_updatedAt":new Date("2021-06-14T21:26:34.369Z"),"urls":[],"mentions":[],"channels":[],"md":[{"type":"PARAGRAPH","value":[{"type":"PLAIN_TEXT","value":"86"}]}]}); +db.getCollection("rocketchat_message").insert({"_id":"GJ4jWiCxgcJMapHTY","alias":"","msg":"61","attachments":[],"parseUrls":true,"groupable":false,"ts":new Date("2021-06-14T21:26:25.432Z"),"u":{"_id":"nM6vXyDLGGzSPsLNy","username":"admin","name":"Admin"},"rid":"GFR2xxircSsyJxx9F","_updatedAt":new Date("2021-06-14T21:26:25.457Z"),"urls":[],"mentions":[],"channels":[],"md":[{"type":"PARAGRAPH","value":[{"type":"PLAIN_TEXT","value":"61"}]}]}); +db.getCollection("rocketchat_message").insert({"_id":"GKHJ9YE9P7CcpdzPZ","alias":"","msg":"213","attachments":[],"parseUrls":true,"groupable":false,"ts":new Date("2021-06-14T21:27:24.750Z"),"u":{"_id":"nM6vXyDLGGzSPsLNy","username":"admin","name":"Admin"},"rid":"GFR2xxircSsyJxx9F","_updatedAt":new Date("2021-06-14T21:27:24.766Z"),"urls":[],"mentions":[],"channels":[],"md":[{"type":"PARAGRAPH","value":[{"type":"PLAIN_TEXT","value":"213"}]}]}); +db.getCollection("rocketchat_message").insert({"_id":"GXBzQmJ8FcBoC3gtP","alias":"","msg":"137","attachments":[],"parseUrls":true,"groupable":false,"ts":new Date("2021-06-14T21:26:54.514Z"),"u":{"_id":"nM6vXyDLGGzSPsLNy","username":"admin","name":"Admin"},"rid":"GFR2xxircSsyJxx9F","_updatedAt":new Date("2021-06-14T21:26:54.776Z"),"urls":[],"mentions":[],"channels":[],"md":[{"type":"PARAGRAPH","value":[{"type":"PLAIN_TEXT","value":"137"}]}]}); +db.getCollection("rocketchat_message").insert({"_id":"GmEYWjr2Cxg59Cdy6","alias":"","msg":"275","attachments":[],"parseUrls":true,"groupable":false,"ts":new Date("2021-06-14T21:27:46.972Z"),"u":{"_id":"nM6vXyDLGGzSPsLNy","username":"admin","name":"Admin"},"rid":"GFR2xxircSsyJxx9F","_updatedAt":new Date("2021-06-14T21:27:46.993Z"),"urls":[],"mentions":[],"channels":[],"md":[{"type":"PARAGRAPH","value":[{"type":"PLAIN_TEXT","value":"275"}]}]}); +db.getCollection("rocketchat_message").insert({"_id":"GswMnTC73YmpAopoB","alias":"","msg":"165","attachments":[],"parseUrls":true,"groupable":false,"ts":new Date("2021-06-14T21:27:06.067Z"),"u":{"_id":"nM6vXyDLGGzSPsLNy","username":"admin","name":"Admin"},"rid":"GFR2xxircSsyJxx9F","_updatedAt":new Date("2021-06-14T21:27:06.088Z"),"urls":[],"mentions":[],"channels":[],"md":[{"type":"PARAGRAPH","value":[{"type":"PLAIN_TEXT","value":"165"}]}]}); +db.getCollection("rocketchat_message").insert({"_id":"H2Y7vC4CYLZHzrQCQ","alias":"","msg":"265","attachments":[],"parseUrls":true,"groupable":false,"ts":new Date("2021-06-14T21:27:43.461Z"),"u":{"_id":"nM6vXyDLGGzSPsLNy","username":"admin","name":"Admin"},"rid":"GFR2xxircSsyJxx9F","_updatedAt":new Date("2021-06-14T21:27:43.476Z"),"urls":[],"mentions":[],"channels":[],"md":[{"type":"PARAGRAPH","value":[{"type":"PLAIN_TEXT","value":"265"}]}]}); +db.getCollection("rocketchat_message").insert({"_id":"H2qrRsJ7B5iQb3nYa","alias":"","msg":"189","attachments":[],"parseUrls":true,"groupable":false,"ts":new Date("2021-06-14T21:27:16.042Z"),"u":{"_id":"nM6vXyDLGGzSPsLNy","username":"admin","name":"Admin"},"rid":"GFR2xxircSsyJxx9F","_updatedAt":new Date("2021-06-14T21:27:16.082Z"),"urls":[],"mentions":[],"channels":[],"md":[{"type":"PARAGRAPH","value":[{"type":"PLAIN_TEXT","value":"189"}]}]}); +db.getCollection("rocketchat_message").insert({"_id":"HEjouKohtxTSr4vYE","alias":"","msg":"232","attachments":[],"parseUrls":true,"groupable":false,"ts":new Date("2021-06-14T21:27:31.648Z"),"u":{"_id":"nM6vXyDLGGzSPsLNy","username":"admin","name":"Admin"},"rid":"GFR2xxircSsyJxx9F","_updatedAt":new Date("2021-06-14T21:27:31.668Z"),"urls":[],"mentions":[],"channels":[],"md":[{"type":"PARAGRAPH","value":[{"type":"PLAIN_TEXT","value":"232"}]}]}); +db.getCollection("rocketchat_message").insert({"_id":"HMe5BrNi5PYH4ydur","rid":"5iyMRT843rNn4wwHv","tmid":"NAXDFHoxA44rsyujh","msg":"11","ts":new Date("2021-06-14T21:26:54.204Z"),"u":{"_id":"nM6vXyDLGGzSPsLNy","username":"admin","name":"Admin"},"_updatedAt":new Date("2021-06-14T21:26:54.376Z"),"urls":[],"mentions":[],"channels":[],"md":[{"type":"PARAGRAPH","value":[{"type":"PLAIN_TEXT","value":"11"}]}]}); +db.getCollection("rocketchat_message").insert({"_id":"HP2vqtXk7H2kgopxM","alias":"","msg":"237","attachments":[],"parseUrls":true,"groupable":false,"ts":new Date("2021-06-14T21:27:33.393Z"),"u":{"_id":"nM6vXyDLGGzSPsLNy","username":"admin","name":"Admin"},"rid":"GFR2xxircSsyJxx9F","_updatedAt":new Date("2021-06-14T21:27:33.408Z"),"urls":[],"mentions":[],"channels":[],"md":[{"type":"PARAGRAPH","value":[{"type":"PLAIN_TEXT","value":"237"}]}]}); +db.getCollection("rocketchat_message").insert({"_id":"HZDTBZWzTtZG2wPYj","alias":"","msg":"162","attachments":[],"parseUrls":true,"groupable":false,"ts":new Date("2021-06-14T21:27:04.922Z"),"u":{"_id":"nM6vXyDLGGzSPsLNy","username":"admin","name":"Admin"},"rid":"GFR2xxircSsyJxx9F","_updatedAt":new Date("2021-06-14T21:27:05.009Z"),"urls":[],"mentions":[],"channels":[],"md":[{"type":"PARAGRAPH","value":[{"type":"PLAIN_TEXT","value":"162"}]}]}); +db.getCollection("rocketchat_message").insert({"_id":"HkveojpNbg6rkWrqJ","alias":"","msg":"284","attachments":[],"parseUrls":true,"groupable":false,"ts":new Date("2021-06-14T21:27:50.555Z"),"u":{"_id":"nM6vXyDLGGzSPsLNy","username":"admin","name":"Admin"},"rid":"GFR2xxircSsyJxx9F","_updatedAt":new Date("2021-06-14T21:27:50.573Z"),"urls":[],"mentions":[],"channels":[],"md":[{"type":"PARAGRAPH","value":[{"type":"PLAIN_TEXT","value":"284"}]}]}); +db.getCollection("rocketchat_message").insert({"_id":"HnZLZeDDsgF858kRx","rid":"5iyMRT843rNn4wwHv","tmid":"NAXDFHoxA44rsyujh","msg":"9","ts":new Date("2021-06-14T21:26:52.386Z"),"u":{"_id":"nM6vXyDLGGzSPsLNy","username":"admin","name":"Admin"},"_updatedAt":new Date("2021-06-14T21:26:52.531Z"),"urls":[],"mentions":[],"channels":[],"md":[{"type":"PARAGRAPH","value":[{"type":"PLAIN_TEXT","value":"9"}]}]}); +db.getCollection("rocketchat_message").insert({"_id":"Hyt6k5bYadfc9sKJW","alias":"","msg":"89","attachments":[],"parseUrls":true,"groupable":false,"ts":new Date("2021-06-14T21:26:35.380Z"),"u":{"_id":"nM6vXyDLGGzSPsLNy","username":"admin","name":"Admin"},"rid":"GFR2xxircSsyJxx9F","_updatedAt":new Date("2021-06-14T21:26:35.400Z"),"urls":[],"mentions":[],"channels":[],"md":[{"type":"PARAGRAPH","value":[{"type":"PLAIN_TEXT","value":"89"}]}]}); +db.getCollection("rocketchat_message").insert({"_id":"J49cDnpaGPvuzf5s6","alias":"","msg":"124","attachments":[],"parseUrls":true,"groupable":false,"ts":new Date("2021-06-14T21:26:47.930Z"),"u":{"_id":"nM6vXyDLGGzSPsLNy","username":"admin","name":"Admin"},"rid":"GFR2xxircSsyJxx9F","_updatedAt":new Date("2021-06-14T21:26:47.947Z"),"urls":[],"mentions":[],"channels":[],"md":[{"type":"PARAGRAPH","value":[{"type":"PLAIN_TEXT","value":"124"}]}]}); +db.getCollection("rocketchat_message").insert({"_id":"J5ae5apoN8LZFyXiW","alias":"","msg":"199","attachments":[],"parseUrls":true,"groupable":false,"ts":new Date("2021-06-14T21:27:19.666Z"),"u":{"_id":"nM6vXyDLGGzSPsLNy","username":"admin","name":"Admin"},"rid":"GFR2xxircSsyJxx9F","_updatedAt":new Date("2021-06-14T21:27:19.685Z"),"urls":[],"mentions":[],"channels":[],"md":[{"type":"PARAGRAPH","value":[{"type":"PLAIN_TEXT","value":"199"}]}]}); +db.getCollection("rocketchat_message").insert({"_id":"J8jTENXHvWn4DCgcq","alias":"","msg":"88","attachments":[],"parseUrls":true,"groupable":false,"ts":new Date("2021-06-14T21:26:35.036Z"),"u":{"_id":"nM6vXyDLGGzSPsLNy","username":"admin","name":"Admin"},"rid":"GFR2xxircSsyJxx9F","_updatedAt":new Date("2021-06-14T21:26:35.050Z"),"urls":[],"mentions":[],"channels":[],"md":[{"type":"PARAGRAPH","value":[{"type":"PLAIN_TEXT","value":"88"}]}]}); +db.getCollection("rocketchat_message").insert({"_id":"JTQ4hu7SXXW24gRG9","alias":"","msg":"283","attachments":[],"parseUrls":true,"groupable":false,"ts":new Date("2021-06-14T21:27:50.193Z"),"u":{"_id":"nM6vXyDLGGzSPsLNy","username":"admin","name":"Admin"},"rid":"GFR2xxircSsyJxx9F","_updatedAt":new Date("2021-06-14T21:27:50.223Z"),"urls":[],"mentions":[],"channels":[],"md":[{"type":"PARAGRAPH","value":[{"type":"PLAIN_TEXT","value":"283"}]}]}); +db.getCollection("rocketchat_message").insert({"_id":"JZsxce8XjmNihE7AY","alias":"","msg":"168","attachments":[],"parseUrls":true,"groupable":false,"ts":new Date("2021-06-14T21:27:07.339Z"),"u":{"_id":"nM6vXyDLGGzSPsLNy","username":"admin","name":"Admin"},"rid":"GFR2xxircSsyJxx9F","_updatedAt":new Date("2021-06-14T21:27:07.432Z"),"urls":[],"mentions":[],"channels":[],"md":[{"type":"PARAGRAPH","value":[{"type":"PLAIN_TEXT","value":"168"}]}]}); +db.getCollection("rocketchat_message").insert({"_id":"K3twE3RhK3bskvP88","alias":"","msg":"258","attachments":[],"parseUrls":true,"groupable":false,"ts":new Date("2021-06-14T21:27:40.989Z"),"u":{"_id":"nM6vXyDLGGzSPsLNy","username":"admin","name":"Admin"},"rid":"GFR2xxircSsyJxx9F","_updatedAt":new Date("2021-06-14T21:27:41.008Z"),"urls":[],"mentions":[],"channels":[],"md":[{"type":"PARAGRAPH","value":[{"type":"PLAIN_TEXT","value":"258"}]}]}); +db.getCollection("rocketchat_message").insert({"_id":"K5tSCpctfdcB3Po9S","alias":"","msg":"63","attachments":[],"parseUrls":true,"groupable":false,"ts":new Date("2021-06-14T21:26:26.138Z"),"u":{"_id":"nM6vXyDLGGzSPsLNy","username":"admin","name":"Admin"},"rid":"GFR2xxircSsyJxx9F","_updatedAt":new Date("2021-06-14T21:26:26.168Z"),"urls":[],"mentions":[],"channels":[],"md":[{"type":"PARAGRAPH","value":[{"type":"PLAIN_TEXT","value":"63"}]}]}); +db.getCollection("rocketchat_message").insert({"_id":"KAZ24unKt2SzLiTwn","alias":"","msg":"34","attachments":[],"parseUrls":true,"groupable":false,"ts":new Date("2021-06-14T21:26:16.140Z"),"u":{"_id":"nM6vXyDLGGzSPsLNy","username":"admin","name":"Admin"},"rid":"GFR2xxircSsyJxx9F","_updatedAt":new Date("2021-06-14T21:26:16.160Z"),"urls":[],"mentions":[],"channels":[],"md":[{"type":"PARAGRAPH","value":[{"type":"PLAIN_TEXT","value":"34"}]}]}); +db.getCollection("rocketchat_message").insert({"_id":"KCGD75Dzg9sneF3yo","alias":"","msg":"29","attachments":[],"parseUrls":true,"groupable":false,"ts":new Date("2021-06-14T21:26:14.372Z"),"u":{"_id":"nM6vXyDLGGzSPsLNy","username":"admin","name":"Admin"},"rid":"GFR2xxircSsyJxx9F","_updatedAt":new Date("2021-06-14T21:26:14.395Z"),"urls":[],"mentions":[],"channels":[],"md":[{"type":"PARAGRAPH","value":[{"type":"PLAIN_TEXT","value":"29"}]}]}); +db.getCollection("rocketchat_message").insert({"_id":"KH2djT7TBQfnZtXzf","rid":"5iyMRT843rNn4wwHv","msg":"thread 2","ts":new Date("2021-06-14T21:26:44.015Z"),"u":{"_id":"nM6vXyDLGGzSPsLNy","username":"admin","name":"Admin"},"_updatedAt":new Date("2021-06-14T21:26:44.085Z"),"urls":[],"mentions":[],"channels":[],"md":[{"type":"PARAGRAPH","value":[{"type":"PLAIN_TEXT","value":"thread 2"}]}]}); +db.getCollection("rocketchat_message").insert({"_id":"KZzFpygiB2sWXp7hd","alias":"","msg":"188","attachments":[],"parseUrls":true,"groupable":false,"ts":new Date("2021-06-14T21:27:15.676Z"),"u":{"_id":"nM6vXyDLGGzSPsLNy","username":"admin","name":"Admin"},"rid":"GFR2xxircSsyJxx9F","_updatedAt":new Date("2021-06-14T21:27:15.702Z"),"urls":[],"mentions":[],"channels":[],"md":[{"type":"PARAGRAPH","value":[{"type":"PLAIN_TEXT","value":"188"}]}]}); +db.getCollection("rocketchat_message").insert({"_id":"KuqHjst7QmS4s8qYX","alias":"","msg":"15","attachments":[],"parseUrls":true,"groupable":false,"ts":new Date("2021-06-14T21:26:09.425Z"),"u":{"_id":"nM6vXyDLGGzSPsLNy","username":"admin","name":"Admin"},"rid":"GFR2xxircSsyJxx9F","_updatedAt":new Date("2021-06-14T21:26:09.445Z"),"urls":[],"mentions":[],"channels":[],"md":[{"type":"PARAGRAPH","value":[{"type":"PLAIN_TEXT","value":"15"}]}]}); +db.getCollection("rocketchat_message").insert({"_id":"L2S3YC4AfW4SQaybC","alias":"","msg":"196","attachments":[],"parseUrls":true,"groupable":false,"ts":new Date("2021-06-14T21:27:18.574Z"),"u":{"_id":"nM6vXyDLGGzSPsLNy","username":"admin","name":"Admin"},"rid":"GFR2xxircSsyJxx9F","_updatedAt":new Date("2021-06-14T21:27:18.597Z"),"urls":[],"mentions":[],"channels":[],"md":[{"type":"PARAGRAPH","value":[{"type":"PLAIN_TEXT","value":"196"}]}]}); +db.getCollection("rocketchat_message").insert({"_id":"L4GFcEyoia8E9kkLb","alias":"","msg":"253","attachments":[],"parseUrls":true,"groupable":false,"ts":new Date("2021-06-14T21:27:39.187Z"),"u":{"_id":"nM6vXyDLGGzSPsLNy","username":"admin","name":"Admin"},"rid":"GFR2xxircSsyJxx9F","_updatedAt":new Date("2021-06-14T21:27:39.204Z"),"urls":[],"mentions":[],"channels":[],"md":[{"type":"PARAGRAPH","value":[{"type":"PLAIN_TEXT","value":"253"}]}]}); +db.getCollection("rocketchat_message").insert({"_id":"L8K2rLSpBbN3QQrXq","alias":"","msg":"38","attachments":[],"parseUrls":true,"groupable":false,"ts":new Date("2021-06-14T21:26:17.484Z"),"u":{"_id":"nM6vXyDLGGzSPsLNy","username":"admin","name":"Admin"},"rid":"GFR2xxircSsyJxx9F","_updatedAt":new Date("2021-06-14T21:26:17.498Z"),"urls":[],"mentions":[],"channels":[],"md":[{"type":"PARAGRAPH","value":[{"type":"PLAIN_TEXT","value":"38"}]}]}); +db.getCollection("rocketchat_message").insert({"_id":"LH6qPBWWfhotNdvW6","alias":"","msg":"194","attachments":[],"parseUrls":true,"groupable":false,"ts":new Date("2021-06-14T21:27:17.860Z"),"u":{"_id":"nM6vXyDLGGzSPsLNy","username":"admin","name":"Admin"},"rid":"GFR2xxircSsyJxx9F","_updatedAt":new Date("2021-06-14T21:27:17.886Z"),"urls":[],"mentions":[],"channels":[],"md":[{"type":"PARAGRAPH","value":[{"type":"PLAIN_TEXT","value":"194"}]}]}); +db.getCollection("rocketchat_message").insert({"_id":"LJudSHZjgvj3PYwPW","alias":"","msg":"229","attachments":[],"parseUrls":true,"groupable":false,"ts":new Date("2021-06-14T21:27:30.535Z"),"u":{"_id":"nM6vXyDLGGzSPsLNy","username":"admin","name":"Admin"},"rid":"GFR2xxircSsyJxx9F","_updatedAt":new Date("2021-06-14T21:27:30.556Z"),"urls":[],"mentions":[],"channels":[],"md":[{"type":"PARAGRAPH","value":[{"type":"PLAIN_TEXT","value":"229"}]}]}); +db.getCollection("rocketchat_message").insert({"_id":"LLQXCB4WnyHNwJRK4","alias":"","msg":"145","attachments":[],"parseUrls":true,"groupable":false,"ts":new Date("2021-06-14T21:26:58.133Z"),"u":{"_id":"nM6vXyDLGGzSPsLNy","username":"admin","name":"Admin"},"rid":"GFR2xxircSsyJxx9F","_updatedAt":new Date("2021-06-14T21:26:58.159Z"),"urls":[],"mentions":[],"channels":[],"md":[{"type":"PARAGRAPH","value":[{"type":"PLAIN_TEXT","value":"145"}]}]}); +db.getCollection("rocketchat_message").insert({"_id":"LLiby3sDRkQNKjG5w","alias":"","msg":"198","attachments":[],"parseUrls":true,"groupable":false,"ts":new Date("2021-06-14T21:27:19.306Z"),"u":{"_id":"nM6vXyDLGGzSPsLNy","username":"admin","name":"Admin"},"rid":"GFR2xxircSsyJxx9F","_updatedAt":new Date("2021-06-14T21:27:19.332Z"),"urls":[],"mentions":[],"channels":[],"md":[{"type":"PARAGRAPH","value":[{"type":"PLAIN_TEXT","value":"198"}]}]}); +db.getCollection("rocketchat_message").insert({"_id":"LQKgYipeHNG9wERPP","alias":"","msg":"2","attachments":[],"parseUrls":true,"groupable":false,"ts":new Date("2021-06-14T21:25:52.639Z"),"u":{"_id":"nM6vXyDLGGzSPsLNy","username":"admin","name":"Admin"},"rid":"GFR2xxircSsyJxx9F","_updatedAt":new Date("2021-06-14T21:25:52.672Z"),"urls":[],"mentions":[],"channels":[],"md":[{"type":"PARAGRAPH","value":[{"type":"PLAIN_TEXT","value":"2"}]}]}); +db.getCollection("rocketchat_message").insert({"_id":"Lnpro7sThoN89jGbo","alias":"","msg":"8","attachments":[],"parseUrls":true,"groupable":false,"ts":new Date("2021-06-14T21:26:06.915Z"),"u":{"_id":"nM6vXyDLGGzSPsLNy","username":"admin","name":"Admin"},"rid":"GFR2xxircSsyJxx9F","_updatedAt":new Date("2021-06-14T21:26:06.936Z"),"urls":[],"mentions":[],"channels":[],"md":[{"type":"PARAGRAPH","value":[{"type":"PLAIN_TEXT","value":"8"}]}]}); +db.getCollection("rocketchat_message").insert({"_id":"LwAqBPzLDJmaRnSmr","alias":"","msg":"139","attachments":[],"parseUrls":true,"groupable":false,"ts":new Date("2021-06-14T21:26:55.592Z"),"u":{"_id":"nM6vXyDLGGzSPsLNy","username":"admin","name":"Admin"},"rid":"GFR2xxircSsyJxx9F","_updatedAt":new Date("2021-06-14T21:26:55.656Z"),"urls":[],"mentions":[],"channels":[],"md":[{"type":"PARAGRAPH","value":[{"type":"PLAIN_TEXT","value":"139"}]}]}); +db.getCollection("rocketchat_message").insert({"_id":"M6xT2Lxh7tFvARmRS","alias":"","msg":"236","attachments":[],"parseUrls":true,"groupable":false,"ts":new Date("2021-06-14T21:27:33.048Z"),"u":{"_id":"nM6vXyDLGGzSPsLNy","username":"admin","name":"Admin"},"rid":"GFR2xxircSsyJxx9F","_updatedAt":new Date("2021-06-14T21:27:33.064Z"),"urls":[],"mentions":[],"channels":[],"md":[{"type":"PARAGRAPH","value":[{"type":"PLAIN_TEXT","value":"236"}]}]}); +db.getCollection("rocketchat_message").insert({"_id":"MMYNkEdFcb42hwrob","alias":"","msg":"102","attachments":[],"parseUrls":true,"groupable":false,"ts":new Date("2021-06-14T21:26:40.065Z"),"u":{"_id":"nM6vXyDLGGzSPsLNy","username":"admin","name":"Admin"},"rid":"GFR2xxircSsyJxx9F","_updatedAt":new Date("2021-06-14T21:26:40.081Z"),"urls":[],"mentions":[],"channels":[],"md":[{"type":"PARAGRAPH","value":[{"type":"PLAIN_TEXT","value":"102"}]}]}); +db.getCollection("rocketchat_message").insert({"_id":"MbgeBDDrSfztwgFT3","rid":"5iyMRT843rNn4wwHv","tmid":"NAXDFHoxA44rsyujh","msg":"10","ts":new Date("2021-06-14T21:26:53.404Z"),"u":{"_id":"nM6vXyDLGGzSPsLNy","username":"admin","name":"Admin"},"_updatedAt":new Date("2021-06-14T21:26:53.517Z"),"urls":[],"mentions":[],"channels":[],"md":[{"type":"PARAGRAPH","value":[{"type":"PLAIN_TEXT","value":"10"}]}]}); +db.getCollection("rocketchat_message").insert({"_id":"Mg4dY3XbRuokCL4mA","alias":"","msg":"111","attachments":[],"parseUrls":true,"groupable":false,"ts":new Date("2021-06-14T21:26:43.254Z"),"u":{"_id":"nM6vXyDLGGzSPsLNy","username":"admin","name":"Admin"},"rid":"GFR2xxircSsyJxx9F","_updatedAt":new Date("2021-06-14T21:26:43.282Z"),"urls":[],"mentions":[],"channels":[],"md":[{"type":"PARAGRAPH","value":[{"type":"PLAIN_TEXT","value":"111"}]}]}); +db.getCollection("rocketchat_message").insert({"_id":"Mmxr3AgSkc9ZeCqfc","alias":"","msg":"180","attachments":[],"parseUrls":true,"groupable":false,"ts":new Date("2021-06-14T21:27:12.402Z"),"u":{"_id":"nM6vXyDLGGzSPsLNy","username":"admin","name":"Admin"},"rid":"GFR2xxircSsyJxx9F","_updatedAt":new Date("2021-06-14T21:27:12.438Z"),"urls":[],"mentions":[],"channels":[],"md":[{"type":"PARAGRAPH","value":[{"type":"PLAIN_TEXT","value":"180"}]}]}); +db.getCollection("rocketchat_message").insert({"_id":"MzTnyD7bHLQpDaDkt","alias":"","msg":"90","attachments":[],"parseUrls":true,"groupable":false,"ts":new Date("2021-06-14T21:26:35.784Z"),"u":{"_id":"nM6vXyDLGGzSPsLNy","username":"admin","name":"Admin"},"rid":"GFR2xxircSsyJxx9F","_updatedAt":new Date("2021-06-14T21:26:35.818Z"),"urls":[],"mentions":[],"channels":[],"md":[{"type":"PARAGRAPH","value":[{"type":"PLAIN_TEXT","value":"90"}]}]}); +db.getCollection("rocketchat_message").insert({"_id":"N6ADgwTr3cAkfAYr6","alias":"","msg":"173","attachments":[],"parseUrls":true,"groupable":false,"ts":new Date("2021-06-14T21:27:09.323Z"),"u":{"_id":"nM6vXyDLGGzSPsLNy","username":"admin","name":"Admin"},"rid":"GFR2xxircSsyJxx9F","_updatedAt":new Date("2021-06-14T21:27:09.397Z"),"urls":[],"mentions":[],"channels":[],"md":[{"type":"PARAGRAPH","value":[{"type":"PLAIN_TEXT","value":"173"}]}]}); +db.getCollection("rocketchat_message").insert({"_id":"NAXDFHoxA44rsyujh","rid":"5iyMRT843rNn4wwHv","msg":"thread 1","ts":new Date("2021-06-14T21:26:41.349Z"),"u":{"_id":"nM6vXyDLGGzSPsLNy","username":"admin","name":"Admin"},"_updatedAt":new Date("2021-06-14T21:27:14.845Z"),"urls":[],"mentions":[],"channels":[],"md":[{"type":"PARAGRAPH","value":[{"type":"PLAIN_TEXT","value":"thread 1"}]}],"replies":["nM6vXyDLGGzSPsLNy"],"tcount":30,"tlm":new Date("2021-06-14T21:27:14.710Z")}); +db.getCollection("rocketchat_message").insert({"_id":"NopPvF5ocTcK9YWyY","alias":"","msg":"97","attachments":[],"parseUrls":true,"groupable":false,"ts":new Date("2021-06-14T21:26:38.310Z"),"u":{"_id":"nM6vXyDLGGzSPsLNy","username":"admin","name":"Admin"},"rid":"GFR2xxircSsyJxx9F","_updatedAt":new Date("2021-06-14T21:26:38.334Z"),"urls":[],"mentions":[],"channels":[],"md":[{"type":"PARAGRAPH","value":[{"type":"PLAIN_TEXT","value":"97"}]}]}); +db.getCollection("rocketchat_message").insert({"_id":"NqRvSpT6vWpaMyenq","alias":"","msg":"276","attachments":[],"parseUrls":true,"groupable":false,"ts":new Date("2021-06-14T21:27:47.330Z"),"u":{"_id":"nM6vXyDLGGzSPsLNy","username":"admin","name":"Admin"},"rid":"GFR2xxircSsyJxx9F","_updatedAt":new Date("2021-06-14T21:27:47.347Z"),"urls":[],"mentions":[],"channels":[],"md":[{"type":"PARAGRAPH","value":[{"type":"PLAIN_TEXT","value":"276"}]}]}); +db.getCollection("rocketchat_message").insert({"_id":"PAz8BppytThsiyaSv","alias":"","msg":"116","attachments":[],"parseUrls":true,"groupable":false,"ts":new Date("2021-06-14T21:26:45.010Z"),"u":{"_id":"nM6vXyDLGGzSPsLNy","username":"admin","name":"Admin"},"rid":"GFR2xxircSsyJxx9F","_updatedAt":new Date("2021-06-14T21:26:45.034Z"),"urls":[],"mentions":[],"channels":[],"md":[{"type":"PARAGRAPH","value":[{"type":"PLAIN_TEXT","value":"116"}]}]}); +db.getCollection("rocketchat_message").insert({"_id":"Pi8mzMSsneD9Bku9d","alias":"","msg":"218","attachments":[],"parseUrls":true,"groupable":false,"ts":new Date("2021-06-14T21:27:26.512Z"),"u":{"_id":"nM6vXyDLGGzSPsLNy","username":"admin","name":"Admin"},"rid":"GFR2xxircSsyJxx9F","_updatedAt":new Date("2021-06-14T21:27:26.535Z"),"urls":[],"mentions":[],"channels":[],"md":[{"type":"PARAGRAPH","value":[{"type":"PLAIN_TEXT","value":"218"}]}]}); +db.getCollection("rocketchat_message").insert({"_id":"Px7brmeNGnYiDZN48","alias":"","msg":"167","attachments":[],"parseUrls":true,"groupable":false,"ts":new Date("2021-06-14T21:27:06.866Z"),"u":{"_id":"nM6vXyDLGGzSPsLNy","username":"admin","name":"Admin"},"rid":"GFR2xxircSsyJxx9F","_updatedAt":new Date("2021-06-14T21:27:06.899Z"),"urls":[],"mentions":[],"channels":[],"md":[{"type":"PARAGRAPH","value":[{"type":"PLAIN_TEXT","value":"167"}]}]}); +db.getCollection("rocketchat_message").insert({"_id":"Q9JZLA5uaiwvknQFL","alias":"","msg":"151","attachments":[],"parseUrls":true,"groupable":false,"ts":new Date("2021-06-14T21:27:00.560Z"),"u":{"_id":"nM6vXyDLGGzSPsLNy","username":"admin","name":"Admin"},"rid":"GFR2xxircSsyJxx9F","_updatedAt":new Date("2021-06-14T21:27:00.584Z"),"urls":[],"mentions":[],"channels":[],"md":[{"type":"PARAGRAPH","value":[{"type":"PLAIN_TEXT","value":"151"}]}]}); +db.getCollection("rocketchat_message").insert({"_id":"Q9LHyGvCWj8TT26jj","alias":"","msg":"193","attachments":[],"parseUrls":true,"groupable":false,"ts":new Date("2021-06-14T21:27:17.502Z"),"u":{"_id":"nM6vXyDLGGzSPsLNy","username":"admin","name":"Admin"},"rid":"GFR2xxircSsyJxx9F","_updatedAt":new Date("2021-06-14T21:27:17.528Z"),"urls":[],"mentions":[],"channels":[],"md":[{"type":"PARAGRAPH","value":[{"type":"PLAIN_TEXT","value":"193"}]}]}); +db.getCollection("rocketchat_message").insert({"_id":"Q9NgS9QRojajftfj6","alias":"","msg":"120","attachments":[],"parseUrls":true,"groupable":false,"ts":new Date("2021-06-14T21:26:46.422Z"),"u":{"_id":"nM6vXyDLGGzSPsLNy","username":"admin","name":"Admin"},"rid":"GFR2xxircSsyJxx9F","_updatedAt":new Date("2021-06-14T21:26:46.442Z"),"urls":[],"mentions":[],"channels":[],"md":[{"type":"PARAGRAPH","value":[{"type":"PLAIN_TEXT","value":"120"}]}]}); +db.getCollection("rocketchat_message").insert({"_id":"QEp4mdsvN7tATTTif","alias":"","msg":"105","attachments":[],"parseUrls":true,"groupable":false,"ts":new Date("2021-06-14T21:26:41.105Z"),"u":{"_id":"nM6vXyDLGGzSPsLNy","username":"admin","name":"Admin"},"rid":"GFR2xxircSsyJxx9F","_updatedAt":new Date("2021-06-14T21:26:41.123Z"),"urls":[],"mentions":[],"channels":[],"md":[{"type":"PARAGRAPH","value":[{"type":"PLAIN_TEXT","value":"105"}]}]}); +db.getCollection("rocketchat_message").insert({"_id":"QZncZeyQk4ach7TyF","alias":"","msg":"55","attachments":[],"parseUrls":true,"groupable":false,"ts":new Date("2021-06-14T21:26:23.324Z"),"u":{"_id":"nM6vXyDLGGzSPsLNy","username":"admin","name":"Admin"},"rid":"GFR2xxircSsyJxx9F","_updatedAt":new Date("2021-06-14T21:26:23.339Z"),"urls":[],"mentions":[],"channels":[],"md":[{"type":"PARAGRAPH","value":[{"type":"PLAIN_TEXT","value":"55"}]}]}); +db.getCollection("rocketchat_message").insert({"_id":"R7iDtoqMcP8iH9AZi","rid":"5iyMRT843rNn4wwHv","msg":"http://localhost:3000/group/jumping-thread?msg=wXb2eMCF5em722dSG Go to quoted","ts":new Date("2021-06-14T21:27:34.440Z"),"u":{"_id":"nM6vXyDLGGzSPsLNy","username":"admin","name":"Admin"},"_updatedAt":new Date("2021-06-14T21:27:34.517Z"),"attachments":[{"text":"quoted","author_name":"admin","author_icon":"/avatar/admin","message_link":"http://localhost:3000/group/jumping-thread?msg=wXb2eMCF5em722dSG","attachments":[],"ts":new Date("2021-06-14T21:26:48.151Z")}],"urls":[{"url":"http://localhost:3000/group/jumping-thread?msg=5iyMRT843rNn4wwHv","ignoreParse":true}],"mentions":[],"channels":[]}); +db.getCollection("rocketchat_message").insert({"_id":"REFdN433cQ4knn4hY","alias":"","msg":"99","attachments":[],"parseUrls":true,"groupable":false,"ts":new Date("2021-06-14T21:26:39.014Z"),"u":{"_id":"nM6vXyDLGGzSPsLNy","username":"admin","name":"Admin"},"rid":"GFR2xxircSsyJxx9F","_updatedAt":new Date("2021-06-14T21:26:39.034Z"),"urls":[],"mentions":[],"channels":[],"md":[{"type":"PARAGRAPH","value":[{"type":"PLAIN_TEXT","value":"99"}]}]}); +db.getCollection("rocketchat_message").insert({"_id":"RKHTvjSKiGAPRRZfc","alias":"","msg":"251","attachments":[],"parseUrls":true,"groupable":false,"ts":new Date("2021-06-14T21:27:38.455Z"),"u":{"_id":"nM6vXyDLGGzSPsLNy","username":"admin","name":"Admin"},"rid":"GFR2xxircSsyJxx9F","_updatedAt":new Date("2021-06-14T21:27:38.495Z"),"urls":[],"mentions":[],"channels":[],"md":[{"type":"PARAGRAPH","value":[{"type":"PLAIN_TEXT","value":"251"}]}]}); +db.getCollection("rocketchat_message").insert({"_id":"RSEww3hBWuHhCkeeR","alias":"","msg":"211","attachments":[],"parseUrls":true,"groupable":false,"ts":new Date("2021-06-14T21:27:24.027Z"),"u":{"_id":"nM6vXyDLGGzSPsLNy","username":"admin","name":"Admin"},"rid":"GFR2xxircSsyJxx9F","_updatedAt":new Date("2021-06-14T21:27:24.064Z"),"urls":[],"mentions":[],"channels":[],"md":[{"type":"PARAGRAPH","value":[{"type":"PLAIN_TEXT","value":"211"}]}]}); +db.getCollection("rocketchat_message").insert({"_id":"RSJ2S4QoYYKTqcebb","alias":"","msg":"79","attachments":[],"parseUrls":true,"groupable":false,"ts":new Date("2021-06-14T21:26:31.818Z"),"u":{"_id":"nM6vXyDLGGzSPsLNy","username":"admin","name":"Admin"},"rid":"GFR2xxircSsyJxx9F","_updatedAt":new Date("2021-06-14T21:26:31.846Z"),"urls":[],"mentions":[],"channels":[],"md":[{"type":"PARAGRAPH","value":[{"type":"PLAIN_TEXT","value":"79"}]}]}); +db.getCollection("rocketchat_message").insert({"_id":"RWqSS9eFRtsW8kAxv","alias":"","msg":"260","attachments":[],"parseUrls":true,"groupable":false,"ts":new Date("2021-06-14T21:27:41.693Z"),"u":{"_id":"nM6vXyDLGGzSPsLNy","username":"admin","name":"Admin"},"rid":"GFR2xxircSsyJxx9F","_updatedAt":new Date("2021-06-14T21:27:41.717Z"),"urls":[],"mentions":[],"channels":[],"md":[{"type":"PARAGRAPH","value":[{"type":"PLAIN_TEXT","value":"260"}]}]}); +db.getCollection("rocketchat_message").insert({"_id":"RZ9tvpoxLm4chpayJ","alias":"","msg":"51","attachments":[],"parseUrls":true,"groupable":false,"ts":new Date("2021-06-14T21:26:21.922Z"),"u":{"_id":"nM6vXyDLGGzSPsLNy","username":"admin","name":"Admin"},"rid":"GFR2xxircSsyJxx9F","_updatedAt":new Date("2021-06-14T21:26:21.944Z"),"urls":[],"mentions":[],"channels":[],"md":[{"type":"PARAGRAPH","value":[{"type":"PLAIN_TEXT","value":"51"}]}]}); +db.getCollection("rocketchat_message").insert({"_id":"RcBwAoQHPodNp5urE","alias":"","msg":"16","attachments":[],"parseUrls":true,"groupable":false,"ts":new Date("2021-06-14T21:26:09.778Z"),"u":{"_id":"nM6vXyDLGGzSPsLNy","username":"admin","name":"Admin"},"rid":"GFR2xxircSsyJxx9F","_updatedAt":new Date("2021-06-14T21:26:09.797Z"),"urls":[],"mentions":[],"channels":[],"md":[{"type":"PARAGRAPH","value":[{"type":"PLAIN_TEXT","value":"16"}]}]}); +db.getCollection("rocketchat_message").insert({"_id":"Rj5xni8Hj9RazWE3L","alias":"","msg":"87","attachments":[],"parseUrls":true,"groupable":false,"ts":new Date("2021-06-14T21:26:34.695Z"),"u":{"_id":"nM6vXyDLGGzSPsLNy","username":"admin","name":"Admin"},"rid":"GFR2xxircSsyJxx9F","_updatedAt":new Date("2021-06-14T21:26:34.711Z"),"urls":[],"mentions":[],"channels":[],"md":[{"type":"PARAGRAPH","value":[{"type":"PLAIN_TEXT","value":"87"}]}]}); +db.getCollection("rocketchat_message").insert({"_id":"S7KPMtHTniMLbnMRw","alias":"","msg":"220","attachments":[],"parseUrls":true,"groupable":false,"ts":new Date("2021-06-14T21:27:27.214Z"),"u":{"_id":"nM6vXyDLGGzSPsLNy","username":"admin","name":"Admin"},"rid":"GFR2xxircSsyJxx9F","_updatedAt":new Date("2021-06-14T21:27:27.239Z"),"urls":[],"mentions":[],"channels":[],"md":[{"type":"PARAGRAPH","value":[{"type":"PLAIN_TEXT","value":"220"}]}]}); +db.getCollection("rocketchat_message").insert({"_id":"S7pzSFnpoEi5Fc52S","alias":"","msg":"195","attachments":[],"parseUrls":true,"groupable":false,"ts":new Date("2021-06-14T21:27:18.218Z"),"u":{"_id":"nM6vXyDLGGzSPsLNy","username":"admin","name":"Admin"},"rid":"GFR2xxircSsyJxx9F","_updatedAt":new Date("2021-06-14T21:27:18.244Z"),"urls":[],"mentions":[],"channels":[],"md":[{"type":"PARAGRAPH","value":[{"type":"PLAIN_TEXT","value":"195"}]}]}); +db.getCollection("rocketchat_message").insert({"_id":"S8ZtZfXYdgHnbGDeh","alias":"","msg":"132","attachments":[],"parseUrls":true,"groupable":false,"ts":new Date("2021-06-14T21:26:52.135Z"),"u":{"_id":"nM6vXyDLGGzSPsLNy","username":"admin","name":"Admin"},"rid":"GFR2xxircSsyJxx9F","_updatedAt":new Date("2021-06-14T21:26:52.224Z"),"urls":[],"mentions":[],"channels":[],"md":[{"type":"PARAGRAPH","value":[{"type":"PLAIN_TEXT","value":"132"}]}]}); +db.getCollection("rocketchat_message").insert({"_id":"SAn6je34GPkDiyNEh","alias":"","msg":"221","attachments":[],"parseUrls":true,"groupable":false,"ts":new Date("2021-06-14T21:27:27.574Z"),"u":{"_id":"nM6vXyDLGGzSPsLNy","username":"admin","name":"Admin"},"rid":"GFR2xxircSsyJxx9F","_updatedAt":new Date("2021-06-14T21:27:27.601Z"),"urls":[],"mentions":[],"channels":[],"md":[{"type":"PARAGRAPH","value":[{"type":"PLAIN_TEXT","value":"221"}]}]}); +db.getCollection("rocketchat_message").insert({"_id":"SLEJ4mvSD3xh7Gaby","alias":"","msg":"224","attachments":[],"parseUrls":true,"groupable":false,"ts":new Date("2021-06-14T21:27:28.711Z"),"u":{"_id":"nM6vXyDLGGzSPsLNy","username":"admin","name":"Admin"},"rid":"GFR2xxircSsyJxx9F","_updatedAt":new Date("2021-06-14T21:27:28.736Z"),"urls":[],"mentions":[],"channels":[],"md":[{"type":"PARAGRAPH","value":[{"type":"PLAIN_TEXT","value":"224"}]}]}); +db.getCollection("rocketchat_message").insert({"_id":"SQM5sg8wKFyuiFp6N","rid":"5iyMRT843rNn4wwHv","tmid":"NAXDFHoxA44rsyujh","msg":"16","ts":new Date("2021-06-14T21:26:58.848Z"),"u":{"_id":"nM6vXyDLGGzSPsLNy","username":"admin","name":"Admin"},"_updatedAt":new Date("2021-06-14T21:26:58.998Z"),"urls":[],"mentions":[],"channels":[],"md":[{"type":"PARAGRAPH","value":[{"type":"PLAIN_TEXT","value":"16"}]}]}); +db.getCollection("rocketchat_message").insert({"_id":"SXzXF6bN4g3soN7nv","alias":"","msg":"183","attachments":[],"parseUrls":true,"groupable":false,"ts":new Date("2021-06-14T21:27:13.641Z"),"u":{"_id":"nM6vXyDLGGzSPsLNy","username":"admin","name":"Admin"},"rid":"GFR2xxircSsyJxx9F","_updatedAt":new Date("2021-06-14T21:27:13.663Z"),"urls":[],"mentions":[],"channels":[],"md":[{"type":"PARAGRAPH","value":[{"type":"PLAIN_TEXT","value":"183"}]}]}); +db.getCollection("rocketchat_message").insert({"_id":"ScCeKQunf9XP85PvK","alias":"","msg":"226","attachments":[],"parseUrls":true,"groupable":false,"ts":new Date("2021-06-14T21:27:29.429Z"),"u":{"_id":"nM6vXyDLGGzSPsLNy","username":"admin","name":"Admin"},"rid":"GFR2xxircSsyJxx9F","_updatedAt":new Date("2021-06-14T21:27:29.453Z"),"urls":[],"mentions":[],"channels":[],"md":[{"type":"PARAGRAPH","value":[{"type":"PLAIN_TEXT","value":"226"}]}]}); +db.getCollection("rocketchat_message").insert({"_id":"Sh8HLTpuRhE9bxd6w","alias":"","msg":"127","attachments":[],"parseUrls":true,"groupable":false,"ts":new Date("2021-06-14T21:26:49.417Z"),"u":{"_id":"nM6vXyDLGGzSPsLNy","username":"admin","name":"Admin"},"rid":"GFR2xxircSsyJxx9F","_updatedAt":new Date("2021-06-14T21:26:49.526Z"),"urls":[],"mentions":[],"channels":[],"md":[{"type":"PARAGRAPH","value":[{"type":"PLAIN_TEXT","value":"127"}]}]}); +db.getCollection("rocketchat_message").insert({"_id":"Sj74bsHaXr7RKdf3g","alias":"","msg":"206","attachments":[],"parseUrls":true,"groupable":false,"ts":new Date("2021-06-14T21:27:22.236Z"),"u":{"_id":"nM6vXyDLGGzSPsLNy","username":"admin","name":"Admin"},"rid":"GFR2xxircSsyJxx9F","_updatedAt":new Date("2021-06-14T21:27:22.259Z"),"urls":[],"mentions":[],"channels":[],"md":[{"type":"PARAGRAPH","value":[{"type":"PLAIN_TEXT","value":"206"}]}]}); +db.getCollection("rocketchat_message").insert({"_id":"SpDjvPCCuhDKwqRjb","alias":"","msg":"186","attachments":[],"parseUrls":true,"groupable":false,"ts":new Date("2021-06-14T21:27:14.868Z"),"u":{"_id":"nM6vXyDLGGzSPsLNy","username":"admin","name":"Admin"},"rid":"GFR2xxircSsyJxx9F","_updatedAt":new Date("2021-06-14T21:27:14.949Z"),"urls":[],"mentions":[],"channels":[],"md":[{"type":"PARAGRAPH","value":[{"type":"PLAIN_TEXT","value":"186"}]}]}); +db.getCollection("rocketchat_message").insert({"_id":"TChAZirf4q3ZwgsAp","alias":"","msg":"84","attachments":[],"parseUrls":true,"groupable":false,"ts":new Date("2021-06-14T21:26:33.613Z"),"u":{"_id":"nM6vXyDLGGzSPsLNy","username":"admin","name":"Admin"},"rid":"GFR2xxircSsyJxx9F","_updatedAt":new Date("2021-06-14T21:26:33.665Z"),"urls":[],"mentions":[],"channels":[],"md":[{"type":"PARAGRAPH","value":[{"type":"PLAIN_TEXT","value":"84"}]}]}); +db.getCollection("rocketchat_message").insert({"_id":"TFA29pKXYWkNYPfF3","alias":"","msg":"177","attachments":[],"parseUrls":true,"groupable":false,"ts":new Date("2021-06-14T21:27:10.883Z"),"u":{"_id":"nM6vXyDLGGzSPsLNy","username":"admin","name":"Admin"},"rid":"GFR2xxircSsyJxx9F","_updatedAt":new Date("2021-06-14T21:27:11.172Z"),"urls":[],"mentions":[],"channels":[],"md":[{"type":"PARAGRAPH","value":[{"type":"PLAIN_TEXT","value":"177"}]}]}); +db.getCollection("rocketchat_message").insert({"_id":"TPyLu2TTXuLBM4Kmc","alias":"","msg":"154","attachments":[],"parseUrls":true,"groupable":false,"ts":new Date("2021-06-14T21:27:01.709Z"),"u":{"_id":"nM6vXyDLGGzSPsLNy","username":"admin","name":"Admin"},"rid":"GFR2xxircSsyJxx9F","_updatedAt":new Date("2021-06-14T21:27:01.728Z"),"urls":[],"mentions":[],"channels":[],"md":[{"type":"PARAGRAPH","value":[{"type":"PLAIN_TEXT","value":"154"}]}]}); +db.getCollection("rocketchat_message").insert({"_id":"TXcETF7ftNrki3ALu","alias":"","msg":"201","attachments":[],"parseUrls":true,"groupable":false,"ts":new Date("2021-06-14T21:27:20.446Z"),"u":{"_id":"nM6vXyDLGGzSPsLNy","username":"admin","name":"Admin"},"rid":"GFR2xxircSsyJxx9F","_updatedAt":new Date("2021-06-14T21:27:20.478Z"),"urls":[],"mentions":[],"channels":[],"md":[{"type":"PARAGRAPH","value":[{"type":"PLAIN_TEXT","value":"201"}]}]}); +db.getCollection("rocketchat_message").insert({"_id":"W2gRc5ajwmYrYYiBq","alias":"","msg":"290","attachments":[],"parseUrls":true,"groupable":false,"ts":new Date("2021-06-14T21:27:52.687Z"),"u":{"_id":"nM6vXyDLGGzSPsLNy","username":"admin","name":"Admin"},"rid":"GFR2xxircSsyJxx9F","_updatedAt":new Date("2021-06-14T21:27:52.715Z"),"urls":[],"mentions":[],"channels":[],"md":[{"type":"PARAGRAPH","value":[{"type":"PLAIN_TEXT","value":"290"}]}]}); +db.getCollection("rocketchat_message").insert({"_id":"W5wrodggp3Hwe2urC","alias":"","msg":"164","attachments":[],"parseUrls":true,"groupable":false,"ts":new Date("2021-06-14T21:27:05.709Z"),"u":{"_id":"nM6vXyDLGGzSPsLNy","username":"admin","name":"Admin"},"rid":"GFR2xxircSsyJxx9F","_updatedAt":new Date("2021-06-14T21:27:05.729Z"),"urls":[],"mentions":[],"channels":[],"md":[{"type":"PARAGRAPH","value":[{"type":"PLAIN_TEXT","value":"164"}]}]}); +db.getCollection("rocketchat_message").insert({"_id":"W6JAFqquRcwbTZqBS","alias":"","msg":"228","attachments":[],"parseUrls":true,"groupable":false,"ts":new Date("2021-06-14T21:27:30.167Z"),"u":{"_id":"nM6vXyDLGGzSPsLNy","username":"admin","name":"Admin"},"rid":"GFR2xxircSsyJxx9F","_updatedAt":new Date("2021-06-14T21:27:30.196Z"),"urls":[],"mentions":[],"channels":[],"md":[{"type":"PARAGRAPH","value":[{"type":"PLAIN_TEXT","value":"228"}]}]}); +db.getCollection("rocketchat_message").insert({"_id":"WDZP2fFGfQNB9pLBt","alias":"","msg":"171","attachments":[],"parseUrls":true,"groupable":false,"ts":new Date("2021-06-14T21:27:08.525Z"),"u":{"_id":"nM6vXyDLGGzSPsLNy","username":"admin","name":"Admin"},"rid":"GFR2xxircSsyJxx9F","_updatedAt":new Date("2021-06-14T21:27:08.585Z"),"urls":[],"mentions":[],"channels":[],"md":[{"type":"PARAGRAPH","value":[{"type":"PLAIN_TEXT","value":"171"}]}]}); +db.getCollection("rocketchat_message").insert({"_id":"WNjmDuKBtvdTk2sPo","alias":"","msg":"126","attachments":[],"parseUrls":true,"groupable":false,"ts":new Date("2021-06-14T21:26:48.839Z"),"u":{"_id":"nM6vXyDLGGzSPsLNy","username":"admin","name":"Admin"},"rid":"GFR2xxircSsyJxx9F","_updatedAt":new Date("2021-06-14T21:26:48.992Z"),"urls":[],"mentions":[],"channels":[],"md":[{"type":"PARAGRAPH","value":[{"type":"PLAIN_TEXT","value":"126"}]}]}); +db.getCollection("rocketchat_message").insert({"_id":"WW3jiRvwAZiAvFa8a","alias":"","msg":"64","attachments":[],"parseUrls":true,"groupable":false,"ts":new Date("2021-06-14T21:26:26.499Z"),"u":{"_id":"nM6vXyDLGGzSPsLNy","username":"admin","name":"Admin"},"rid":"GFR2xxircSsyJxx9F","_updatedAt":new Date("2021-06-14T21:26:26.518Z"),"urls":[],"mentions":[],"channels":[],"md":[{"type":"PARAGRAPH","value":[{"type":"PLAIN_TEXT","value":"64"}]}]}); +db.getCollection("rocketchat_message").insert({"_id":"WgjPSsi6ZJhgGZ9Yy","alias":"","msg":"294","attachments":[],"parseUrls":true,"groupable":false,"ts":new Date("2021-06-14T21:27:54.118Z"),"u":{"_id":"nM6vXyDLGGzSPsLNy","username":"admin","name":"Admin"},"rid":"GFR2xxircSsyJxx9F","_updatedAt":new Date("2021-06-14T21:27:54.138Z"),"urls":[],"mentions":[],"channels":[],"md":[{"type":"PARAGRAPH","value":[{"type":"PLAIN_TEXT","value":"294"}]}]}); +db.getCollection("rocketchat_message").insert({"_id":"Wu6Q4rKfhqWgxqTwe","alias":"","msg":"85","attachments":[],"parseUrls":true,"groupable":false,"ts":new Date("2021-06-14T21:26:34.009Z"),"u":{"_id":"nM6vXyDLGGzSPsLNy","username":"admin","name":"Admin"},"rid":"GFR2xxircSsyJxx9F","_updatedAt":new Date("2021-06-14T21:26:34.028Z"),"urls":[],"mentions":[],"channels":[],"md":[{"type":"PARAGRAPH","value":[{"type":"PLAIN_TEXT","value":"85"}]}]}); +db.getCollection("rocketchat_message").insert({"_id":"X3d6dRXShATdWTAZQ","alias":"","msg":"216","attachments":[],"parseUrls":true,"groupable":false,"ts":new Date("2021-06-14T21:27:25.808Z"),"u":{"_id":"nM6vXyDLGGzSPsLNy","username":"admin","name":"Admin"},"rid":"GFR2xxircSsyJxx9F","_updatedAt":new Date("2021-06-14T21:27:25.826Z"),"urls":[],"mentions":[],"channels":[],"md":[{"type":"PARAGRAPH","value":[{"type":"PLAIN_TEXT","value":"216"}]}]}); +db.getCollection("rocketchat_message").insert({"_id":"X49ws5jXcMpaq7ywA","alias":"","msg":"238","attachments":[],"parseUrls":true,"groupable":false,"ts":new Date("2021-06-14T21:27:33.738Z"),"u":{"_id":"nM6vXyDLGGzSPsLNy","username":"admin","name":"Admin"},"rid":"GFR2xxircSsyJxx9F","_updatedAt":new Date("2021-06-14T21:27:33.759Z"),"urls":[],"mentions":[],"channels":[],"md":[{"type":"PARAGRAPH","value":[{"type":"PLAIN_TEXT","value":"238"}]}]}); +db.getCollection("rocketchat_message").insert({"_id":"XF32syPxCRi36aejC","alias":"","msg":"125","attachments":[],"parseUrls":true,"groupable":false,"ts":new Date("2021-06-14T21:26:48.340Z"),"u":{"_id":"nM6vXyDLGGzSPsLNy","username":"admin","name":"Admin"},"rid":"GFR2xxircSsyJxx9F","_updatedAt":new Date("2021-06-14T21:26:48.433Z"),"urls":[],"mentions":[],"channels":[],"md":[{"type":"PARAGRAPH","value":[{"type":"PLAIN_TEXT","value":"125"}]}]}); +db.getCollection("rocketchat_message").insert({"_id":"Xvkhsa6ysfMZkehLF","alias":"","msg":"248","attachments":[],"parseUrls":true,"groupable":false,"ts":new Date("2021-06-14T21:27:37.356Z"),"u":{"_id":"nM6vXyDLGGzSPsLNy","username":"admin","name":"Admin"},"rid":"GFR2xxircSsyJxx9F","_updatedAt":new Date("2021-06-14T21:27:37.374Z"),"urls":[],"mentions":[],"channels":[],"md":[{"type":"PARAGRAPH","value":[{"type":"PLAIN_TEXT","value":"248"}]}]}); +db.getCollection("rocketchat_message").insert({"_id":"Y8XHkq3WpexeY7Brw","alias":"","msg":"77","attachments":[],"parseUrls":true,"groupable":false,"ts":new Date("2021-06-14T21:26:31.125Z"),"u":{"_id":"nM6vXyDLGGzSPsLNy","username":"admin","name":"Admin"},"rid":"GFR2xxircSsyJxx9F","_updatedAt":new Date("2021-06-14T21:26:31.144Z"),"urls":[],"mentions":[],"channels":[],"md":[{"type":"PARAGRAPH","value":[{"type":"PLAIN_TEXT","value":"77"}]}]}); +db.getCollection("rocketchat_message").insert({"_id":"YEn2SpZ6QgeGjurvd","alias":"","msg":"208","attachments":[],"parseUrls":true,"groupable":false,"ts":new Date("2021-06-14T21:27:22.955Z"),"u":{"_id":"nM6vXyDLGGzSPsLNy","username":"admin","name":"Admin"},"rid":"GFR2xxircSsyJxx9F","_updatedAt":new Date("2021-06-14T21:27:22.973Z"),"urls":[],"mentions":[],"channels":[],"md":[{"type":"PARAGRAPH","value":[{"type":"PLAIN_TEXT","value":"208"}]}]}); +db.getCollection("rocketchat_message").insert({"_id":"YGkkNtQbXe9JbwnXn","alias":"","msg":"110","attachments":[],"parseUrls":true,"groupable":false,"ts":new Date("2021-06-14T21:26:42.894Z"),"u":{"_id":"nM6vXyDLGGzSPsLNy","username":"admin","name":"Admin"},"rid":"GFR2xxircSsyJxx9F","_updatedAt":new Date("2021-06-14T21:26:42.921Z"),"urls":[],"mentions":[],"channels":[],"md":[{"type":"PARAGRAPH","value":[{"type":"PLAIN_TEXT","value":"110"}]}]}); +db.getCollection("rocketchat_message").insert({"_id":"Ymg9aMZH5u8cPQdye","alias":"","msg":"138","attachments":[],"parseUrls":true,"groupable":false,"ts":new Date("2021-06-14T21:26:55.162Z"),"u":{"_id":"nM6vXyDLGGzSPsLNy","username":"admin","name":"Admin"},"rid":"GFR2xxircSsyJxx9F","_updatedAt":new Date("2021-06-14T21:26:55.238Z"),"urls":[],"mentions":[],"channels":[],"md":[{"type":"PARAGRAPH","value":[{"type":"PLAIN_TEXT","value":"138"}]}]}); +db.getCollection("rocketchat_message").insert({"_id":"YuHwpNgMRje5MsQJG","alias":"","msg":"47","attachments":[],"parseUrls":true,"groupable":false,"ts":new Date("2021-06-14T21:26:20.543Z"),"u":{"_id":"nM6vXyDLGGzSPsLNy","username":"admin","name":"Admin"},"rid":"GFR2xxircSsyJxx9F","_updatedAt":new Date("2021-06-14T21:26:20.557Z"),"urls":[],"mentions":[],"channels":[],"md":[{"type":"PARAGRAPH","value":[{"type":"PLAIN_TEXT","value":"47"}]}]}); +db.getCollection("rocketchat_message").insert({"_id":"Z7fqoZYFgA7TnNomA","alias":"","msg":"179","attachments":[],"parseUrls":true,"groupable":false,"ts":new Date("2021-06-14T21:27:11.977Z"),"u":{"_id":"nM6vXyDLGGzSPsLNy","username":"admin","name":"Admin"},"rid":"GFR2xxircSsyJxx9F","_updatedAt":new Date("2021-06-14T21:27:12.063Z"),"urls":[],"mentions":[],"channels":[],"md":[{"type":"PARAGRAPH","value":[{"type":"PLAIN_TEXT","value":"179"}]}]}); +db.getCollection("rocketchat_message").insert({"_id":"Z9E3BZWejTKiSvaKE","alias":"","msg":"107","attachments":[],"parseUrls":true,"groupable":false,"ts":new Date("2021-06-14T21:26:41.868Z"),"u":{"_id":"nM6vXyDLGGzSPsLNy","username":"admin","name":"Admin"},"rid":"GFR2xxircSsyJxx9F","_updatedAt":new Date("2021-06-14T21:26:41.886Z"),"urls":[],"mentions":[],"channels":[],"md":[{"type":"PARAGRAPH","value":[{"type":"PLAIN_TEXT","value":"107"}]}]}); +db.getCollection("rocketchat_message").insert({"_id":"ZFuEA3XmwGu3PAzv9","alias":"","msg":"20","attachments":[],"parseUrls":true,"groupable":false,"ts":new Date("2021-06-14T21:26:11.198Z"),"u":{"_id":"nM6vXyDLGGzSPsLNy","username":"admin","name":"Admin"},"rid":"GFR2xxircSsyJxx9F","_updatedAt":new Date("2021-06-14T21:26:11.217Z"),"urls":[],"mentions":[],"channels":[],"md":[{"type":"PARAGRAPH","value":[{"type":"PLAIN_TEXT","value":"20"}]}]}); +db.getCollection("rocketchat_message").insert({"_id":"ZHpwo4dzEjJS4sSmG","alias":"","msg":"25","attachments":[],"parseUrls":true,"groupable":false,"ts":new Date("2021-06-14T21:26:12.970Z"),"u":{"_id":"nM6vXyDLGGzSPsLNy","username":"admin","name":"Admin"},"rid":"GFR2xxircSsyJxx9F","_updatedAt":new Date("2021-06-14T21:26:12.988Z"),"urls":[],"mentions":[],"channels":[],"md":[{"type":"PARAGRAPH","value":[{"type":"PLAIN_TEXT","value":"25"}]}]}); +db.getCollection("rocketchat_message").insert({"_id":"ZJQe834wHqGsHqoYL","alias":"","msg":"209","attachments":[],"parseUrls":true,"groupable":false,"ts":new Date("2021-06-14T21:27:23.306Z"),"u":{"_id":"nM6vXyDLGGzSPsLNy","username":"admin","name":"Admin"},"rid":"GFR2xxircSsyJxx9F","_updatedAt":new Date("2021-06-14T21:27:23.327Z"),"urls":[],"mentions":[],"channels":[],"md":[{"type":"PARAGRAPH","value":[{"type":"PLAIN_TEXT","value":"209"}]}]}); +db.getCollection("rocketchat_message").insert({"_id":"ZKSaW8vspoojf6bM2","alias":"","msg":"181","attachments":[],"parseUrls":true,"groupable":false,"ts":new Date("2021-06-14T21:27:12.827Z"),"u":{"_id":"nM6vXyDLGGzSPsLNy","username":"admin","name":"Admin"},"rid":"GFR2xxircSsyJxx9F","_updatedAt":new Date("2021-06-14T21:27:12.896Z"),"urls":[],"mentions":[],"channels":[],"md":[{"type":"PARAGRAPH","value":[{"type":"PLAIN_TEXT","value":"181"}]}]}); +db.getCollection("rocketchat_message").insert({"_id":"ZP8duwLKiLaGaaW5J","alias":"","msg":"60","attachments":[],"parseUrls":true,"groupable":false,"ts":new Date("2021-06-14T21:26:25.068Z"),"u":{"_id":"nM6vXyDLGGzSPsLNy","username":"admin","name":"Admin"},"rid":"GFR2xxircSsyJxx9F","_updatedAt":new Date("2021-06-14T21:26:25.095Z"),"urls":[],"mentions":[],"channels":[],"md":[{"type":"PARAGRAPH","value":[{"type":"PLAIN_TEXT","value":"60"}]}]}); +db.getCollection("rocketchat_message").insert({"_id":"Zaoa684RSi7Rs7Rid","alias":"","msg":"192","attachments":[],"parseUrls":true,"groupable":false,"ts":new Date("2021-06-14T21:27:17.144Z"),"u":{"_id":"nM6vXyDLGGzSPsLNy","username":"admin","name":"Admin"},"rid":"GFR2xxircSsyJxx9F","_updatedAt":new Date("2021-06-14T21:27:17.170Z"),"urls":[],"mentions":[],"channels":[],"md":[{"type":"PARAGRAPH","value":[{"type":"PLAIN_TEXT","value":"192"}]}]}); +db.getCollection("rocketchat_message").insert({"_id":"ZgGv86jmZ2zFT2bHE","alias":"","msg":"76","attachments":[],"parseUrls":true,"groupable":false,"ts":new Date("2021-06-14T21:26:30.767Z"),"u":{"_id":"nM6vXyDLGGzSPsLNy","username":"admin","name":"Admin"},"rid":"GFR2xxircSsyJxx9F","_updatedAt":new Date("2021-06-14T21:26:30.799Z"),"urls":[],"mentions":[],"channels":[],"md":[{"type":"PARAGRAPH","value":[{"type":"PLAIN_TEXT","value":"76"}]}]}); +db.getCollection("rocketchat_message").insert({"_id":"ZgWXaPAjiYxNzCyYC","alias":"","msg":"203","attachments":[],"parseUrls":true,"groupable":false,"ts":new Date("2021-06-14T21:27:21.193Z"),"u":{"_id":"nM6vXyDLGGzSPsLNy","username":"admin","name":"Admin"},"rid":"GFR2xxircSsyJxx9F","_updatedAt":new Date("2021-06-14T21:27:21.209Z"),"urls":[],"mentions":[],"channels":[],"md":[{"type":"PARAGRAPH","value":[{"type":"PLAIN_TEXT","value":"203"}]}]}); +db.getCollection("rocketchat_message").insert({"_id":"Zhq9AmbzgGFiWJDyd","alias":"","msg":"256","attachments":[],"parseUrls":true,"groupable":false,"ts":new Date("2021-06-14T21:27:40.251Z"),"u":{"_id":"nM6vXyDLGGzSPsLNy","username":"admin","name":"Admin"},"rid":"GFR2xxircSsyJxx9F","_updatedAt":new Date("2021-06-14T21:27:40.302Z"),"urls":[],"mentions":[],"channels":[],"md":[{"type":"PARAGRAPH","value":[{"type":"PLAIN_TEXT","value":"256"}]}]}); +db.getCollection("rocketchat_message").insert({"_id":"Zpscdpv4Mf99uczkH","alias":"","msg":"66","attachments":[],"parseUrls":true,"groupable":false,"ts":new Date("2021-06-14T21:26:27.214Z"),"u":{"_id":"nM6vXyDLGGzSPsLNy","username":"admin","name":"Admin"},"rid":"GFR2xxircSsyJxx9F","_updatedAt":new Date("2021-06-14T21:26:27.238Z"),"urls":[],"mentions":[],"channels":[],"md":[{"type":"PARAGRAPH","value":[{"type":"PLAIN_TEXT","value":"66"}]}]}); +db.getCollection("rocketchat_message").insert({"_id":"ZsRjyeDqxgQSXsb5G","alias":"","msg":"159","attachments":[],"parseUrls":true,"groupable":false,"ts":new Date("2021-06-14T21:27:03.702Z"),"u":{"_id":"nM6vXyDLGGzSPsLNy","username":"admin","name":"Admin"},"rid":"GFR2xxircSsyJxx9F","_updatedAt":new Date("2021-06-14T21:27:03.778Z"),"urls":[],"mentions":[],"channels":[],"md":[{"type":"PARAGRAPH","value":[{"type":"PLAIN_TEXT","value":"159"}]}]}); +db.getCollection("rocketchat_message").insert({"_id":"ZzTWmQnPiHLCArw7s","alias":"","msg":"26","attachments":[],"parseUrls":true,"groupable":false,"ts":new Date("2021-06-14T21:26:13.315Z"),"u":{"_id":"nM6vXyDLGGzSPsLNy","username":"admin","name":"Admin"},"rid":"GFR2xxircSsyJxx9F","_updatedAt":new Date("2021-06-14T21:26:13.336Z"),"urls":[],"mentions":[],"channels":[],"md":[{"type":"PARAGRAPH","value":[{"type":"PLAIN_TEXT","value":"26"}]}]}); +db.getCollection("rocketchat_message").insert({"_id":"a82cWhkFEeCXEMxmP","alias":"","msg":"35","attachments":[],"parseUrls":true,"groupable":false,"ts":new Date("2021-06-14T21:26:16.466Z"),"u":{"_id":"nM6vXyDLGGzSPsLNy","username":"admin","name":"Admin"},"rid":"GFR2xxircSsyJxx9F","_updatedAt":new Date("2021-06-14T21:26:16.481Z"),"urls":[],"mentions":[],"channels":[],"md":[{"type":"PARAGRAPH","value":[{"type":"PLAIN_TEXT","value":"35"}]}]}); +db.getCollection("rocketchat_message").insert({"_id":"aFMhY68mGFMPD5eHM","alias":"","msg":"135","attachments":[],"parseUrls":true,"groupable":false,"ts":new Date("2021-06-14T21:26:53.554Z"),"u":{"_id":"nM6vXyDLGGzSPsLNy","username":"admin","name":"Admin"},"rid":"GFR2xxircSsyJxx9F","_updatedAt":new Date("2021-06-14T21:26:53.698Z"),"urls":[],"mentions":[],"channels":[],"md":[{"type":"PARAGRAPH","value":[{"type":"PLAIN_TEXT","value":"135"}]}]}); +db.getCollection("rocketchat_message").insert({"_id":"aqXfs7SvG4knixCE3","alias":"","msg":"259","attachments":[],"parseUrls":true,"groupable":false,"ts":new Date("2021-06-14T21:27:41.335Z"),"u":{"_id":"nM6vXyDLGGzSPsLNy","username":"admin","name":"Admin"},"rid":"GFR2xxircSsyJxx9F","_updatedAt":new Date("2021-06-14T21:27:41.353Z"),"urls":[],"mentions":[],"channels":[],"md":[{"type":"PARAGRAPH","value":[{"type":"PLAIN_TEXT","value":"259"}]}]}); +db.getCollection("rocketchat_message").insert({"_id":"asNxLidHfTi7E3rri","rid":"GFR2xxircSsyJxx9F","msg":"[ ](http://localhost:3000/group/jumping?msg=DvKX5qbzg8CWE3oNC) Quote first message","ts":new Date("2021-06-14T21:28:50.477Z"),"u":{"_id":"nM6vXyDLGGzSPsLNy","username":"admin","name":"Admin"},"_updatedAt":new Date("2021-06-14T21:28:50.537Z"),"attachments":[{"text":"1","author_name":"admin","author_icon":"/avatar/admin","message_link":"http://localhost:3000/group/jumping?msg=DvKX5qbzg8CWE3oNC","attachments":[],"ts":new Date("2021-06-14T21:24:50.182Z")}],"urls":[{"url":"http://localhost:3000/group/jumping?msg=DvKX5qbzg8CWE3oNC","ignoreParse":true}],"mentions":[],"channels":[],"md":[{"type":"PARAGRAPH","value":[{"type":"LINK","value":{"src":{"type":"PLAIN_TEXT","value":"http://localhost:3000/group/jumping?msg=DvKX5qbzg8CWE3oNC"},"label":{"type":"PLAIN_TEXT","value":" "}}},{"type":"PLAIN_TEXT","value":" Quote first message"}]}]}); +db.getCollection("rocketchat_message").insert({"_id":"axvp8s25ARwDpfzmh","alias":"","msg":"136","attachments":[],"parseUrls":true,"groupable":false,"ts":new Date("2021-06-14T21:26:54.051Z"),"u":{"_id":"nM6vXyDLGGzSPsLNy","username":"admin","name":"Admin"},"rid":"GFR2xxircSsyJxx9F","_updatedAt":new Date("2021-06-14T21:26:54.108Z"),"urls":[],"mentions":[],"channels":[],"md":[{"type":"PARAGRAPH","value":[{"type":"PLAIN_TEXT","value":"136"}]}]}); +db.getCollection("rocketchat_message").insert({"_id":"b4mfvGcu54E5fZcFT","alias":"","msg":"175","attachments":[],"parseUrls":true,"groupable":false,"ts":new Date("2021-06-14T21:27:10.090Z"),"u":{"_id":"nM6vXyDLGGzSPsLNy","username":"admin","name":"Admin"},"rid":"GFR2xxircSsyJxx9F","_updatedAt":new Date("2021-06-14T21:27:10.139Z"),"urls":[],"mentions":[],"channels":[],"md":[{"type":"PARAGRAPH","value":[{"type":"PLAIN_TEXT","value":"175"}]}]}); +db.getCollection("rocketchat_message").insert({"_id":"b5E537jXp9K4oN4Wi","alias":"","msg":"246","attachments":[],"parseUrls":true,"groupable":false,"ts":new Date("2021-06-14T21:27:36.635Z"),"u":{"_id":"nM6vXyDLGGzSPsLNy","username":"admin","name":"Admin"},"rid":"GFR2xxircSsyJxx9F","_updatedAt":new Date("2021-06-14T21:27:36.664Z"),"urls":[],"mentions":[],"channels":[],"md":[{"type":"PARAGRAPH","value":[{"type":"PLAIN_TEXT","value":"246"}]}]}); +db.getCollection("rocketchat_message").insert({"_id":"bKGeCjGTDGxqEZ6hm","alias":"","msg":"161","attachments":[],"parseUrls":true,"groupable":false,"ts":new Date("2021-06-14T21:27:04.498Z"),"u":{"_id":"nM6vXyDLGGzSPsLNy","username":"admin","name":"Admin"},"rid":"GFR2xxircSsyJxx9F","_updatedAt":new Date("2021-06-14T21:27:04.522Z"),"urls":[],"mentions":[],"channels":[],"md":[{"type":"PARAGRAPH","value":[{"type":"PLAIN_TEXT","value":"161"}]}]}); +db.getCollection("rocketchat_message").insert({"_id":"bQvAAAGyDWfFF6Y7A","alias":"","msg":"163","attachments":[],"parseUrls":true,"groupable":false,"ts":new Date("2021-06-14T21:27:05.358Z"),"u":{"_id":"nM6vXyDLGGzSPsLNy","username":"admin","name":"Admin"},"rid":"GFR2xxircSsyJxx9F","_updatedAt":new Date("2021-06-14T21:27:05.380Z"),"urls":[],"mentions":[],"channels":[],"md":[{"type":"PARAGRAPH","value":[{"type":"PLAIN_TEXT","value":"163"}]}]}); +db.getCollection("rocketchat_message").insert({"_id":"bTNtxyTgianagFSNx","alias":"","msg":"112","attachments":[],"parseUrls":true,"groupable":false,"ts":new Date("2021-06-14T21:26:43.614Z"),"u":{"_id":"nM6vXyDLGGzSPsLNy","username":"admin","name":"Admin"},"rid":"GFR2xxircSsyJxx9F","_updatedAt":new Date("2021-06-14T21:26:43.632Z"),"urls":[],"mentions":[],"channels":[],"md":[{"type":"PARAGRAPH","value":[{"type":"PLAIN_TEXT","value":"112"}]}]}); +db.getCollection("rocketchat_message").insert({"_id":"bYJ54jdELZ3QdHHas","alias":"","msg":"244","attachments":[],"parseUrls":true,"groupable":false,"ts":new Date("2021-06-14T21:27:35.923Z"),"u":{"_id":"nM6vXyDLGGzSPsLNy","username":"admin","name":"Admin"},"rid":"GFR2xxircSsyJxx9F","_updatedAt":new Date("2021-06-14T21:27:35.944Z"),"urls":[],"mentions":[],"channels":[],"md":[{"type":"PARAGRAPH","value":[{"type":"PLAIN_TEXT","value":"244"}]}]}); +db.getCollection("rocketchat_message").insert({"_id":"baWZ2thegi7MzuqdG","alias":"","msg":"254","attachments":[],"parseUrls":true,"groupable":false,"ts":new Date("2021-06-14T21:27:39.537Z"),"u":{"_id":"nM6vXyDLGGzSPsLNy","username":"admin","name":"Admin"},"rid":"GFR2xxircSsyJxx9F","_updatedAt":new Date("2021-06-14T21:27:39.557Z"),"urls":[],"mentions":[],"channels":[],"md":[{"type":"PARAGRAPH","value":[{"type":"PLAIN_TEXT","value":"254"}]}]}); +db.getCollection("rocketchat_message").insert({"_id":"bjJtt5nXd9WNgyFfH","rid":"5iyMRT843rNn4wwHv","tmid":"NAXDFHoxA44rsyujh","msg":"21","ts":new Date("2021-06-14T21:27:04.747Z"),"u":{"_id":"nM6vXyDLGGzSPsLNy","username":"admin","name":"Admin"},"_updatedAt":new Date("2021-06-14T21:27:04.852Z"),"urls":[],"mentions":[],"channels":[],"md":[{"type":"PARAGRAPH","value":[{"type":"PLAIN_TEXT","value":"21"}]}]}); +db.getCollection("rocketchat_message").insert({"_id":"bsefeQWb2q2TbtMw7","alias":"","msg":"242","attachments":[],"parseUrls":true,"groupable":false,"ts":new Date("2021-06-14T21:27:35.213Z"),"u":{"_id":"nM6vXyDLGGzSPsLNy","username":"admin","name":"Admin"},"rid":"GFR2xxircSsyJxx9F","_updatedAt":new Date("2021-06-14T21:27:35.231Z"),"urls":[],"mentions":[],"channels":[],"md":[{"type":"PARAGRAPH","value":[{"type":"PLAIN_TEXT","value":"242"}]}]}); +db.getCollection("rocketchat_message").insert({"_id":"btXJwZ48vySPKm53G","alias":"","msg":"40","attachments":[],"parseUrls":true,"groupable":false,"ts":new Date("2021-06-14T21:26:18.166Z"),"u":{"_id":"nM6vXyDLGGzSPsLNy","username":"admin","name":"Admin"},"rid":"GFR2xxircSsyJxx9F","_updatedAt":new Date("2021-06-14T21:26:18.181Z"),"urls":[],"mentions":[],"channels":[],"md":[{"type":"PARAGRAPH","value":[{"type":"PLAIN_TEXT","value":"40"}]}]}); +db.getCollection("rocketchat_message").insert({"_id":"c2iHGieZ8bpnt35rF","rid":"5iyMRT843rNn4wwHv","tmid":"NAXDFHoxA44rsyujh","msg":"28","ts":new Date("2021-06-14T21:27:12.665Z"),"u":{"_id":"nM6vXyDLGGzSPsLNy","username":"admin","name":"Admin"},"_updatedAt":new Date("2021-06-14T21:27:12.718Z"),"urls":[],"mentions":[],"channels":[],"md":[{"type":"PARAGRAPH","value":[{"type":"PLAIN_TEXT","value":"28"}]}]}); +db.getCollection("rocketchat_message").insert({"_id":"c3pTEP9xYmiMRbPZ4","alias":"","msg":"249","attachments":[],"parseUrls":true,"groupable":false,"ts":new Date("2021-06-14T21:27:37.704Z"),"u":{"_id":"nM6vXyDLGGzSPsLNy","username":"admin","name":"Admin"},"rid":"GFR2xxircSsyJxx9F","_updatedAt":new Date("2021-06-14T21:27:37.738Z"),"urls":[],"mentions":[],"channels":[],"md":[{"type":"PARAGRAPH","value":[{"type":"PLAIN_TEXT","value":"249"}]}]}); +db.getCollection("rocketchat_message").insert({"_id":"cFFH3n7Rt2ycvJyuj","alias":"","msg":"270","attachments":[],"parseUrls":true,"groupable":false,"ts":new Date("2021-06-14T21:27:45.206Z"),"u":{"_id":"nM6vXyDLGGzSPsLNy","username":"admin","name":"Admin"},"rid":"GFR2xxircSsyJxx9F","_updatedAt":new Date("2021-06-14T21:27:45.223Z"),"urls":[],"mentions":[],"channels":[],"md":[{"type":"PARAGRAPH","value":[{"type":"PLAIN_TEXT","value":"270"}]}]}); +db.getCollection("rocketchat_message").insert({"_id":"cZw93Xs7hCywM22rw","alias":"","msg":"101","attachments":[],"parseUrls":true,"groupable":false,"ts":new Date("2021-06-14T21:26:39.717Z"),"u":{"_id":"nM6vXyDLGGzSPsLNy","username":"admin","name":"Admin"},"rid":"GFR2xxircSsyJxx9F","_updatedAt":new Date("2021-06-14T21:26:39.736Z"),"urls":[],"mentions":[],"channels":[],"md":[{"type":"PARAGRAPH","value":[{"type":"PLAIN_TEXT","value":"101"}]}]}); +db.getCollection("rocketchat_message").insert({"_id":"coBfxKdjuMdr6nAo9","alias":"","msg":"115","attachments":[],"parseUrls":true,"groupable":false,"ts":new Date("2021-06-14T21:26:44.656Z"),"u":{"_id":"nM6vXyDLGGzSPsLNy","username":"admin","name":"Admin"},"rid":"GFR2xxircSsyJxx9F","_updatedAt":new Date("2021-06-14T21:26:44.677Z"),"urls":[],"mentions":[],"channels":[],"md":[{"type":"PARAGRAPH","value":[{"type":"PLAIN_TEXT","value":"115"}]}]}); +db.getCollection("rocketchat_message").insert({"_id":"ctJwtBmsAragPidYK","alias":"","msg":"214","attachments":[],"parseUrls":true,"groupable":false,"ts":new Date("2021-06-14T21:27:25.103Z"),"u":{"_id":"nM6vXyDLGGzSPsLNy","username":"admin","name":"Admin"},"rid":"GFR2xxircSsyJxx9F","_updatedAt":new Date("2021-06-14T21:27:25.122Z"),"urls":[],"mentions":[],"channels":[],"md":[{"type":"PARAGRAPH","value":[{"type":"PLAIN_TEXT","value":"214"}]}]}); +db.getCollection("rocketchat_message").insert({"_id":"cu7CR5vzM7zhHcyxp","alias":"","msg":"155","attachments":[],"parseUrls":true,"groupable":false,"ts":new Date("2021-06-14T21:27:02.072Z"),"u":{"_id":"nM6vXyDLGGzSPsLNy","username":"admin","name":"Admin"},"rid":"GFR2xxircSsyJxx9F","_updatedAt":new Date("2021-06-14T21:27:02.101Z"),"urls":[],"mentions":[],"channels":[],"md":[{"type":"PARAGRAPH","value":[{"type":"PLAIN_TEXT","value":"155"}]}]}); +db.getCollection("rocketchat_message").insert({"_id":"czpi4xpGasv7qLEDG","rid":"5iyMRT843rNn4wwHv","tmid":"NAXDFHoxA44rsyujh","msg":"5","ts":new Date("2021-06-14T21:26:50.306Z"),"u":{"_id":"nM6vXyDLGGzSPsLNy","username":"admin","name":"Admin"},"_updatedAt":new Date("2021-06-14T21:26:50.415Z"),"urls":[],"mentions":[],"channels":[],"md":[{"type":"PARAGRAPH","value":[{"type":"PLAIN_TEXT","value":"5"}]}]}); +db.getCollection("rocketchat_message").insert({"_id":"dA923aH8Pum3yaGFH","alias":"","msg":"170","attachments":[],"parseUrls":true,"groupable":false,"ts":new Date("2021-06-14T21:27:08.150Z"),"u":{"_id":"nM6vXyDLGGzSPsLNy","username":"admin","name":"Admin"},"rid":"GFR2xxircSsyJxx9F","_updatedAt":new Date("2021-06-14T21:27:08.174Z"),"urls":[],"mentions":[],"channels":[],"md":[{"type":"PARAGRAPH","value":[{"type":"PLAIN_TEXT","value":"170"}]}]}); +db.getCollection("rocketchat_message").insert({"_id":"dADdCiC86XSM6x3H5","alias":"","msg":"113","attachments":[],"parseUrls":true,"groupable":false,"ts":new Date("2021-06-14T21:26:43.956Z"),"u":{"_id":"nM6vXyDLGGzSPsLNy","username":"admin","name":"Admin"},"rid":"GFR2xxircSsyJxx9F","_updatedAt":new Date("2021-06-14T21:26:43.974Z"),"urls":[],"mentions":[],"channels":[],"md":[{"type":"PARAGRAPH","value":[{"type":"PLAIN_TEXT","value":"113"}]}]}); +db.getCollection("rocketchat_message").insert({"_id":"dJ4RcvX7WP8xBjh3x","alias":"","msg":"57","attachments":[],"parseUrls":true,"groupable":false,"ts":new Date("2021-06-14T21:26:24.020Z"),"u":{"_id":"nM6vXyDLGGzSPsLNy","username":"admin","name":"Admin"},"rid":"GFR2xxircSsyJxx9F","_updatedAt":new Date("2021-06-14T21:26:24.043Z"),"urls":[],"mentions":[],"channels":[],"md":[{"type":"PARAGRAPH","value":[{"type":"PLAIN_TEXT","value":"57"}]}]}); +db.getCollection("rocketchat_message").insert({"_id":"dcYJDKLis496fq37P","alias":"","msg":"30","attachments":[],"parseUrls":true,"groupable":false,"ts":new Date("2021-06-14T21:26:14.728Z"),"u":{"_id":"nM6vXyDLGGzSPsLNy","username":"admin","name":"Admin"},"rid":"GFR2xxircSsyJxx9F","_updatedAt":new Date("2021-06-14T21:26:14.748Z"),"urls":[],"mentions":[],"channels":[],"md":[{"type":"PARAGRAPH","value":[{"type":"PLAIN_TEXT","value":"30"}]}]}); +db.getCollection("rocketchat_message").insert({"_id":"dsNcCY6TFcR8DJdhh","alias":"","msg":"45","attachments":[],"parseUrls":true,"groupable":false,"ts":new Date("2021-06-14T21:26:19.860Z"),"u":{"_id":"nM6vXyDLGGzSPsLNy","username":"admin","name":"Admin"},"rid":"GFR2xxircSsyJxx9F","_updatedAt":new Date("2021-06-14T21:26:19.874Z"),"urls":[],"mentions":[],"channels":[],"md":[{"type":"PARAGRAPH","value":[{"type":"PLAIN_TEXT","value":"45"}]}]}); +db.getCollection("rocketchat_message").insert({"_id":"duF48GeHr6JXE627H","alias":"","msg":"121","attachments":[],"parseUrls":true,"groupable":false,"ts":new Date("2021-06-14T21:26:46.816Z"),"u":{"_id":"nM6vXyDLGGzSPsLNy","username":"admin","name":"Admin"},"rid":"GFR2xxircSsyJxx9F","_updatedAt":new Date("2021-06-14T21:26:46.900Z"),"urls":[],"mentions":[],"channels":[],"md":[{"type":"PARAGRAPH","value":[{"type":"PLAIN_TEXT","value":"121"}]}]}); +db.getCollection("rocketchat_message").insert({"_id":"eCXzwsPZN4aC9oasY","alias":"","msg":"142","attachments":[],"parseUrls":true,"groupable":false,"ts":new Date("2021-06-14T21:26:56.815Z"),"u":{"_id":"nM6vXyDLGGzSPsLNy","username":"admin","name":"Admin"},"rid":"GFR2xxircSsyJxx9F","_updatedAt":new Date("2021-06-14T21:26:56.895Z"),"urls":[],"mentions":[],"channels":[],"md":[{"type":"PARAGRAPH","value":[{"type":"PLAIN_TEXT","value":"142"}]}]}); +db.getCollection("rocketchat_message").insert({"_id":"ebRbDWuZ7HCgzAdnB","alias":"","msg":"288","attachments":[],"parseUrls":true,"groupable":false,"ts":new Date("2021-06-14T21:27:51.990Z"),"u":{"_id":"nM6vXyDLGGzSPsLNy","username":"admin","name":"Admin"},"rid":"GFR2xxircSsyJxx9F","_updatedAt":new Date("2021-06-14T21:27:52.012Z"),"urls":[],"mentions":[],"channels":[],"md":[{"type":"PARAGRAPH","value":[{"type":"PLAIN_TEXT","value":"288"}]}]}); +db.getCollection("rocketchat_message").insert({"_id":"etXetwZLWJ8quLbXY","alias":"","msg":"152","attachments":[],"parseUrls":true,"groupable":false,"ts":new Date("2021-06-14T21:27:00.916Z"),"u":{"_id":"nM6vXyDLGGzSPsLNy","username":"admin","name":"Admin"},"rid":"GFR2xxircSsyJxx9F","_updatedAt":new Date("2021-06-14T21:27:00.935Z"),"urls":[],"mentions":[],"channels":[],"md":[{"type":"PARAGRAPH","value":[{"type":"PLAIN_TEXT","value":"152"}]}]}); +db.getCollection("rocketchat_message").insert({"_id":"f2PJHaeQhN38ZWYPc","rid":"5iyMRT843rNn4wwHv","tmid":"NAXDFHoxA44rsyujh","msg":"20","ts":new Date("2021-06-14T21:27:03.534Z"),"u":{"_id":"nM6vXyDLGGzSPsLNy","username":"admin","name":"Admin"},"_updatedAt":new Date("2021-06-14T21:27:03.605Z"),"urls":[],"mentions":[],"channels":[],"md":[{"type":"PARAGRAPH","value":[{"type":"PLAIN_TEXT","value":"20"}]}]}); +db.getCollection("rocketchat_message").insert({"_id":"f36eGwj5ZXT3FzXsQ","alias":"","msg":"122","attachments":[],"parseUrls":true,"groupable":false,"ts":new Date("2021-06-14T21:26:47.241Z"),"u":{"_id":"nM6vXyDLGGzSPsLNy","username":"admin","name":"Admin"},"rid":"GFR2xxircSsyJxx9F","_updatedAt":new Date("2021-06-14T21:26:47.260Z"),"urls":[],"mentions":[],"channels":[],"md":[{"type":"PARAGRAPH","value":[{"type":"PLAIN_TEXT","value":"122"}]}]}); +db.getCollection("rocketchat_message").insert({"_id":"f3QBqS3TRsfQknctT","rid":"5iyMRT843rNn4wwHv","tmid":"NAXDFHoxA44rsyujh","msg":"29","ts":new Date("2021-06-14T21:27:13.767Z"),"u":{"_id":"nM6vXyDLGGzSPsLNy","username":"admin","name":"Admin"},"_updatedAt":new Date("2021-06-14T21:27:13.882Z"),"urls":[],"mentions":[],"channels":[],"md":[{"type":"PARAGRAPH","value":[{"type":"PLAIN_TEXT","value":"29"}]}]}); +db.getCollection("rocketchat_message").insert({"_id":"f5mHjp7PgC4oxKxWB","alias":"","msg":"233","attachments":[],"parseUrls":true,"groupable":false,"ts":new Date("2021-06-14T21:27:31.997Z"),"u":{"_id":"nM6vXyDLGGzSPsLNy","username":"admin","name":"Admin"},"rid":"GFR2xxircSsyJxx9F","_updatedAt":new Date("2021-06-14T21:27:32.023Z"),"urls":[],"mentions":[],"channels":[],"md":[{"type":"PARAGRAPH","value":[{"type":"PLAIN_TEXT","value":"233"}]}]}); +db.getCollection("rocketchat_message").insert({"_id":"fH5EArKGppbm5fu4H","alias":"","msg":"207","attachments":[],"parseUrls":true,"groupable":false,"ts":new Date("2021-06-14T21:27:22.600Z"),"u":{"_id":"nM6vXyDLGGzSPsLNy","username":"admin","name":"Admin"},"rid":"GFR2xxircSsyJxx9F","_updatedAt":new Date("2021-06-14T21:27:22.624Z"),"urls":[],"mentions":[],"channels":[],"md":[{"type":"PARAGRAPH","value":[{"type":"PLAIN_TEXT","value":"207"}]}]}); +db.getCollection("rocketchat_message").insert({"_id":"fWxDpwWjLtDiWaGNh","alias":"","msg":"298","attachments":[],"parseUrls":true,"groupable":false,"ts":new Date("2021-06-14T21:27:55.560Z"),"u":{"_id":"nM6vXyDLGGzSPsLNy","username":"admin","name":"Admin"},"rid":"GFR2xxircSsyJxx9F","_updatedAt":new Date("2021-06-14T21:27:55.576Z"),"urls":[],"mentions":[],"channels":[],"md":[{"type":"PARAGRAPH","value":[{"type":"PLAIN_TEXT","value":"298"}]}]}); +db.getCollection("rocketchat_message").insert({"_id":"fjw4BsPLrxN8wRw9P","alias":"","msg":"123","attachments":[],"parseUrls":true,"groupable":false,"ts":new Date("2021-06-14T21:26:47.587Z"),"u":{"_id":"nM6vXyDLGGzSPsLNy","username":"admin","name":"Admin"},"rid":"GFR2xxircSsyJxx9F","_updatedAt":new Date("2021-06-14T21:26:47.603Z"),"urls":[],"mentions":[],"channels":[],"md":[{"type":"PARAGRAPH","value":[{"type":"PLAIN_TEXT","value":"123"}]}]}); +db.getCollection("rocketchat_message").insert({"_id":"fmxCFF5urELfPt5o4","alias":"","msg":"210","attachments":[],"parseUrls":true,"groupable":false,"ts":new Date("2021-06-14T21:27:23.661Z"),"u":{"_id":"nM6vXyDLGGzSPsLNy","username":"admin","name":"Admin"},"rid":"GFR2xxircSsyJxx9F","_updatedAt":new Date("2021-06-14T21:27:23.687Z"),"urls":[],"mentions":[],"channels":[],"md":[{"type":"PARAGRAPH","value":[{"type":"PLAIN_TEXT","value":"210"}]}]}); +db.getCollection("rocketchat_message").insert({"_id":"fpgKLzsGpj6YwX6nj","alias":"","msg":"247","attachments":[],"parseUrls":true,"groupable":false,"ts":new Date("2021-06-14T21:27:36.999Z"),"u":{"_id":"nM6vXyDLGGzSPsLNy","username":"admin","name":"Admin"},"rid":"GFR2xxircSsyJxx9F","_updatedAt":new Date("2021-06-14T21:27:37.026Z"),"urls":[],"mentions":[],"channels":[],"md":[{"type":"PARAGRAPH","value":[{"type":"PLAIN_TEXT","value":"247"}]}]}); +db.getCollection("rocketchat_message").insert({"_id":"fsy2dZJgmmboowJ8N","t":"uj","rid":"GENERAL","ts":new Date("2020-03-12T14:16:48.462Z"),"msg":"admin","u":{"_id":"nM6vXyDLGGzSPsLNy","username":"admin"},"groupable":false,"_updatedAt":new Date("2020-03-12T14:16:48.462Z")}); +db.getCollection("rocketchat_message").insert({"_id":"fuaaSP7JwX7tBoQKf","rid":"5iyMRT843rNn4wwHv","tmid":"NAXDFHoxA44rsyujh","msg":"22","ts":new Date("2021-06-14T21:27:06.201Z"),"u":{"_id":"nM6vXyDLGGzSPsLNy","username":"admin","name":"Admin"},"_updatedAt":new Date("2021-06-14T21:27:06.309Z"),"urls":[],"mentions":[],"channels":[],"md":[{"type":"PARAGRAPH","value":[{"type":"PLAIN_TEXT","value":"22"}]}]}); +db.getCollection("rocketchat_message").insert({"_id":"fwdGhi3DjYRPCvK9a","alias":"","msg":"39","attachments":[],"parseUrls":true,"groupable":false,"ts":new Date("2021-06-14T21:26:17.823Z"),"u":{"_id":"nM6vXyDLGGzSPsLNy","username":"admin","name":"Admin"},"rid":"GFR2xxircSsyJxx9F","_updatedAt":new Date("2021-06-14T21:26:17.837Z"),"urls":[],"mentions":[],"channels":[],"md":[{"type":"PARAGRAPH","value":[{"type":"PLAIN_TEXT","value":"39"}]}]}); +db.getCollection("rocketchat_message").insert({"_id":"gMCRJXDfAz6iCz36n","alias":"","msg":"166","attachments":[],"parseUrls":true,"groupable":false,"ts":new Date("2021-06-14T21:27:06.445Z"),"u":{"_id":"nM6vXyDLGGzSPsLNy","username":"admin","name":"Admin"},"rid":"GFR2xxircSsyJxx9F","_updatedAt":new Date("2021-06-14T21:27:06.528Z"),"urls":[],"mentions":[],"channels":[],"md":[{"type":"PARAGRAPH","value":[{"type":"PLAIN_TEXT","value":"166"}]}]}); +db.getCollection("rocketchat_message").insert({"_id":"gSek3hYhat9HZgxZn","alias":"","msg":"263","attachments":[],"parseUrls":true,"groupable":false,"ts":new Date("2021-06-14T21:27:42.744Z"),"u":{"_id":"nM6vXyDLGGzSPsLNy","username":"admin","name":"Admin"},"rid":"GFR2xxircSsyJxx9F","_updatedAt":new Date("2021-06-14T21:27:42.769Z"),"urls":[],"mentions":[],"channels":[],"md":[{"type":"PARAGRAPH","value":[{"type":"PLAIN_TEXT","value":"263"}]}]}); +db.getCollection("rocketchat_message").insert({"_id":"gmNPD2NzrYTcL4vbi","alias":"","msg":"114","attachments":[],"parseUrls":true,"groupable":false,"ts":new Date("2021-06-14T21:26:44.305Z"),"u":{"_id":"nM6vXyDLGGzSPsLNy","username":"admin","name":"Admin"},"rid":"GFR2xxircSsyJxx9F","_updatedAt":new Date("2021-06-14T21:26:44.325Z"),"urls":[],"mentions":[],"channels":[],"md":[{"type":"PARAGRAPH","value":[{"type":"PLAIN_TEXT","value":"114"}]}]}); +db.getCollection("rocketchat_message").insert({"_id":"gqvXKFvaHviN6WT6d","alias":"","msg":"36","attachments":[],"parseUrls":true,"groupable":false,"ts":new Date("2021-06-14T21:26:16.807Z"),"u":{"_id":"nM6vXyDLGGzSPsLNy","username":"admin","name":"Admin"},"rid":"GFR2xxircSsyJxx9F","_updatedAt":new Date("2021-06-14T21:26:16.820Z"),"urls":[],"mentions":[],"channels":[],"md":[{"type":"PARAGRAPH","value":[{"type":"PLAIN_TEXT","value":"36"}]}]}); +db.getCollection("rocketchat_message").insert({"_id":"hADa3458ZBWoA2vis","alias":"","msg":"297","attachments":[],"parseUrls":true,"groupable":false,"ts":new Date("2021-06-14T21:27:55.211Z"),"u":{"_id":"nM6vXyDLGGzSPsLNy","username":"admin","name":"Admin"},"rid":"GFR2xxircSsyJxx9F","_updatedAt":new Date("2021-06-14T21:27:55.229Z"),"urls":[],"mentions":[],"channels":[],"md":[{"type":"PARAGRAPH","value":[{"type":"PLAIN_TEXT","value":"297"}]}]}); +db.getCollection("rocketchat_message").insert({"_id":"hWGecLQ9J3QmPb5tZ","alias":"","msg":"42","attachments":[],"parseUrls":true,"groupable":false,"ts":new Date("2021-06-14T21:26:18.847Z"),"u":{"_id":"nM6vXyDLGGzSPsLNy","username":"admin","name":"Admin"},"rid":"GFR2xxircSsyJxx9F","_updatedAt":new Date("2021-06-14T21:26:18.862Z"),"urls":[],"mentions":[],"channels":[],"md":[{"type":"PARAGRAPH","value":[{"type":"PLAIN_TEXT","value":"42"}]}]}); +db.getCollection("rocketchat_message").insert({"_id":"he7eJ5uQkavMG2pRw","alias":"","msg":"291","attachments":[],"parseUrls":true,"groupable":false,"ts":new Date("2021-06-14T21:27:53.044Z"),"u":{"_id":"nM6vXyDLGGzSPsLNy","username":"admin","name":"Admin"},"rid":"GFR2xxircSsyJxx9F","_updatedAt":new Date("2021-06-14T21:27:53.064Z"),"urls":[],"mentions":[],"channels":[],"md":[{"type":"PARAGRAPH","value":[{"type":"PLAIN_TEXT","value":"291"}]}]}); +db.getCollection("rocketchat_message").insert({"_id":"i5v8nqpENnELkuKKK","alias":"","msg":"98","attachments":[],"parseUrls":true,"groupable":false,"ts":new Date("2021-06-14T21:26:38.669Z"),"u":{"_id":"nM6vXyDLGGzSPsLNy","username":"admin","name":"Admin"},"rid":"GFR2xxircSsyJxx9F","_updatedAt":new Date("2021-06-14T21:26:38.686Z"),"urls":[],"mentions":[],"channels":[],"md":[{"type":"PARAGRAPH","value":[{"type":"PLAIN_TEXT","value":"98"}]}]}); +db.getCollection("rocketchat_message").insert({"_id":"iAHZaZtecC9DTPh5M","alias":"","msg":"118","attachments":[],"parseUrls":true,"groupable":false,"ts":new Date("2021-06-14T21:26:45.719Z"),"u":{"_id":"nM6vXyDLGGzSPsLNy","username":"admin","name":"Admin"},"rid":"GFR2xxircSsyJxx9F","_updatedAt":new Date("2021-06-14T21:26:45.741Z"),"urls":[],"mentions":[],"channels":[],"md":[{"type":"PARAGRAPH","value":[{"type":"PLAIN_TEXT","value":"118"}]}]}); +db.getCollection("rocketchat_message").insert({"_id":"iDhXx9AMwdGn6eA8g","alias":"","msg":"72","attachments":[],"parseUrls":true,"groupable":false,"ts":new Date("2021-06-14T21:26:29.378Z"),"u":{"_id":"nM6vXyDLGGzSPsLNy","username":"admin","name":"Admin"},"rid":"GFR2xxircSsyJxx9F","_updatedAt":new Date("2021-06-14T21:26:29.399Z"),"urls":[],"mentions":[],"channels":[],"md":[{"type":"PARAGRAPH","value":[{"type":"PLAIN_TEXT","value":"72"}]}]}); +db.getCollection("rocketchat_message").insert({"_id":"iEbZ89N6nn7BrNJjb","alias":"","msg":"143","attachments":[],"parseUrls":true,"groupable":false,"ts":new Date("2021-06-14T21:26:57.291Z"),"u":{"_id":"nM6vXyDLGGzSPsLNy","username":"admin","name":"Admin"},"rid":"GFR2xxircSsyJxx9F","_updatedAt":new Date("2021-06-14T21:26:57.428Z"),"urls":[],"mentions":[],"channels":[],"md":[{"type":"PARAGRAPH","value":[{"type":"PLAIN_TEXT","value":"143"}]}]}); +db.getCollection("rocketchat_message").insert({"_id":"iTD6csdpfXsBjw2Cm","alias":"","msg":"271","attachments":[],"parseUrls":true,"groupable":false,"ts":new Date("2021-06-14T21:27:45.550Z"),"u":{"_id":"nM6vXyDLGGzSPsLNy","username":"admin","name":"Admin"},"rid":"GFR2xxircSsyJxx9F","_updatedAt":new Date("2021-06-14T21:27:45.562Z"),"urls":[],"mentions":[],"channels":[],"md":[{"type":"PARAGRAPH","value":[{"type":"PLAIN_TEXT","value":"271"}]}]}); +db.getCollection("rocketchat_message").insert({"_id":"iXLFap36XtvBEFN5v","alias":"","msg":"10","attachments":[],"parseUrls":true,"groupable":false,"ts":new Date("2021-06-14T21:26:07.627Z"),"u":{"_id":"nM6vXyDLGGzSPsLNy","username":"admin","name":"Admin"},"rid":"GFR2xxircSsyJxx9F","_updatedAt":new Date("2021-06-14T21:26:07.651Z"),"urls":[],"mentions":[],"channels":[],"md":[{"type":"PARAGRAPH","value":[{"type":"PLAIN_TEXT","value":"10"}]}]}); +db.getCollection("rocketchat_message").insert({"_id":"ind3Datf2D7PaZzFZ","alias":"","msg":"73","attachments":[],"parseUrls":true,"groupable":false,"ts":new Date("2021-06-14T21:26:29.726Z"),"u":{"_id":"nM6vXyDLGGzSPsLNy","username":"admin","name":"Admin"},"rid":"GFR2xxircSsyJxx9F","_updatedAt":new Date("2021-06-14T21:26:29.745Z"),"urls":[],"mentions":[],"channels":[],"md":[{"type":"PARAGRAPH","value":[{"type":"PLAIN_TEXT","value":"73"}]}]}); +db.getCollection("rocketchat_message").insert({"_id":"iuBBQN8GYYnzreXGr","alias":"","msg":"289","attachments":[],"parseUrls":true,"groupable":false,"ts":new Date("2021-06-14T21:27:52.341Z"),"u":{"_id":"nM6vXyDLGGzSPsLNy","username":"admin","name":"Admin"},"rid":"GFR2xxircSsyJxx9F","_updatedAt":new Date("2021-06-14T21:27:52.356Z"),"urls":[],"mentions":[],"channels":[],"md":[{"type":"PARAGRAPH","value":[{"type":"PLAIN_TEXT","value":"289"}]}]}); +db.getCollection("rocketchat_message").insert({"_id":"ivZn9uDwQc5gQJM34","alias":"","msg":"93","attachments":[],"parseUrls":true,"groupable":false,"ts":new Date("2021-06-14T21:26:36.852Z"),"u":{"_id":"nM6vXyDLGGzSPsLNy","username":"admin","name":"Admin"},"rid":"GFR2xxircSsyJxx9F","_updatedAt":new Date("2021-06-14T21:26:36.882Z"),"urls":[],"mentions":[],"channels":[],"md":[{"type":"PARAGRAPH","value":[{"type":"PLAIN_TEXT","value":"93"}]}]}); +db.getCollection("rocketchat_message").insert({"_id":"j54HwbxYvXjRjMadK","alias":"","msg":"150","attachments":[],"parseUrls":true,"groupable":false,"ts":new Date("2021-06-14T21:27:00.149Z"),"u":{"_id":"nM6vXyDLGGzSPsLNy","username":"admin","name":"Admin"},"rid":"GFR2xxircSsyJxx9F","_updatedAt":new Date("2021-06-14T21:27:00.221Z"),"urls":[],"mentions":[],"channels":[],"md":[{"type":"PARAGRAPH","value":[{"type":"PLAIN_TEXT","value":"150"}]}]}); +db.getCollection("rocketchat_message").insert({"_id":"j9PSMJej8Wcpa4Ytx","alias":"","msg":"44","attachments":[],"parseUrls":true,"groupable":false,"ts":new Date("2021-06-14T21:26:19.522Z"),"u":{"_id":"nM6vXyDLGGzSPsLNy","username":"admin","name":"Admin"},"rid":"GFR2xxircSsyJxx9F","_updatedAt":new Date("2021-06-14T21:26:19.535Z"),"urls":[],"mentions":[],"channels":[],"md":[{"type":"PARAGRAPH","value":[{"type":"PLAIN_TEXT","value":"44"}]}]}); +db.getCollection("rocketchat_message").insert({"_id":"jLfKGGCYNK53XHSTL","alias":"","msg":"103","attachments":[],"parseUrls":true,"groupable":false,"ts":new Date("2021-06-14T21:26:40.408Z"),"u":{"_id":"nM6vXyDLGGzSPsLNy","username":"admin","name":"Admin"},"rid":"GFR2xxircSsyJxx9F","_updatedAt":new Date("2021-06-14T21:26:40.429Z"),"urls":[],"mentions":[],"channels":[],"md":[{"type":"PARAGRAPH","value":[{"type":"PLAIN_TEXT","value":"103"}]}]}); +db.getCollection("rocketchat_message").insert({"_id":"jPniEqszEwDwuaiuj","alias":"","msg":"21","attachments":[],"parseUrls":true,"groupable":false,"ts":new Date("2021-06-14T21:26:11.551Z"),"u":{"_id":"nM6vXyDLGGzSPsLNy","username":"admin","name":"Admin"},"rid":"GFR2xxircSsyJxx9F","_updatedAt":new Date("2021-06-14T21:26:11.571Z"),"urls":[],"mentions":[],"channels":[],"md":[{"type":"PARAGRAPH","value":[{"type":"PLAIN_TEXT","value":"21"}]}]}); +db.getCollection("rocketchat_message").insert({"_id":"jb9wEPkba3zpPEtmJ","alias":"","msg":"68","attachments":[],"parseUrls":true,"groupable":false,"ts":new Date("2021-06-14T21:26:27.931Z"),"u":{"_id":"nM6vXyDLGGzSPsLNy","username":"admin","name":"Admin"},"rid":"GFR2xxircSsyJxx9F","_updatedAt":new Date("2021-06-14T21:26:27.953Z"),"urls":[],"mentions":[],"channels":[],"md":[{"type":"PARAGRAPH","value":[{"type":"PLAIN_TEXT","value":"68"}]}]}); +db.getCollection("rocketchat_message").insert({"_id":"jvtiBQASkTzCAQbDR","alias":"","msg":"157","attachments":[],"parseUrls":true,"groupable":false,"ts":new Date("2021-06-14T21:27:02.837Z"),"u":{"_id":"nM6vXyDLGGzSPsLNy","username":"admin","name":"Admin"},"rid":"GFR2xxircSsyJxx9F","_updatedAt":new Date("2021-06-14T21:27:02.916Z"),"urls":[],"mentions":[],"channels":[],"md":[{"type":"PARAGRAPH","value":[{"type":"PLAIN_TEXT","value":"157"}]}]}); +db.getCollection("rocketchat_message").insert({"_id":"k4cpqEJdJswa9Gi5Y","alias":"","msg":"261","attachments":[],"parseUrls":true,"groupable":false,"ts":new Date("2021-06-14T21:27:42.048Z"),"u":{"_id":"nM6vXyDLGGzSPsLNy","username":"admin","name":"Admin"},"rid":"GFR2xxircSsyJxx9F","_updatedAt":new Date("2021-06-14T21:27:42.062Z"),"urls":[],"mentions":[],"channels":[],"md":[{"type":"PARAGRAPH","value":[{"type":"PLAIN_TEXT","value":"261"}]}]}); +db.getCollection("rocketchat_message").insert({"_id":"kDetPPBzhWn93cxRF","alias":"","msg":"225","attachments":[],"parseUrls":true,"groupable":false,"ts":new Date("2021-06-14T21:27:29.069Z"),"u":{"_id":"nM6vXyDLGGzSPsLNy","username":"admin","name":"Admin"},"rid":"GFR2xxircSsyJxx9F","_updatedAt":new Date("2021-06-14T21:27:29.093Z"),"urls":[],"mentions":[],"channels":[],"md":[{"type":"PARAGRAPH","value":[{"type":"PLAIN_TEXT","value":"225"}]}]}); +db.getCollection("rocketchat_message").insert({"_id":"kFSqxJp5KZvQ7D8aE","rid":"5iyMRT843rNn4wwHv","tmid":"NAXDFHoxA44rsyujh","msg":"26","ts":new Date("2021-06-14T21:27:10.751Z"),"u":{"_id":"nM6vXyDLGGzSPsLNy","username":"admin","name":"Admin"},"_updatedAt":new Date("2021-06-14T21:27:11.061Z"),"urls":[],"mentions":[],"channels":[],"md":[{"type":"PARAGRAPH","value":[{"type":"PLAIN_TEXT","value":"26"}]}]}); +db.getCollection("rocketchat_message").insert({"_id":"kS8jZdggkfgsTsZG5","alias":"","msg":"174","attachments":[],"parseUrls":true,"groupable":false,"ts":new Date("2021-06-14T21:27:09.739Z"),"u":{"_id":"nM6vXyDLGGzSPsLNy","username":"admin","name":"Admin"},"rid":"GFR2xxircSsyJxx9F","_updatedAt":new Date("2021-06-14T21:27:09.758Z"),"urls":[],"mentions":[],"channels":[],"md":[{"type":"PARAGRAPH","value":[{"type":"PLAIN_TEXT","value":"174"}]}]}); +db.getCollection("rocketchat_message").insert({"_id":"m7tDWPnGNRnGCue75","alias":"","msg":"280","attachments":[],"parseUrls":true,"groupable":false,"ts":new Date("2021-06-14T21:27:49.134Z"),"u":{"_id":"nM6vXyDLGGzSPsLNy","username":"admin","name":"Admin"},"rid":"GFR2xxircSsyJxx9F","_updatedAt":new Date("2021-06-14T21:27:49.157Z"),"urls":[],"mentions":[],"channels":[],"md":[{"type":"PARAGRAPH","value":[{"type":"PLAIN_TEXT","value":"280"}]}]}); +db.getCollection("rocketchat_message").insert({"_id":"mf4JSThGWDcKcMHpg","alias":"","msg":"227","attachments":[],"parseUrls":true,"groupable":false,"ts":new Date("2021-06-14T21:27:29.784Z"),"u":{"_id":"nM6vXyDLGGzSPsLNy","username":"admin","name":"Admin"},"rid":"GFR2xxircSsyJxx9F","_updatedAt":new Date("2021-06-14T21:27:29.833Z"),"urls":[],"mentions":[],"channels":[],"md":[{"type":"PARAGRAPH","value":[{"type":"PLAIN_TEXT","value":"227"}]}]}); +db.getCollection("rocketchat_message").insert({"_id":"mkh7E9F6DsZ4Tcdup","alias":"","msg":"295","attachments":[],"parseUrls":true,"groupable":false,"ts":new Date("2021-06-14T21:27:54.475Z"),"u":{"_id":"nM6vXyDLGGzSPsLNy","username":"admin","name":"Admin"},"rid":"GFR2xxircSsyJxx9F","_updatedAt":new Date("2021-06-14T21:27:54.502Z"),"urls":[],"mentions":[],"channels":[],"md":[{"type":"PARAGRAPH","value":[{"type":"PLAIN_TEXT","value":"295"}]}]}); +db.getCollection("rocketchat_message").insert({"_id":"n26SaSKE9K5om8yLj","alias":"","msg":"50","attachments":[],"parseUrls":true,"groupable":false,"ts":new Date("2021-06-14T21:26:21.571Z"),"u":{"_id":"nM6vXyDLGGzSPsLNy","username":"admin","name":"Admin"},"rid":"GFR2xxircSsyJxx9F","_updatedAt":new Date("2021-06-14T21:26:21.590Z"),"urls":[],"mentions":[],"channels":[],"md":[{"type":"PARAGRAPH","value":[{"type":"PLAIN_TEXT","value":"50"}]}]}); +db.getCollection("rocketchat_message").insert({"_id":"nCRBdtauhxPqBtg4g","alias":"","msg":"272","attachments":[],"parseUrls":true,"groupable":false,"ts":new Date("2021-06-14T21:27:45.899Z"),"u":{"_id":"nM6vXyDLGGzSPsLNy","username":"admin","name":"Admin"},"rid":"GFR2xxircSsyJxx9F","_updatedAt":new Date("2021-06-14T21:27:45.920Z"),"urls":[],"mentions":[],"channels":[],"md":[{"type":"PARAGRAPH","value":[{"type":"PLAIN_TEXT","value":"272"}]}]}); +db.getCollection("rocketchat_message").insert({"_id":"nHzxrRo6tBHscDDje","alias":"","msg":"17","attachments":[],"parseUrls":true,"groupable":false,"ts":new Date("2021-06-14T21:26:10.137Z"),"u":{"_id":"nM6vXyDLGGzSPsLNy","username":"admin","name":"Admin"},"rid":"GFR2xxircSsyJxx9F","_updatedAt":new Date("2021-06-14T21:26:10.157Z"),"urls":[],"mentions":[],"channels":[],"md":[{"type":"PARAGRAPH","value":[{"type":"PLAIN_TEXT","value":"17"}]}]}); +db.getCollection("rocketchat_message").insert({"_id":"nL6KxYJnhqiAnf6pH","alias":"","msg":"144","attachments":[],"parseUrls":true,"groupable":false,"ts":new Date("2021-06-14T21:26:57.777Z"),"u":{"_id":"nM6vXyDLGGzSPsLNy","username":"admin","name":"Admin"},"rid":"GFR2xxircSsyJxx9F","_updatedAt":new Date("2021-06-14T21:26:57.798Z"),"urls":[],"mentions":[],"channels":[],"md":[{"type":"PARAGRAPH","value":[{"type":"PLAIN_TEXT","value":"144"}]}]}); +db.getCollection("rocketchat_message").insert({"_id":"o5a6HfkxwT56K4jPQ","alias":"","msg":"292","attachments":[],"parseUrls":true,"groupable":false,"ts":new Date("2021-06-14T21:27:53.406Z"),"u":{"_id":"nM6vXyDLGGzSPsLNy","username":"admin","name":"Admin"},"rid":"GFR2xxircSsyJxx9F","_updatedAt":new Date("2021-06-14T21:27:53.431Z"),"urls":[],"mentions":[],"channels":[],"md":[{"type":"PARAGRAPH","value":[{"type":"PLAIN_TEXT","value":"292"}]}]}); +db.getCollection("rocketchat_message").insert({"_id":"o7ASiN5h6rWf5R6Zn","alias":"","msg":"71","attachments":[],"parseUrls":true,"groupable":false,"ts":new Date("2021-06-14T21:26:29.010Z"),"u":{"_id":"nM6vXyDLGGzSPsLNy","username":"admin","name":"Admin"},"rid":"GFR2xxircSsyJxx9F","_updatedAt":new Date("2021-06-14T21:26:29.045Z"),"urls":[],"mentions":[],"channels":[],"md":[{"type":"PARAGRAPH","value":[{"type":"PLAIN_TEXT","value":"71"}]}]}); +db.getCollection("rocketchat_message").insert({"_id":"oBai683KWMkxTbrXm","alias":"","msg":"109","attachments":[],"parseUrls":true,"groupable":false,"ts":new Date("2021-06-14T21:26:42.551Z"),"u":{"_id":"nM6vXyDLGGzSPsLNy","username":"admin","name":"Admin"},"rid":"GFR2xxircSsyJxx9F","_updatedAt":new Date("2021-06-14T21:26:42.565Z"),"urls":[],"mentions":[],"channels":[],"md":[{"type":"PARAGRAPH","value":[{"type":"PLAIN_TEXT","value":"109"}]}]}); +db.getCollection("rocketchat_message").insert({"_id":"oP4SBAiREiHxsCKuJ","alias":"","msg":"11","attachments":[],"parseUrls":true,"groupable":false,"ts":new Date("2021-06-14T21:26:07.981Z"),"u":{"_id":"nM6vXyDLGGzSPsLNy","username":"admin","name":"Admin"},"rid":"GFR2xxircSsyJxx9F","_updatedAt":new Date("2021-06-14T21:26:08.003Z"),"urls":[],"mentions":[],"channels":[],"md":[{"type":"PARAGRAPH","value":[{"type":"PLAIN_TEXT","value":"11"}]}]}); +db.getCollection("rocketchat_message").insert({"_id":"oR4yJeKsiAdbi2J3o","alias":"","msg":"31","attachments":[],"parseUrls":true,"groupable":false,"ts":new Date("2021-06-14T21:26:15.084Z"),"u":{"_id":"nM6vXyDLGGzSPsLNy","username":"admin","name":"Admin"},"rid":"GFR2xxircSsyJxx9F","_updatedAt":new Date("2021-06-14T21:26:15.105Z"),"urls":[],"mentions":[],"channels":[],"md":[{"type":"PARAGRAPH","value":[{"type":"PLAIN_TEXT","value":"31"}]}]}); +db.getCollection("rocketchat_message").insert({"_id":"oRgEHMjJwkK3QMPH6","alias":"","msg":"285","attachments":[],"parseUrls":true,"groupable":false,"ts":new Date("2021-06-14T21:27:50.910Z"),"u":{"_id":"nM6vXyDLGGzSPsLNy","username":"admin","name":"Admin"},"rid":"GFR2xxircSsyJxx9F","_updatedAt":new Date("2021-06-14T21:27:50.932Z"),"urls":[],"mentions":[],"channels":[],"md":[{"type":"PARAGRAPH","value":[{"type":"PLAIN_TEXT","value":"285"}]}]}); +db.getCollection("rocketchat_message").insert({"_id":"oamqgrpKs75TAzRDn","alias":"","msg":"182","attachments":[],"parseUrls":true,"groupable":false,"ts":new Date("2021-06-14T21:27:13.249Z"),"u":{"_id":"nM6vXyDLGGzSPsLNy","username":"admin","name":"Admin"},"rid":"GFR2xxircSsyJxx9F","_updatedAt":new Date("2021-06-14T21:27:13.302Z"),"urls":[],"mentions":[],"channels":[],"md":[{"type":"PARAGRAPH","value":[{"type":"PLAIN_TEXT","value":"182"}]}]}); +db.getCollection("rocketchat_message").insert({"_id":"ooG2D2kA9XKEYfLxy","alias":"","msg":"184","attachments":[],"parseUrls":true,"groupable":false,"ts":new Date("2021-06-14T21:27:14.009Z"),"u":{"_id":"nM6vXyDLGGzSPsLNy","username":"admin","name":"Admin"},"rid":"GFR2xxircSsyJxx9F","_updatedAt":new Date("2021-06-14T21:27:14.085Z"),"urls":[],"mentions":[],"channels":[],"md":[{"type":"PARAGRAPH","value":[{"type":"PLAIN_TEXT","value":"184"}]}]}); +db.getCollection("rocketchat_message").insert({"_id":"owsKBceEBzCRenLf5","alias":"","msg":"128","attachments":[],"parseUrls":true,"groupable":false,"ts":new Date("2021-06-14T21:26:49.939Z"),"u":{"_id":"nM6vXyDLGGzSPsLNy","username":"admin","name":"Admin"},"rid":"GFR2xxircSsyJxx9F","_updatedAt":new Date("2021-06-14T21:26:50.099Z"),"urls":[],"mentions":[],"channels":[],"md":[{"type":"PARAGRAPH","value":[{"type":"PLAIN_TEXT","value":"128"}]}]}); +db.getCollection("rocketchat_message").insert({"_id":"pXkDBj6n8zs5QwgoP","alias":"","msg":"219","attachments":[],"parseUrls":true,"groupable":false,"ts":new Date("2021-06-14T21:27:26.867Z"),"u":{"_id":"nM6vXyDLGGzSPsLNy","username":"admin","name":"Admin"},"rid":"GFR2xxircSsyJxx9F","_updatedAt":new Date("2021-06-14T21:27:26.884Z"),"urls":[],"mentions":[],"channels":[],"md":[{"type":"PARAGRAPH","value":[{"type":"PLAIN_TEXT","value":"219"}]}]}); +db.getCollection("rocketchat_message").insert({"_id":"phg34vrw6zgeXNM4S","rid":"5iyMRT843rNn4wwHv","tmid":"NAXDFHoxA44rsyujh","msg":"14","ts":new Date("2021-06-14T21:26:56.534Z"),"u":{"_id":"nM6vXyDLGGzSPsLNy","username":"admin","name":"Admin"},"_updatedAt":new Date("2021-06-14T21:26:56.629Z"),"urls":[],"mentions":[],"channels":[],"md":[{"type":"PARAGRAPH","value":[{"type":"PLAIN_TEXT","value":"14"}]}]}); +db.getCollection("rocketchat_message").insert({"_id":"pobCPg2DEvSthxSms","rid":"5iyMRT843rNn4wwHv","tmid":"NAXDFHoxA44rsyujh","msg":"17","ts":new Date("2021-06-14T21:26:59.957Z"),"u":{"_id":"nM6vXyDLGGzSPsLNy","username":"admin","name":"Admin"},"_updatedAt":new Date("2021-06-14T21:27:00.029Z"),"urls":[],"mentions":[],"channels":[],"md":[{"type":"PARAGRAPH","value":[{"type":"PLAIN_TEXT","value":"17"}]}]}); +db.getCollection("rocketchat_message").insert({"_id":"pq95BBkovDfF9QXBz","alias":"","msg":"104","attachments":[],"parseUrls":true,"groupable":false,"ts":new Date("2021-06-14T21:26:40.758Z"),"u":{"_id":"nM6vXyDLGGzSPsLNy","username":"admin","name":"Admin"},"rid":"GFR2xxircSsyJxx9F","_updatedAt":new Date("2021-06-14T21:26:40.779Z"),"urls":[],"mentions":[],"channels":[],"md":[{"type":"PARAGRAPH","value":[{"type":"PLAIN_TEXT","value":"104"}]}]}); +db.getCollection("rocketchat_message").insert({"_id":"prLoRs2LovJ2ZwB69","alias":"","msg":"23","attachments":[],"parseUrls":true,"groupable":false,"ts":new Date("2021-06-14T21:26:12.255Z"),"u":{"_id":"nM6vXyDLGGzSPsLNy","username":"admin","name":"Admin"},"rid":"GFR2xxircSsyJxx9F","_updatedAt":new Date("2021-06-14T21:26:12.282Z"),"urls":[],"mentions":[],"channels":[],"md":[{"type":"PARAGRAPH","value":[{"type":"PLAIN_TEXT","value":"23"}]}]}); +db.getCollection("rocketchat_message").insert({"_id":"q9hHwTBcNAWHJTogx","alias":"","msg":"241","attachments":[],"parseUrls":true,"groupable":false,"ts":new Date("2021-06-14T21:27:34.868Z"),"u":{"_id":"nM6vXyDLGGzSPsLNy","username":"admin","name":"Admin"},"rid":"GFR2xxircSsyJxx9F","_updatedAt":new Date("2021-06-14T21:27:34.886Z"),"urls":[],"mentions":[],"channels":[],"md":[{"type":"PARAGRAPH","value":[{"type":"PLAIN_TEXT","value":"241"}]}]}); +db.getCollection("rocketchat_message").insert({"_id":"q9vSCngMpjFmJGYKD","rid":"5iyMRT843rNn4wwHv","tmid":"NAXDFHoxA44rsyujh","msg":"to be searched","ts":new Date("2021-06-14T21:26:48.735Z"),"u":{"_id":"nM6vXyDLGGzSPsLNy","username":"admin","name":"Admin"},"_updatedAt":new Date("2021-06-14T21:26:48.875Z"),"urls":[],"mentions":[],"channels":[],"md":[{"type":"PARAGRAPH","value":[{"type":"PLAIN_TEXT","value":"2"}]}]}); +db.getCollection("rocketchat_message").insert({"_id":"qS4Rk23v3makbdfbH","alias":"","msg":"131","attachments":[],"parseUrls":true,"groupable":false,"ts":new Date("2021-06-14T21:26:51.580Z"),"u":{"_id":"nM6vXyDLGGzSPsLNy","username":"admin","name":"Admin"},"rid":"GFR2xxircSsyJxx9F","_updatedAt":new Date("2021-06-14T21:26:51.717Z"),"urls":[],"mentions":[],"channels":[],"md":[{"type":"PARAGRAPH","value":[{"type":"PLAIN_TEXT","value":"131"}]}]}); +db.getCollection("rocketchat_message").insert({"_id":"qX4SgeQLSAkYM96JS","alias":"","msg":"46","attachments":[],"parseUrls":true,"groupable":false,"ts":new Date("2021-06-14T21:26:20.199Z"),"u":{"_id":"nM6vXyDLGGzSPsLNy","username":"admin","name":"Admin"},"rid":"GFR2xxircSsyJxx9F","_updatedAt":new Date("2021-06-14T21:26:20.217Z"),"urls":[],"mentions":[],"channels":[],"md":[{"type":"PARAGRAPH","value":[{"type":"PLAIN_TEXT","value":"46"}]}]}); +db.getCollection("rocketchat_message").insert({"_id":"qx3fGuWDaYM2KTP7b","alias":"","msg":"18","attachments":[],"parseUrls":true,"groupable":false,"ts":new Date("2021-06-14T21:26:10.488Z"),"u":{"_id":"nM6vXyDLGGzSPsLNy","username":"admin","name":"Admin"},"rid":"GFR2xxircSsyJxx9F","_updatedAt":new Date("2021-06-14T21:26:10.514Z"),"urls":[],"mentions":[],"channels":[],"md":[{"type":"PARAGRAPH","value":[{"type":"PLAIN_TEXT","value":"18"}]}]}); +db.getCollection("rocketchat_message").insert({"_id":"r3otdRoyGLyWE3QXt","alias":"","msg":"106","attachments":[],"parseUrls":true,"groupable":false,"ts":new Date("2021-06-14T21:26:41.477Z"),"u":{"_id":"nM6vXyDLGGzSPsLNy","username":"admin","name":"Admin"},"rid":"GFR2xxircSsyJxx9F","_updatedAt":new Date("2021-06-14T21:26:41.537Z"),"urls":[],"mentions":[],"channels":[],"md":[{"type":"PARAGRAPH","value":[{"type":"PLAIN_TEXT","value":"106"}]}]}); +db.getCollection("rocketchat_message").insert({"_id":"rFyiPh4ieazJ5Xujx","alias":"","msg":"212","attachments":[],"parseUrls":true,"groupable":false,"ts":new Date("2021-06-14T21:27:24.396Z"),"u":{"_id":"nM6vXyDLGGzSPsLNy","username":"admin","name":"Admin"},"rid":"GFR2xxircSsyJxx9F","_updatedAt":new Date("2021-06-14T21:27:24.419Z"),"urls":[],"mentions":[],"channels":[],"md":[{"type":"PARAGRAPH","value":[{"type":"PLAIN_TEXT","value":"212"}]}]}); +db.getCollection("rocketchat_message").insert({"_id":"rMbGKvG834q8EeNGs","rid":"5iyMRT843rNn4wwHv","tshow":false,"tmid":"NAXDFHoxA44rsyujh","msg":"Go to jumping-thread\'s thread","ts":new Date("2021-06-14T21:26:48.151Z"),"u":{"_id":"nM6vXyDLGGzSPsLNy","username":"admin","name":"Admin"},"_updatedAt":new Date("2021-06-14T21:26:48.219Z"),"urls":[],"mentions":[],"channels":[],"md":[{"type":"PARAGRAPH","value":[{"type":"PLAIN_TEXT","value":"1"}]}]}); +db.getCollection("rocketchat_message").insert({"_id":"rRnLnmDmiEuAdCCxc","alias":"","msg":"27","attachments":[],"parseUrls":true,"groupable":false,"ts":new Date("2021-06-14T21:26:13.667Z"),"u":{"_id":"nM6vXyDLGGzSPsLNy","username":"admin","name":"Admin"},"rid":"GFR2xxircSsyJxx9F","_updatedAt":new Date("2021-06-14T21:26:13.686Z"),"urls":[],"mentions":[],"channels":[],"md":[{"type":"PARAGRAPH","value":[{"type":"PLAIN_TEXT","value":"27"}]}]}); +db.getCollection("rocketchat_message").insert({"_id":"rYdDqTMqdZc6iDfkR","alias":"","msg":"146","attachments":[],"parseUrls":true,"groupable":false,"ts":new Date("2021-06-14T21:26:58.496Z"),"u":{"_id":"nM6vXyDLGGzSPsLNy","username":"admin","name":"Admin"},"rid":"GFR2xxircSsyJxx9F","_updatedAt":new Date("2021-06-14T21:26:58.512Z"),"urls":[],"mentions":[],"channels":[],"md":[{"type":"PARAGRAPH","value":[{"type":"PLAIN_TEXT","value":"146"}]}]}); +db.getCollection("rocketchat_message").insert({"_id":"rzhvoTuvciCYKuWaz","alias":"","msg":"149","attachments":[],"parseUrls":true,"groupable":false,"ts":new Date("2021-06-14T21:26:59.761Z"),"u":{"_id":"nM6vXyDLGGzSPsLNy","username":"admin","name":"Admin"},"rid":"GFR2xxircSsyJxx9F","_updatedAt":new Date("2021-06-14T21:26:59.791Z"),"urls":[],"mentions":[],"channels":[],"md":[{"type":"PARAGRAPH","value":[{"type":"PLAIN_TEXT","value":"149"}]}]}); +db.getCollection("rocketchat_message").insert({"_id":"s6uQ9PgRQTj8eHcXd","alias":"","msg":"32","attachments":[],"parseUrls":true,"groupable":false,"ts":new Date("2021-06-14T21:26:15.434Z"),"u":{"_id":"nM6vXyDLGGzSPsLNy","username":"admin","name":"Admin"},"rid":"GFR2xxircSsyJxx9F","_updatedAt":new Date("2021-06-14T21:26:15.458Z"),"urls":[],"mentions":[],"channels":[],"md":[{"type":"PARAGRAPH","value":[{"type":"PLAIN_TEXT","value":"32"}]}]}); +db.getCollection("rocketchat_message").insert({"_id":"sEFhTtHAnByAuhm9L","alias":"","msg":"250","attachments":[],"parseUrls":true,"groupable":false,"ts":new Date("2021-06-14T21:27:38.081Z"),"u":{"_id":"nM6vXyDLGGzSPsLNy","username":"admin","name":"Admin"},"rid":"GFR2xxircSsyJxx9F","_updatedAt":new Date("2021-06-14T21:27:38.113Z"),"urls":[],"mentions":[],"channels":[],"md":[{"type":"PARAGRAPH","value":[{"type":"PLAIN_TEXT","value":"250"}]}]}); +db.getCollection("rocketchat_message").insert({"_id":"sL2q79eQMszvrndN4","alias":"","msg":"169","attachments":[],"parseUrls":true,"groupable":false,"ts":new Date("2021-06-14T21:27:07.775Z"),"u":{"_id":"nM6vXyDLGGzSPsLNy","username":"admin","name":"Admin"},"rid":"GFR2xxircSsyJxx9F","_updatedAt":new Date("2021-06-14T21:27:07.810Z"),"urls":[],"mentions":[],"channels":[],"md":[{"type":"PARAGRAPH","value":[{"type":"PLAIN_TEXT","value":"169"}]}]}); +db.getCollection("rocketchat_message").insert({"_id":"sMNLLsoDjghCTvmwc","alias":"","msg":"273","attachments":[],"parseUrls":true,"groupable":false,"ts":new Date("2021-06-14T21:27:46.242Z"),"u":{"_id":"nM6vXyDLGGzSPsLNy","username":"admin","name":"Admin"},"rid":"GFR2xxircSsyJxx9F","_updatedAt":new Date("2021-06-14T21:27:46.269Z"),"urls":[],"mentions":[],"channels":[],"md":[{"type":"PARAGRAPH","value":[{"type":"PLAIN_TEXT","value":"273"}]}]}); +db.getCollection("rocketchat_message").insert({"_id":"sPoHne32K2pdrqhmY","alias":"","msg":"80","attachments":[],"parseUrls":true,"groupable":false,"ts":new Date("2021-06-14T21:26:32.181Z"),"u":{"_id":"nM6vXyDLGGzSPsLNy","username":"admin","name":"Admin"},"rid":"GFR2xxircSsyJxx9F","_updatedAt":new Date("2021-06-14T21:26:32.203Z"),"urls":[],"mentions":[],"channels":[],"md":[{"type":"PARAGRAPH","value":[{"type":"PLAIN_TEXT","value":"80"}]}]}); +db.getCollection("rocketchat_message").insert({"_id":"sQksqnBfdfuvvFTtZ","alias":"","msg":"204","attachments":[],"parseUrls":true,"groupable":false,"ts":new Date("2021-06-14T21:27:21.538Z"),"u":{"_id":"nM6vXyDLGGzSPsLNy","username":"admin","name":"Admin"},"rid":"GFR2xxircSsyJxx9F","_updatedAt":new Date("2021-06-14T21:27:21.555Z"),"urls":[],"mentions":[],"channels":[],"md":[{"type":"PARAGRAPH","value":[{"type":"PLAIN_TEXT","value":"204"}]}]}); +db.getCollection("rocketchat_message").insert({"_id":"sYp5F5WSFBWP6dy4L","alias":"","msg":"4","attachments":[],"parseUrls":true,"groupable":false,"ts":new Date("2021-06-14T21:26:05.437Z"),"u":{"_id":"nM6vXyDLGGzSPsLNy","username":"admin","name":"Admin"},"rid":"GFR2xxircSsyJxx9F","_updatedAt":new Date("2021-06-14T21:26:05.484Z"),"urls":[],"mentions":[],"channels":[],"md":[{"type":"PARAGRAPH","value":[{"type":"PLAIN_TEXT","value":"4"}]}]}); +db.getCollection("rocketchat_message").insert({"_id":"sarBNn8KXCDibD26Z","alias":"","msg":"133","attachments":[],"parseUrls":true,"groupable":false,"ts":new Date("2021-06-14T21:26:52.631Z"),"u":{"_id":"nM6vXyDLGGzSPsLNy","username":"admin","name":"Admin"},"rid":"GFR2xxircSsyJxx9F","_updatedAt":new Date("2021-06-14T21:26:52.716Z"),"urls":[],"mentions":[],"channels":[],"md":[{"type":"PARAGRAPH","value":[{"type":"PLAIN_TEXT","value":"133"}]}]}); +db.getCollection("rocketchat_message").insert({"_id":"seqFxn6iMnefCk4oL","alias":"","msg":"286","attachments":[],"parseUrls":true,"groupable":false,"ts":new Date("2021-06-14T21:27:51.271Z"),"u":{"_id":"nM6vXyDLGGzSPsLNy","username":"admin","name":"Admin"},"rid":"GFR2xxircSsyJxx9F","_updatedAt":new Date("2021-06-14T21:27:51.305Z"),"urls":[],"mentions":[],"channels":[],"md":[{"type":"PARAGRAPH","value":[{"type":"PLAIN_TEXT","value":"286"}]}]}); +db.getCollection("rocketchat_message").insert({"_id":"sjpPh6jnmQ9cT2XtA","alias":"","msg":"245","attachments":[],"parseUrls":true,"groupable":false,"ts":new Date("2021-06-14T21:27:36.278Z"),"u":{"_id":"nM6vXyDLGGzSPsLNy","username":"admin","name":"Admin"},"rid":"GFR2xxircSsyJxx9F","_updatedAt":new Date("2021-06-14T21:27:36.307Z"),"urls":[],"mentions":[],"channels":[],"md":[{"type":"PARAGRAPH","value":[{"type":"PLAIN_TEXT","value":"245"}]}]}); +db.getCollection("rocketchat_message").insert({"_id":"skTHqNq9QnaL6odE4","alias":"","msg":"62","attachments":[],"parseUrls":true,"groupable":false,"ts":new Date("2021-06-14T21:26:25.787Z"),"u":{"_id":"nM6vXyDLGGzSPsLNy","username":"admin","name":"Admin"},"rid":"GFR2xxircSsyJxx9F","_updatedAt":new Date("2021-06-14T21:26:25.808Z"),"urls":[],"mentions":[],"channels":[],"md":[{"type":"PARAGRAPH","value":[{"type":"PLAIN_TEXT","value":"62"}]}]}); +db.getCollection("rocketchat_message").insert({"_id":"syv4LYPK7pGwH6gMR","alias":"","msg":"205","attachments":[],"parseUrls":true,"groupable":false,"ts":new Date("2021-06-14T21:27:21.886Z"),"u":{"_id":"nM6vXyDLGGzSPsLNy","username":"admin","name":"Admin"},"rid":"GFR2xxircSsyJxx9F","_updatedAt":new Date("2021-06-14T21:27:21.905Z"),"urls":[],"mentions":[],"channels":[],"md":[{"type":"PARAGRAPH","value":[{"type":"PLAIN_TEXT","value":"205"}]}]}); +db.getCollection("rocketchat_message").insert({"_id":"tA26DWrEE44d2rrQF","alias":"","msg":"59","attachments":[],"parseUrls":true,"groupable":false,"ts":new Date("2021-06-14T21:26:24.717Z"),"u":{"_id":"nM6vXyDLGGzSPsLNy","username":"admin","name":"Admin"},"rid":"GFR2xxircSsyJxx9F","_updatedAt":new Date("2021-06-14T21:26:24.737Z"),"urls":[],"mentions":[],"channels":[],"md":[{"type":"PARAGRAPH","value":[{"type":"PLAIN_TEXT","value":"59"}]}]}); +db.getCollection("rocketchat_message").insert({"_id":"tLKnMvEAK7ELxqN9m","alias":"","msg":"190","attachments":[],"parseUrls":true,"groupable":false,"ts":new Date("2021-06-14T21:27:16.420Z"),"u":{"_id":"nM6vXyDLGGzSPsLNy","username":"admin","name":"Admin"},"rid":"GFR2xxircSsyJxx9F","_updatedAt":new Date("2021-06-14T21:27:16.423Z"),"urls":[],"mentions":[],"channels":[],"md":[{"type":"PARAGRAPH","value":[{"type":"PLAIN_TEXT","value":"190"}]}]}); +db.getCollection("rocketchat_message").insert({"_id":"tm9kzLG57tmTGuDga","alias":"","msg":"5","attachments":[],"parseUrls":true,"groupable":false,"ts":new Date("2021-06-14T21:26:05.820Z"),"u":{"_id":"nM6vXyDLGGzSPsLNy","username":"admin","name":"Admin"},"rid":"GFR2xxircSsyJxx9F","_updatedAt":new Date("2021-06-14T21:26:05.848Z"),"urls":[],"mentions":[],"channels":[],"md":[{"type":"PARAGRAPH","value":[{"type":"PLAIN_TEXT","value":"5"}]}]}); +db.getCollection("rocketchat_message").insert({"_id":"tpJ6jPcf8hTE6Y9my","alias":"","msg":"231","attachments":[],"parseUrls":true,"groupable":false,"ts":new Date("2021-06-14T21:27:31.261Z"),"u":{"_id":"nM6vXyDLGGzSPsLNy","username":"admin","name":"Admin"},"rid":"GFR2xxircSsyJxx9F","_updatedAt":new Date("2021-06-14T21:27:31.305Z"),"urls":[],"mentions":[],"channels":[],"md":[{"type":"PARAGRAPH","value":[{"type":"PLAIN_TEXT","value":"231"}]}]}); +db.getCollection("rocketchat_message").insert({"_id":"ttcshiSSJSknTmXhN","alias":"","msg":"255","attachments":[],"parseUrls":true,"groupable":false,"ts":new Date("2021-06-14T21:27:39.886Z"),"u":{"_id":"nM6vXyDLGGzSPsLNy","username":"admin","name":"Admin"},"rid":"GFR2xxircSsyJxx9F","_updatedAt":new Date("2021-06-14T21:27:39.905Z"),"urls":[],"mentions":[],"channels":[],"md":[{"type":"PARAGRAPH","value":[{"type":"PLAIN_TEXT","value":"255"}]}]}); +db.getCollection("rocketchat_message").insert({"_id":"txf4Dih43e23ezkm6","alias":"","msg":"200","attachments":[],"parseUrls":true,"groupable":false,"ts":new Date("2021-06-14T21:27:20.035Z"),"u":{"_id":"nM6vXyDLGGzSPsLNy","username":"admin","name":"Admin"},"rid":"GFR2xxircSsyJxx9F","_updatedAt":new Date("2021-06-14T21:27:20.095Z"),"urls":[],"mentions":[],"channels":[],"md":[{"type":"PARAGRAPH","value":[{"type":"PLAIN_TEXT","value":"200"}]}]}); +db.getCollection("rocketchat_message").insert({"_id":"tyxqHBNYJpBs2DreP","alias":"","msg":"172","attachments":[],"parseUrls":true,"groupable":false,"ts":new Date("2021-06-14T21:27:08.927Z"),"u":{"_id":"nM6vXyDLGGzSPsLNy","username":"admin","name":"Admin"},"rid":"GFR2xxircSsyJxx9F","_updatedAt":new Date("2021-06-14T21:27:08.946Z"),"urls":[],"mentions":[],"channels":[],"md":[{"type":"PARAGRAPH","value":[{"type":"PLAIN_TEXT","value":"172"}]}]}); +db.getCollection("rocketchat_message").insert({"_id":"u3BjoxuA4pzjPGzyS","alias":"","msg":"9","attachments":[],"parseUrls":true,"groupable":false,"ts":new Date("2021-06-14T21:26:07.267Z"),"u":{"_id":"nM6vXyDLGGzSPsLNy","username":"admin","name":"Admin"},"rid":"GFR2xxircSsyJxx9F","_updatedAt":new Date("2021-06-14T21:26:07.295Z"),"urls":[],"mentions":[],"channels":[],"md":[{"type":"PARAGRAPH","value":[{"type":"PLAIN_TEXT","value":"9"}]}]}); +db.getCollection("rocketchat_message").insert({"_id":"uHwBGqbXsLWuQ4CP3","alias":"","msg":"262","attachments":[],"parseUrls":true,"groupable":false,"ts":new Date("2021-06-14T21:27:42.389Z"),"u":{"_id":"nM6vXyDLGGzSPsLNy","username":"admin","name":"Admin"},"rid":"GFR2xxircSsyJxx9F","_updatedAt":new Date("2021-06-14T21:27:42.409Z"),"urls":[],"mentions":[],"channels":[],"md":[{"type":"PARAGRAPH","value":[{"type":"PLAIN_TEXT","value":"262"}]}]}); +db.getCollection("rocketchat_message").insert({"_id":"uNzeBDetJgn9wEaQ4","alias":"","msg":"191","attachments":[],"parseUrls":true,"groupable":false,"ts":new Date("2021-06-14T21:27:16.773Z"),"u":{"_id":"nM6vXyDLGGzSPsLNy","username":"admin","name":"Admin"},"rid":"GFR2xxircSsyJxx9F","_updatedAt":new Date("2021-06-14T21:27:16.808Z"),"urls":[],"mentions":[],"channels":[],"md":[{"type":"PARAGRAPH","value":[{"type":"PLAIN_TEXT","value":"191"}]}]}); +db.getCollection("rocketchat_message").insert({"_id":"uqJDykHAvpnBrGMNF","alias":"","msg":"243","attachments":[],"parseUrls":true,"groupable":false,"ts":new Date("2021-06-14T21:27:35.562Z"),"u":{"_id":"nM6vXyDLGGzSPsLNy","username":"admin","name":"Admin"},"rid":"GFR2xxircSsyJxx9F","_updatedAt":new Date("2021-06-14T21:27:35.582Z"),"urls":[],"mentions":[],"channels":[],"md":[{"type":"PARAGRAPH","value":[{"type":"PLAIN_TEXT","value":"243"}]}]}); +db.getCollection("rocketchat_message").insert({"_id":"utqDfyM45QuRLzK3o","alias":"","msg":"78","attachments":[],"parseUrls":true,"groupable":false,"ts":new Date("2021-06-14T21:26:31.473Z"),"u":{"_id":"nM6vXyDLGGzSPsLNy","username":"admin","name":"Admin"},"rid":"GFR2xxircSsyJxx9F","_updatedAt":new Date("2021-06-14T21:26:31.491Z"),"urls":[],"mentions":[],"channels":[],"md":[{"type":"PARAGRAPH","value":[{"type":"PLAIN_TEXT","value":"78"}]}]}); +db.getCollection("rocketchat_message").insert({"_id":"v5upv7DR4BHbCwBEX","alias":"","msg":"48","attachments":[],"parseUrls":true,"groupable":false,"ts":new Date("2021-06-14T21:26:20.883Z"),"u":{"_id":"nM6vXyDLGGzSPsLNy","username":"admin","name":"Admin"},"rid":"GFR2xxircSsyJxx9F","_updatedAt":new Date("2021-06-14T21:26:20.899Z"),"urls":[],"mentions":[],"channels":[],"md":[{"type":"PARAGRAPH","value":[{"type":"PLAIN_TEXT","value":"48"}]}]}); +db.getCollection("rocketchat_message").insert({"_id":"v7HSMTfRa68Suh8at","alias":"","msg":"153","attachments":[],"parseUrls":true,"groupable":false,"ts":new Date("2021-06-14T21:27:01.296Z"),"u":{"_id":"nM6vXyDLGGzSPsLNy","username":"admin","name":"Admin"},"rid":"GFR2xxircSsyJxx9F","_updatedAt":new Date("2021-06-14T21:27:01.364Z"),"urls":[],"mentions":[],"channels":[],"md":[{"type":"PARAGRAPH","value":[{"type":"PLAIN_TEXT","value":"153"}]}]}); +db.getCollection("rocketchat_message").insert({"_id":"vYYLKrHc8yDr9AZC7","alias":"","msg":"178","attachments":[],"parseUrls":true,"groupable":false,"ts":new Date("2021-06-14T21:27:11.540Z"),"u":{"_id":"nM6vXyDLGGzSPsLNy","username":"admin","name":"Admin"},"rid":"GFR2xxircSsyJxx9F","_updatedAt":new Date("2021-06-14T21:27:11.576Z"),"urls":[],"mentions":[],"channels":[],"md":[{"type":"PARAGRAPH","value":[{"type":"PLAIN_TEXT","value":"178"}]}]}); +db.getCollection("rocketchat_message").insert({"_id":"vn9Qp6fC5s2cEKt3a","alias":"","msg":"267","attachments":[],"parseUrls":true,"groupable":false,"ts":new Date("2021-06-14T21:27:44.152Z"),"u":{"_id":"nM6vXyDLGGzSPsLNy","username":"admin","name":"Admin"},"rid":"GFR2xxircSsyJxx9F","_updatedAt":new Date("2021-06-14T21:27:44.176Z"),"urls":[],"mentions":[],"channels":[],"md":[{"type":"PARAGRAPH","value":[{"type":"PLAIN_TEXT","value":"267"}]}]}); +db.getCollection("rocketchat_message").insert({"_id":"voqrApbpcnuGtkLMp","rid":"5iyMRT843rNn4wwHv","tmid":"NAXDFHoxA44rsyujh","msg":"7","ts":new Date("2021-06-14T21:26:51.398Z"),"u":{"_id":"nM6vXyDLGGzSPsLNy","username":"admin","name":"Admin"},"_updatedAt":new Date("2021-06-14T21:26:51.520Z"),"urls":[],"mentions":[],"channels":[],"md":[{"type":"PARAGRAPH","value":[{"type":"PLAIN_TEXT","value":"7"}]}]}); +db.getCollection("rocketchat_message").insert({"_id":"vsYTFFAkiGKsWKPdz","rid":"5iyMRT843rNn4wwHv","tmid":"NAXDFHoxA44rsyujh","msg":"thread message sent to main room","tshow":true,"ts":new Date("2021-06-14T21:26:49.776Z"),"u":{"_id":"nM6vXyDLGGzSPsLNy","username":"admin","name":"Admin"},"_updatedAt":new Date("2021-06-14T21:26:49.935Z"),"urls":[],"mentions":[],"channels":[],"md":[{"type":"PARAGRAPH","value":[{"type":"PLAIN_TEXT","value":"4"}]}]}); +db.getCollection("rocketchat_message").insert({"_id":"vvEjAvsntsAuuPTKF","alias":"","msg":"83","attachments":[],"parseUrls":true,"groupable":false,"ts":new Date("2021-06-14T21:26:33.249Z"),"u":{"_id":"nM6vXyDLGGzSPsLNy","username":"admin","name":"Admin"},"rid":"GFR2xxircSsyJxx9F","_updatedAt":new Date("2021-06-14T21:26:33.276Z"),"urls":[],"mentions":[],"channels":[],"md":[{"type":"PARAGRAPH","value":[{"type":"PLAIN_TEXT","value":"83"}]}]}); +db.getCollection("rocketchat_message").insert({"_id":"w6HMBqLX9eYHvmZzD","alias":"","msg":"70","attachments":[],"parseUrls":true,"groupable":false,"ts":new Date("2021-06-14T21:26:28.656Z"),"u":{"_id":"nM6vXyDLGGzSPsLNy","username":"admin","name":"Admin"},"rid":"GFR2xxircSsyJxx9F","_updatedAt":new Date("2021-06-14T21:26:28.679Z"),"urls":[],"mentions":[],"channels":[],"md":[{"type":"PARAGRAPH","value":[{"type":"PLAIN_TEXT","value":"70"}]}]}); +db.getCollection("rocketchat_message").insert({"_id":"w7hroywNx2tecwn2b","alias":"","msg":"129","attachments":[],"parseUrls":true,"groupable":false,"ts":new Date("2021-06-14T21:26:50.523Z"),"u":{"_id":"nM6vXyDLGGzSPsLNy","username":"admin","name":"Admin"},"rid":"GFR2xxircSsyJxx9F","_updatedAt":new Date("2021-06-14T21:26:50.618Z"),"urls":[],"mentions":[],"channels":[],"md":[{"type":"PARAGRAPH","value":[{"type":"PLAIN_TEXT","value":"129"}]}]}); +db.getCollection("rocketchat_message").insert({"_id":"wDgerDqxzMCmqSYKz","alias":"","msg":"58","attachments":[],"parseUrls":true,"groupable":false,"ts":new Date("2021-06-14T21:26:24.376Z"),"u":{"_id":"nM6vXyDLGGzSPsLNy","username":"admin","name":"Admin"},"rid":"GFR2xxircSsyJxx9F","_updatedAt":new Date("2021-06-14T21:26:24.390Z"),"urls":[],"mentions":[],"channels":[],"md":[{"type":"PARAGRAPH","value":[{"type":"PLAIN_TEXT","value":"58"}]}]}); +db.getCollection("rocketchat_message").insert({"_id":"wSYKDGziubGABmmNb","alias":"","msg":"82","attachments":[],"parseUrls":true,"groupable":false,"ts":new Date("2021-06-14T21:26:32.885Z"),"u":{"_id":"nM6vXyDLGGzSPsLNy","username":"admin","name":"Admin"},"rid":"GFR2xxircSsyJxx9F","_updatedAt":new Date("2021-06-14T21:26:32.917Z"),"urls":[],"mentions":[],"channels":[],"md":[{"type":"PARAGRAPH","value":[{"type":"PLAIN_TEXT","value":"82"}]}]}); +db.getCollection("rocketchat_message").insert({"_id":"wXScdaF6cs3tBLbvg","rid":"5iyMRT843rNn4wwHv","tmid":"NAXDFHoxA44rsyujh","msg":"6","ts":new Date("2021-06-14T21:26:50.887Z"),"u":{"_id":"nM6vXyDLGGzSPsLNy","username":"admin","name":"Admin"},"_updatedAt":new Date("2021-06-14T21:26:50.998Z"),"urls":[],"mentions":[],"channels":[],"md":[{"type":"PARAGRAPH","value":[{"type":"PLAIN_TEXT","value":"6"}]}]}); +db.getCollection("rocketchat_message").insert({"_id":"wXb2eMCF5em722dSG","rid":"5iyMRT843rNn4wwHv","tmid":"NAXDFHoxA44rsyujh","msg":"quoted","ts":new Date("2021-06-14T21:26:49.220Z"),"u":{"_id":"nM6vXyDLGGzSPsLNy","username":"admin","name":"Admin"},"_updatedAt":new Date("2021-06-14T21:26:49.341Z"),"urls":[],"mentions":[],"channels":[],"md":[{"type":"PARAGRAPH","value":[{"type":"PLAIN_TEXT","value":"quoted"}]}]}); +db.getCollection("rocketchat_message").insert({"_id":"wZ2FMa6d2zMFwZwjL","alias":"","msg":"12","attachments":[],"parseUrls":true,"groupable":false,"ts":new Date("2021-06-14T21:26:08.336Z"),"u":{"_id":"nM6vXyDLGGzSPsLNy","username":"admin","name":"Admin"},"rid":"GFR2xxircSsyJxx9F","_updatedAt":new Date("2021-06-14T21:26:08.359Z"),"urls":[],"mentions":[],"channels":[],"md":[{"type":"PARAGRAPH","value":[{"type":"PLAIN_TEXT","value":"12"}]}]}); +db.getCollection("rocketchat_message").insert({"_id":"wg5oydMJc8fp5wgoR","rid":"5iyMRT843rNn4wwHv","tmid":"NAXDFHoxA44rsyujh","msg":"8","ts":new Date("2021-06-14T21:26:51.875Z"),"u":{"_id":"nM6vXyDLGGzSPsLNy","username":"admin","name":"Admin"},"_updatedAt":new Date("2021-06-14T21:26:52.025Z"),"urls":[],"mentions":[],"channels":[],"md":[{"type":"PARAGRAPH","value":[{"type":"PLAIN_TEXT","value":"8"}]}]}); +db.getCollection("rocketchat_message").insert({"_id":"wr9zgcFELuZGzo2Xe","alias":"","msg":"147","attachments":[],"parseUrls":true,"groupable":false,"ts":new Date("2021-06-14T21:26:58.876Z"),"u":{"_id":"nM6vXyDLGGzSPsLNy","username":"admin","name":"Admin"},"rid":"GFR2xxircSsyJxx9F","_updatedAt":new Date("2021-06-14T21:26:58.991Z"),"urls":[],"mentions":[],"channels":[],"md":[{"type":"PARAGRAPH","value":[{"type":"PLAIN_TEXT","value":"147"}]}]}); +db.getCollection("rocketchat_message").insert({"_id":"xXXexskd39XS4tfXE","rid":"5iyMRT843rNn4wwHv","tmid":"NAXDFHoxA44rsyujh","msg":"25","ts":new Date("2021-06-14T21:27:09.149Z"),"u":{"_id":"nM6vXyDLGGzSPsLNy","username":"admin","name":"Admin"},"_updatedAt":new Date("2021-06-14T21:27:09.219Z"),"urls":[],"mentions":[],"channels":[],"md":[{"type":"PARAGRAPH","value":[{"type":"PLAIN_TEXT","value":"25"}]}]}); +db.getCollection("rocketchat_message").insert({"_id":"xhCSEvqZjmWP8XCzv","alias":"","msg":"41","attachments":[],"parseUrls":true,"groupable":false,"ts":new Date("2021-06-14T21:26:18.504Z"),"u":{"_id":"nM6vXyDLGGzSPsLNy","username":"admin","name":"Admin"},"rid":"GFR2xxircSsyJxx9F","_updatedAt":new Date("2021-06-14T21:26:18.518Z"),"urls":[],"mentions":[],"channels":[],"md":[{"type":"PARAGRAPH","value":[{"type":"PLAIN_TEXT","value":"41"}]}]}); +db.getCollection("rocketchat_message").insert({"_id":"y4XkigXMgv6ACLd9R","alias":"","msg":"92","attachments":[],"parseUrls":true,"groupable":false,"ts":new Date("2021-06-14T21:26:36.500Z"),"u":{"_id":"nM6vXyDLGGzSPsLNy","username":"admin","name":"Admin"},"rid":"GFR2xxircSsyJxx9F","_updatedAt":new Date("2021-06-14T21:26:36.519Z"),"urls":[],"mentions":[],"channels":[],"md":[{"type":"PARAGRAPH","value":[{"type":"PLAIN_TEXT","value":"92"}]}]}); +db.getCollection("rocketchat_message").insert({"_id":"y8QHZid5pNvXyg9fX","rid":"5iyMRT843rNn4wwHv","tmid":"NAXDFHoxA44rsyujh","msg":"13","ts":new Date("2021-06-14T21:26:55.736Z"),"u":{"_id":"nM6vXyDLGGzSPsLNy","username":"admin","name":"Admin"},"_updatedAt":new Date("2021-06-14T21:26:55.823Z"),"urls":[],"mentions":[],"channels":[],"md":[{"type":"PARAGRAPH","value":[{"type":"PLAIN_TEXT","value":"13"}]}]}); +db.getCollection("rocketchat_message").insert({"_id":"yKoyhAhYETLv6kXdf","alias":"","msg":"81","attachments":[],"parseUrls":true,"groupable":false,"ts":new Date("2021-06-14T21:26:32.531Z"),"u":{"_id":"nM6vXyDLGGzSPsLNy","username":"admin","name":"Admin"},"rid":"GFR2xxircSsyJxx9F","_updatedAt":new Date("2021-06-14T21:26:32.554Z"),"urls":[],"mentions":[],"channels":[],"md":[{"type":"PARAGRAPH","value":[{"type":"PLAIN_TEXT","value":"81"}]}]}); +db.getCollection("rocketchat_message").insert({"_id":"ygZKFw8DnQFhjxEnn","alias":"","msg":"148","attachments":[],"parseUrls":true,"groupable":false,"ts":new Date("2021-06-14T21:26:59.377Z"),"u":{"_id":"nM6vXyDLGGzSPsLNy","username":"admin","name":"Admin"},"rid":"GFR2xxircSsyJxx9F","_updatedAt":new Date("2021-06-14T21:26:59.427Z"),"urls":[],"mentions":[],"channels":[],"md":[{"type":"PARAGRAPH","value":[{"type":"PLAIN_TEXT","value":"148"}]}]}); +db.getCollection("rocketchat_message").insert({"_id":"zApewG2ppDrjPqwHz","alias":"","msg":"278","attachments":[],"parseUrls":true,"groupable":false,"ts":new Date("2021-06-14T21:27:48.137Z"),"u":{"_id":"nM6vXyDLGGzSPsLNy","username":"admin","name":"Admin"},"rid":"GFR2xxircSsyJxx9F","_updatedAt":new Date("2021-06-14T21:27:48.298Z"),"urls":[],"mentions":[],"channels":[],"md":[{"type":"PARAGRAPH","value":[{"type":"PLAIN_TEXT","value":"278"}]}]}); +db.getCollection("rocketchat_message").insert({"_id":"zAvAphoMoaS4m5z2s","alias":"","msg":"134","attachments":[],"parseUrls":true,"groupable":false,"ts":new Date("2021-06-14T21:26:53.078Z"),"u":{"_id":"nM6vXyDLGGzSPsLNy","username":"admin","name":"Admin"},"rid":"GFR2xxircSsyJxx9F","_updatedAt":new Date("2021-06-14T21:26:53.151Z"),"urls":[],"mentions":[],"channels":[],"md":[{"type":"PARAGRAPH","value":[{"type":"PLAIN_TEXT","value":"134"}]}]}); +db.getCollection("rocketchat_message").insert({"_id":"zGMAPTHCPwt3jBCkm","alias":"","msg":"202","attachments":[],"parseUrls":true,"groupable":false,"ts":new Date("2021-06-14T21:27:20.825Z"),"u":{"_id":"nM6vXyDLGGzSPsLNy","username":"admin","name":"Admin"},"rid":"GFR2xxircSsyJxx9F","_updatedAt":new Date("2021-06-14T21:27:20.863Z"),"urls":[],"mentions":[],"channels":[],"md":[{"type":"PARAGRAPH","value":[{"type":"PLAIN_TEXT","value":"202"}]}]}); +db.getCollection("rocketchat_message").insert({"_id":"zPfgHYTQeskiL8Jp6","alias":"","msg":"222","attachments":[],"parseUrls":true,"groupable":false,"ts":new Date("2021-06-14T21:27:27.932Z"),"u":{"_id":"nM6vXyDLGGzSPsLNy","username":"admin","name":"Admin"},"rid":"GFR2xxircSsyJxx9F","_updatedAt":new Date("2021-06-14T21:27:27.952Z"),"urls":[],"mentions":[],"channels":[],"md":[{"type":"PARAGRAPH","value":[{"type":"PLAIN_TEXT","value":"222"}]}]}); +db.getCollection("rocketchat_message").insert({"_id":"zQu55sCe6sQaPwBHJ","alias":"","msg":"67","attachments":[],"parseUrls":true,"groupable":false,"ts":new Date("2021-06-14T21:26:27.571Z"),"u":{"_id":"nM6vXyDLGGzSPsLNy","username":"admin","name":"Admin"},"rid":"GFR2xxircSsyJxx9F","_updatedAt":new Date("2021-06-14T21:26:27.596Z"),"urls":[],"mentions":[],"channels":[],"md":[{"type":"PARAGRAPH","value":[{"type":"PLAIN_TEXT","value":"67"}]}]}); +db.getCollection("rocketchat_message").insert({"_id":"zSZSann7XBW5672HA","rid":"5iyMRT843rNn4wwHv","tmid":"NAXDFHoxA44rsyujh","msg":"12","ts":new Date("2021-06-14T21:26:54.930Z"),"u":{"_id":"nM6vXyDLGGzSPsLNy","username":"admin","name":"Admin"},"_updatedAt":new Date("2021-06-14T21:26:55.046Z"),"urls":[],"mentions":[],"channels":[],"md":[{"type":"PARAGRAPH","value":[{"type":"PLAIN_TEXT","value":"12"}]}]}); +db.getCollection("rocketchat_message").insert({"_id":"zjeYZ7WrpmJWwkuqB","alias":"","msg":"75","attachments":[],"parseUrls":true,"groupable":false,"ts":new Date("2021-06-14T21:26:30.421Z"),"u":{"_id":"nM6vXyDLGGzSPsLNy","username":"admin","name":"Admin"},"rid":"GFR2xxircSsyJxx9F","_updatedAt":new Date("2021-06-14T21:26:30.439Z"),"urls":[],"mentions":[],"channels":[],"md":[{"type":"PARAGRAPH","value":[{"type":"PLAIN_TEXT","value":"75"}]}]}); +db.getCollection("rocketchat_message").insert({"_id":"ztdbnfLLo6f6hnRMo","alias":"","msg":"197","attachments":[],"parseUrls":true,"groupable":false,"ts":new Date("2021-06-14T21:27:18.946Z"),"u":{"_id":"nM6vXyDLGGzSPsLNy","username":"admin","name":"Admin"},"rid":"GFR2xxircSsyJxx9F","_updatedAt":new Date("2021-06-14T21:27:18.970Z"),"urls":[],"mentions":[],"channels":[],"md":[{"type":"PARAGRAPH","value":[{"type":"PLAIN_TEXT","value":"197"}]}]}); diff --git a/e2e/docker/docker-entrypoint-initdb.d/rocketchat_room.js b/e2e/docker/docker-entrypoint-initdb.d/rocketchat_room.js index 09640ac1c..078c7e509 100644 --- a/e2e/docker/docker-entrypoint-initdb.d/rocketchat_room.js +++ b/e2e/docker/docker-entrypoint-initdb.d/rocketchat_room.js @@ -1 +1,3 @@ -db.getCollection("rocketchat_room").insert({"_id":"GENERAL","ts":new Date(1584022382998),"t":"c","name":"general","usernames":[],"msgs":NumberInt(3),"usersCount":NumberInt(3),"default":true,"_updatedAt":new Date(1589465366516),"lastMessage":{"_id":"fsy2dZJgmmboowJ8N","t":"uj","rid":"GENERAL","ts":new Date(1584022608462),"msg":"admin","u":{"_id":"nM6vXyDLGGzSPsLNy","username":"admin"},"groupable":false,"_updatedAt":new Date(1584022608462)},"lm":new Date(1584022608462)}); +db.getCollection("rocketchat_room").insert({"_id":"5iyMRT843rNn4wwHv","fname":"jumping-thread","customFields":{},"description":"","broadcast":false,"encrypted":false,"name":"jumping-thread","t":"p","msgs":33,"usersCount":1,"u":{"_id":"nM6vXyDLGGzSPsLNy","username":"admin"},"ts":new Date("2021-06-14T21:26:33.120Z"),"ro":false,"default":false,"sysMes":true,"_updatedAt":new Date("2021-06-14T21:27:34.527Z"),"lastMessage":{"_id":"R7iDtoqMcP8iH9AZi","rid":"5iyMRT843rNn4wwHv","msg":"http://localhost:3000/group/jumping-thread?msg=rMbGKvG834q8EeNGs Go to 1","ts":new Date("2021-06-14T21:27:34.440Z"),"u":{"_id":"nM6vXyDLGGzSPsLNy","username":"admin","name":"Admin"},"_updatedAt":new Date("2021-06-14T21:27:34.517Z"),"attachments":[{"text":"1","author_name":"admin","author_icon":"/avatar/admin","message_link":"http://localhost:3000/group/jumping-thread?msg=rMbGKvG834q8EeNGs","attachments":[],"ts":new Date("2021-06-14T21:26:48.151Z")}],"urls":[{"url":"http://localhost:3000/group/jumping-thread?msg=rMbGKvG834q8EeNGs","ignoreParse":true}],"mentions":[],"channels":[],"md":[{"type":"PARAGRAPH","value":[{"type":"LINK","value":{"src":{"type":"PLAIN_TEXT","value":"http://localhost:3000/group/jumping-thread?msg=rMbGKvG834q8EeNGs"},"label":{"type":"PLAIN_TEXT","value":"http://localhost:3000/group/jumping-thread?msg=rMbGKvG834q8EeNGs"}}},{"type":"PLAIN_TEXT","value":" Go to 1"}]}]},"lm":new Date("2021-06-14T21:27:34.440Z")}); +db.getCollection("rocketchat_room").insert({"_id":"GENERAL","ts":new Date("2020-03-12T14:13:02.998Z"),"t":"c","name":"general","usernames":[],"msgs":3,"usersCount":3,"default":true,"_updatedAt":new Date("2020-05-14T14:09:26.516Z"),"lastMessage":{"_id":"fsy2dZJgmmboowJ8N","t":"uj","rid":"GENERAL","ts":new Date("2020-03-12T14:16:48.462Z"),"msg":"admin","u":{"_id":"nM6vXyDLGGzSPsLNy","username":"admin"},"groupable":false,"_updatedAt":new Date("2020-03-12T14:16:48.462Z")},"lm":new Date("2020-03-12T14:16:48.462Z")}); +db.getCollection("rocketchat_room").insert({"_id":"GFR2xxircSsyJxx9F","fname":"jumping","customFields":{},"description":"","broadcast":false,"encrypted":false,"name":"jumping","t":"p","msgs":302,"usersCount":1,"u":{"_id":"nM6vXyDLGGzSPsLNy","username":"admin"},"ts":new Date("2021-06-14T21:23:44.808Z"),"ro":false,"default":false,"sysMes":true,"_updatedAt":new Date("2021-06-14T21:28:50.547Z"),"lastMessage":{"_id":"asNxLidHfTi7E3rri","rid":"GFR2xxircSsyJxx9F","msg":"[ ](http://localhost:3000/group/jumping?msg=DvKX5qbzg8CWE3oNC) Quote first message","ts":new Date("2021-06-14T21:28:50.477Z"),"u":{"_id":"nM6vXyDLGGzSPsLNy","username":"admin","name":"Admin"},"_updatedAt":new Date("2021-06-14T21:28:50.537Z"),"attachments":[{"text":"1","author_name":"admin","author_icon":"/avatar/admin","message_link":"http://localhost:3000/group/jumping?msg=DvKX5qbzg8CWE3oNC","attachments":[],"ts":new Date("2021-06-14T21:24:50.182Z")}],"urls":[{"url":"http://localhost:3000/group/jumping?msg=DvKX5qbzg8CWE3oNC","ignoreParse":true}],"mentions":[],"channels":[],"md":[{"type":"PARAGRAPH","value":[{"type":"LINK","value":{"src":{"type":"PLAIN_TEXT","value":"http://localhost:3000/group/jumping?msg=DvKX5qbzg8CWE3oNC"},"label":{"type":"PLAIN_TEXT","value":" "}}},{"type":"PLAIN_TEXT","value":" Quote first message"}]}]},"lm":new Date("2021-06-14T21:28:50.477Z")}); diff --git a/e2e/docker/docker-entrypoint-initdb.d/rocketchat_settings.js b/e2e/docker/docker-entrypoint-initdb.d/rocketchat_settings.js index d602c8e23..13f672f76 100644 --- a/e2e/docker/docker-entrypoint-initdb.d/rocketchat_settings.js +++ b/e2e/docker/docker-entrypoint-initdb.d/rocketchat_settings.js @@ -333,7 +333,7 @@ db.getCollection("rocketchat_settings").insert({"_id":"Discussion","_updatedAt": db.getCollection("rocketchat_settings").insert({"_id":"Discussion_enabled","_updatedAt":new Date(1591734399894),"autocomplete":true,"blocked":false,"createdAt":new Date(1584022382543),"group":"Discussion","hidden":false,"i18nDescription":"Discussion_enabled_Description","i18nLabel":"Enable","packageValue":true,"public":true,"secret":false,"sorter":NumberInt(0),"ts":new Date(1587032125124),"type":"boolean","value":true,"valueSource":"meteorSettingsValue","meteorSettingsValue":true}); db.getCollection("rocketchat_settings").insert({"_id":"Document_Domain","_updatedAt":new Date(1591734378033),"autocomplete":true,"blocked":false,"createdAt":new Date(1584022363283),"group":"General","hidden":false,"i18nDescription":"Document_Domain_Description","i18nLabel":"Document_Domain","packageValue":"","public":true,"secret":false,"sorter":NumberInt(13),"ts":new Date(1589465206477),"type":"string","value":"","valueSource":"packageValue"}); db.getCollection("rocketchat_settings").insert({"_id":"E2E Encryption","_updatedAt":new Date(1591734392055),"blocked":false,"createdAt":new Date(1584022376881),"hidden":false,"i18nDescription":"E2E Encryption_Description","i18nLabel":"E2E Encryption","ts":new Date(1591734392055),"type":"group"}); -db.getCollection("rocketchat_settings").insert({"_id":"E2E_Enable","_updatedAt":new Date(1591734392060),"alert":"E2E_Enable_alert","autocomplete":true,"blocked":false,"createdAt":new Date(1584022376886),"group":"E2E Encryption","hidden":false,"i18nDescription":"E2E_Enable_description","i18nLabel":"Enabled","packageValue":false,"public":true,"secret":false,"sorter":NumberInt(0),"ts":new Date(1587032118031),"type":"boolean","value":false,"valueSource":"meteorSettingsValue","meteorSettingsValue":false}); +db.getCollection("rocketchat_settings").insert({"_id":"E2E_Enable","_updatedAt":new Date(1591734392060),"alert":"E2E_Enable_alert","autocomplete":true,"blocked":false,"createdAt":new Date(1584022376886),"group":"E2E Encryption","hidden":false,"i18nDescription":"E2E_Enable_description","i18nLabel":"Enabled","packageValue":false,"public":true,"secret":false,"sorter":NumberInt(0),"ts":new Date(1587032118031),"type":"boolean","value":true,"valueSource":"meteorSettingsValue","meteorSettingsValue":false}); db.getCollection("rocketchat_settings").insert({"_id":"E2E_Enabled_Default_DirectRooms","_updatedAt":new Date(1591734392064),"autocomplete":true,"blocked":false,"createdAt":new Date(1589465219630),"enableQuery":"{\"_id\":\"E2E_Enable\",\"value\":true}","group":"E2E Encryption","hidden":false,"i18nDescription":"E2E_Enabled_Default_DirectRooms_Description","i18nLabel":"E2E_Enabled_Default_DirectRooms","packageValue":false,"secret":false,"sorter":NumberInt(1),"ts":new Date(1591648586549),"type":"boolean","value":false,"valueSource":"meteorSettingsValue","meteorSettingsValue":false}); db.getCollection("rocketchat_settings").insert({"_id":"E2E_Enabled_Default_PrivateRooms","_updatedAt":new Date(1591734392068),"autocomplete":true,"blocked":false,"createdAt":new Date(1589465219635),"enableQuery":"{\"_id\":\"E2E_Enable\",\"value\":true}","group":"E2E Encryption","hidden":false,"i18nDescription":"E2E_Enabled_Default_PrivateRooms_Description","i18nLabel":"E2E_Enabled_Default_PrivateRooms","packageValue":false,"secret":false,"sorter":NumberInt(2),"ts":new Date(1591648586557),"type":"boolean","value":false,"valueSource":"meteorSettingsValue","meteorSettingsValue":false}); db.getCollection("rocketchat_settings").insert({"_id":"Email","_updatedAt":new Date(1591734377231),"blocked":false,"createdAt":new Date(1584022362339),"hidden":false,"i18nDescription":"Email_Description","i18nLabel":"Email","ts":new Date(1591734377231),"type":"group"}); diff --git a/e2e/docker/docker-entrypoint-initdb.d/rocketchat_subscription.js b/e2e/docker/docker-entrypoint-initdb.d/rocketchat_subscription.js index 72b264e32..acaef0554 100644 --- a/e2e/docker/docker-entrypoint-initdb.d/rocketchat_subscription.js +++ b/e2e/docker/docker-entrypoint-initdb.d/rocketchat_subscription.js @@ -1 +1,3 @@ -db.getCollection("rocketchat_subscription").insert({"_id":"KRktZiYdT9DK3dZgJ","open":true,"alert":false,"unread":NumberInt(0),"userMentions":NumberInt(0),"groupMentions":NumberInt(0),"ts":new Date(1584022608447),"rid":"GENERAL","name":"general","t":"c","u":{"_id":"nM6vXyDLGGzSPsLNy","username":"admin","name":"Admin"},"_updatedAt":new Date(1589465366503),"ls":new Date(1589465366503)}); +db.getCollection("rocketchat_subscription").insert({"_id":"KRktZiYdT9DK3dZgJ","open":true,"alert":false,"unread":0,"userMentions":0,"groupMentions":0,"ts":new Date("2020-03-12T14:16:48.447Z"),"rid":"GENERAL","name":"general","t":"c","u":{"_id":"nM6vXyDLGGzSPsLNy","username":"admin","name":"Admin"},"_updatedAt":new Date("2020-05-14T14:09:26.503Z"),"ls":new Date("2020-05-14T14:09:26.503Z")}); +db.getCollection("rocketchat_subscription").insert({"_id":"MMF5fwJkT8zrTjX9b","open":true,"alert":false,"unread":0,"userMentions":0,"groupMentions":0,"ts":new Date("2021-06-14T21:26:33.120Z"),"rid":"5iyMRT843rNn4wwHv","name":"jumping-thread","fname":"jumping-thread","customFields":{},"t":"p","u":{"_id":"nM6vXyDLGGzSPsLNy","username":"admin"},"ls":new Date("2021-06-14T21:27:34.525Z"),"_updatedAt":new Date("2021-06-14T21:27:34.525Z"),"roles":["owner"],"lr":new Date("2021-06-14T21:27:14.840Z")}); +db.getCollection("rocketchat_subscription").insert({"_id":"o3jB8uKAC2cBkYhcL","open":true,"alert":false,"unread":0,"userMentions":0,"groupMentions":0,"ts":new Date("2021-06-14T21:23:44.808Z"),"rid":"GFR2xxircSsyJxx9F","name":"jumping","fname":"jumping","customFields":{},"t":"p","u":{"_id":"nM6vXyDLGGzSPsLNy","username":"admin"},"ls":new Date("2021-06-14T21:28:50.546Z"),"_updatedAt":new Date("2021-06-14T21:28:50.546Z"),"roles":["owner"]}); diff --git a/e2e/helpers/app.js b/e2e/helpers/app.js index 7c71c9f3e..45a67df56 100644 --- a/e2e/helpers/app.js +++ b/e2e/helpers/app.js @@ -1,122 +1,119 @@ -const { - device, expect, element, by, waitFor -} = require('detox'); const data = require('../data'); async function navigateToWorkspace(server = data.server) { - await waitFor(element(by.id('onboarding-view'))).toBeVisible().withTimeout(10000); + await waitFor(element(by.id('onboarding-view'))).toBeVisible().withTimeout(10000); await element(by.id('join-workspace')).tap(); await waitFor(element(by.id('new-server-view'))).toBeVisible().withTimeout(60000); - await element(by.id('new-server-view-input')).typeText(`${server}\n`); + await element(by.id('new-server-view-input')).typeText(`${ server }\n`); await waitFor(element(by.id('workspace-view'))).toBeVisible().withTimeout(60000); await expect(element(by.id('workspace-view'))).toBeVisible(); } async function navigateToLogin(server) { - await waitFor(element(by.id('onboarding-view'))).toBeVisible().withTimeout(20000); - await navigateToWorkspace(server); + await waitFor(element(by.id('onboarding-view'))).toBeVisible().withTimeout(20000); + await navigateToWorkspace(server); await element(by.id('workspace-view-login')).tap(); - await waitFor(element(by.id('login-view'))).toBeVisible().withTimeout(2000); - await expect(element(by.id('login-view'))).toBeVisible(); + await waitFor(element(by.id('login-view'))).toBeVisible().withTimeout(2000); + await expect(element(by.id('login-view'))).toBeVisible(); } async function navigateToRegister(server) { - await waitFor(element(by.id('onboarding-view'))).toBeVisible().withTimeout(20000); - await navigateToWorkspace(server); + await waitFor(element(by.id('onboarding-view'))).toBeVisible().withTimeout(20000); + await navigateToWorkspace(server); await element(by.id('workspace-view-register')).tap(); - await waitFor(element(by.id('register-view'))).toBeVisible().withTimeout(2000); + await waitFor(element(by.id('register-view'))).toBeVisible().withTimeout(2000); } async function login(username, password) { - await waitFor(element(by.id('login-view'))).toBeVisible().withTimeout(2000); - await element(by.id('login-view-email')).replaceText(username); - await element(by.id('login-view-password')).replaceText(password); - await element(by.id('login-view-submit')).tap(); - await waitFor(element(by.id('rooms-list-view'))).toBeVisible().withTimeout(30000); + await waitFor(element(by.id('login-view'))).toBeVisible().withTimeout(2000); + await element(by.id('login-view-email')).replaceText(username); + await element(by.id('login-view-password')).replaceText(password); + await element(by.id('login-view-submit')).tap(); + await waitFor(element(by.id('rooms-list-view'))).toBeVisible().withTimeout(30000); } async function logout() { - await element(by.id('rooms-list-view-sidebar')).tap(); - await waitFor(element(by.id('sidebar-view'))).toBeVisible().withTimeout(2000); + await element(by.id('rooms-list-view-sidebar')).tap(); + await waitFor(element(by.id('sidebar-view'))).toBeVisible().withTimeout(2000); await waitFor(element(by.id('sidebar-settings'))).toBeVisible().withTimeout(2000); - await element(by.id('sidebar-settings')).tap(); - await waitFor(element(by.id('settings-view'))).toBeVisible().withTimeout(2000); - await element(by.type('UIScrollView')).atIndex(1).scrollTo('bottom'); - await element(by.id('settings-logout')).tap(); - const logoutAlertMessage = 'You will be logged out of this application.'; - await waitFor(element(by.text(logoutAlertMessage)).atIndex(0)).toExist().withTimeout(10000); - await expect(element(by.text(logoutAlertMessage)).atIndex(0)).toExist(); - await element(by.text('Logout')).tap(); - await waitFor(element(by.id('onboarding-view'))).toBeVisible().withTimeout(10000); - await expect(element(by.id('onboarding-view'))).toBeVisible(); + await element(by.id('sidebar-settings')).tap(); + await waitFor(element(by.id('settings-view'))).toBeVisible().withTimeout(2000); + await element(by.type('UIScrollView')).atIndex(1).scrollTo('bottom'); + await element(by.id('settings-logout')).tap(); + const logoutAlertMessage = 'You will be logged out of this application.'; + await waitFor(element(by.text(logoutAlertMessage)).atIndex(0)).toExist().withTimeout(10000); + await expect(element(by.text(logoutAlertMessage)).atIndex(0)).toExist(); + await element(by.text('Logout')).tap(); + await waitFor(element(by.id('onboarding-view'))).toBeVisible().withTimeout(10000); + await expect(element(by.id('onboarding-view'))).toBeVisible(); } async function mockMessage(message, isThread = false) { - let input = isThread ? 'messagebox-input-thread' : 'messagebox-input'; + const input = isThread ? 'messagebox-input-thread' : 'messagebox-input'; await element(by.id(input)).tap(); await element(by.id(input)).typeText(`${ data.random }${ message }`); await element(by.id('messagebox-send-message')).tap(); await waitFor(element(by.label(`${ data.random }${ message }`))).toExist().withTimeout(60000); - await expect(element(by.label(`${ data.random }${ message }`))).toExist(); - await element(by.label(`${ data.random }${ message }`)).atIndex(0).tap(); -}; - -async function starMessage(message){ - const messageLabel = `${ data.random }${ message }` - await element(by.label(messageLabel)).atIndex(0).longPress(); - await expect(element(by.id('action-sheet'))).toExist(); - await expect(element(by.id('action-sheet-handle'))).toBeVisible(); - await element(by.id('action-sheet-handle')).swipe('up', 'fast', 0.5); - await element(by.label('Star')).atIndex(0).tap(); - await waitFor(element(by.id('action-sheet'))).not.toExist().withTimeout(5000); -}; - -async function pinMessage(message){ - const messageLabel = `${ data.random }${ message }` - await waitFor(element(by.label(messageLabel)).atIndex(0)).toExist(); - await element(by.label(messageLabel)).atIndex(0).longPress(); - await expect(element(by.id('action-sheet'))).toExist(); - await expect(element(by.id('action-sheet-handle'))).toBeVisible(); - await element(by.id('action-sheet-handle')).swipe('up', 'fast', 0.5); - await element(by.label('Pin')).atIndex(0).tap(); - await waitFor(element(by.id('action-sheet'))).not.toExist().withTimeout(5000); + await expect(element(by.label(`${ data.random }${ message }`))).toExist(); + await element(by.label(`${ data.random }${ message }`)).atIndex(0).tap(); } -async function dismissReviewNag(){ - await waitFor(element(by.text('Are you enjoying this app?'))).toExist().withTimeout(60000); - await element(by.label('No').and(by.type('_UIAlertControllerActionView'))).tap(); // Tap `no` on ask for review alert +async function starMessage(message) { + const messageLabel = `${ data.random }${ message }`; + await element(by.label(messageLabel)).atIndex(0).longPress(); + await expect(element(by.id('action-sheet'))).toExist(); + await expect(element(by.id('action-sheet-handle'))).toBeVisible(); + await element(by.id('action-sheet-handle')).swipe('up', 'fast', 0.5); + await element(by.label('Star')).atIndex(0).tap(); + await waitFor(element(by.id('action-sheet'))).not.toExist().withTimeout(5000); +} + +async function pinMessage(message) { + const messageLabel = `${ data.random }${ message }`; + await waitFor(element(by.label(messageLabel)).atIndex(0)).toExist(); + await element(by.label(messageLabel)).atIndex(0).longPress(); + await expect(element(by.id('action-sheet'))).toExist(); + await expect(element(by.id('action-sheet-handle'))).toBeVisible(); + await element(by.id('action-sheet-handle')).swipe('up', 'fast', 0.5); + await element(by.label('Pin')).atIndex(0).tap(); + await waitFor(element(by.id('action-sheet'))).not.toExist().withTimeout(5000); +} + +async function dismissReviewNag() { + await waitFor(element(by.text('Are you enjoying this app?'))).toExist().withTimeout(60000); + await element(by.label('No').and(by.type('_UIAlertControllerActionView'))).tap(); // Tap `no` on ask for review alert } async function tapBack() { - await element(by.id('header-back')).atIndex(0).tap(); + await element(by.id('header-back')).atIndex(0).tap(); } -async function sleep(ms) { - return new Promise(res => setTimeout(res, ms)); +function sleep(ms) { + return new Promise(res => setTimeout(res, ms)); } async function searchRoom(room) { - await element(by.id('rooms-list-view-search')).tap(); + await element(by.id('rooms-list-view-search')).tap(); await expect(element(by.id('rooms-list-view-search-input'))).toExist(); await waitFor(element(by.id('rooms-list-view-search-input'))).toExist().withTimeout(5000); - await element(by.id('rooms-list-view-search-input')).typeText(room); - await sleep(300); + await element(by.id('rooms-list-view-search-input')).typeText(room); + await sleep(300); await waitFor(element(by.id(`rooms-list-view-item-${ room }`))).toBeVisible().withTimeout(60000); } -async function tryTapping(theElement, timeout, longtap = false){ +async function tryTapping(theElement, timeout, longtap = false) { try { - if(longtap){ - await theElement.longPress() - } else { - await theElement.tap() - } - } catch(e) { - if(timeout <= 0){ //TODO: Maths. How closely has the timeout been honoured here? - throw e + if (longtap) { + await theElement.longPress(); + } else { + await theElement.tap(); } - await sleep(100) - await tryTapping(theElement, timeout - 100) + } catch (e) { + if (timeout <= 0) { // TODO: Maths. How closely has the timeout been honoured here? + throw e; + } + await sleep(100); + await tryTapping(theElement, timeout - 100); } } @@ -126,21 +123,21 @@ const checkServer = async(server) => { await waitFor(element(by.id('sidebar-view'))).toBeVisible().withTimeout(2000); await waitFor(element(by.label(label))).toBeVisible().withTimeout(10000); await element(by.id('sidebar-close-drawer')).tap(); -} +}; module.exports = { - navigateToWorkspace, - navigateToLogin, - navigateToRegister, - login, - logout, - mockMessage, - starMessage, - pinMessage, - dismissReviewNag, - tapBack, - sleep, - searchRoom, - tryTapping, - checkServer -}; \ No newline at end of file + navigateToWorkspace, + navigateToLogin, + navigateToRegister, + login, + logout, + mockMessage, + starMessage, + pinMessage, + dismissReviewNag, + tapBack, + sleep, + searchRoom, + tryTapping, + checkServer +}; diff --git a/e2e/helpers/data_setup.js b/e2e/helpers/data_setup.js index 7e744f54a..fd02a20c5 100644 --- a/e2e/helpers/data_setup.js +++ b/e2e/helpers/data_setup.js @@ -6,176 +6,174 @@ const TEAM_TYPE = { PRIVATE: 1 }; -let server = data.server +const { server } = data; const rocketchat = axios.create({ - baseURL: `${server}/api/v1/`, - headers: { - 'Content-Type': 'application/json;charset=UTF-8', - } -}) + baseURL: `${ server }/api/v1/`, + headers: { + 'Content-Type': 'application/json;charset=UTF-8' + } +}); -const login = async (username, password) => { - console.log(`Logging in as user ${username}`) - const response = await rocketchat.post('login', { - "user": username, - "password": password - }) - const userId = response.data.data.userId - const authToken = response.data.data.authToken - rocketchat.defaults.headers.common['X-User-Id'] = userId - rocketchat.defaults.headers.common['X-Auth-Token'] = authToken - return { authToken, userId }; -} +const login = async(username, password) => { + console.log(`Logging in as user ${ username }`); + const response = await rocketchat.post('login', { + user: username, + password + }); + const { userId } = response.data.data; + const { authToken } = response.data.data; + rocketchat.defaults.headers.common['X-User-Id'] = userId; + rocketchat.defaults.headers.common['X-Auth-Token'] = authToken; + return { authToken, userId }; +}; -const createUser = async (username, password, name, email) => { - console.log(`Creating user ${username}`) - try { - await rocketchat.post('users.create', { - "username": username, - "password": password, - "name": name, - "email": email - }) - } catch (error) { - console.log(JSON.stringify(error)) - throw "Failed to create user" - } -} +const createUser = async(username, password, name, email) => { + console.log(`Creating user ${ username }`); + try { + await rocketchat.post('users.create', { + username, + password, + name, + email + }); + } catch (error) { + console.log(JSON.stringify(error)); + throw new Error('Failed to create user'); + } +}; -const createChannelIfNotExists = async (channelname) => { - console.log(`Creating public channel ${channelname}`) - try { - const room = await rocketchat.post('channels.create', { - "name": channelname - }) - return room - } catch (createError) { - try { //Maybe it exists already? - const room = rocketchat.get(`channels.info?roomName=${channelname}`) - return room - } catch (infoError) { - console.log(JSON.stringify(createError)) - console.log(JSON.stringify(infoError)) - throw "Failed to find or create public channel" - } - } -} +const createChannelIfNotExists = async(channelname) => { + console.log(`Creating public channel ${ channelname }`); + try { + const room = await rocketchat.post('channels.create', { + name: channelname + }); + return room; + } catch (createError) { + try { // Maybe it exists already? + const room = rocketchat.get(`channels.info?roomName=${ channelname }`); + return room; + } catch (infoError) { + console.log(JSON.stringify(createError)); + console.log(JSON.stringify(infoError)); + throw new Error('Failed to find or create public channel'); + } + } +}; -const createTeamIfNotExists = async (teamname) => { - console.log(`Creating private team ${teamname}`) - try { - await rocketchat.post('teams.create', { - "name": teamname, - "type": TEAM_TYPE.PRIVATE - }) - } catch (createError) { - try { //Maybe it exists already? - await rocketchat.get(`teams.info?teamName=${teamname}`) - } catch (infoError) { - console.log(JSON.stringify(createError)) - console.log(JSON.stringify(infoError)) - throw "Failed to find or create private team" - } - } -} +const createTeamIfNotExists = async(teamname) => { + console.log(`Creating private team ${ teamname }`); + try { + await rocketchat.post('teams.create', { + name: teamname, + type: TEAM_TYPE.PRIVATE + }); + } catch (createError) { + try { // Maybe it exists already? + await rocketchat.get(`teams.info?teamName=${ teamname }`); + } catch (infoError) { + console.log(JSON.stringify(createError)); + console.log(JSON.stringify(infoError)); + throw new Error('Failed to find or create private team'); + } + } +}; -const createGroupIfNotExists = async (groupname) => { - console.log(`Creating private group ${groupname}`) - try { - await rocketchat.post('groups.create', { - "name": groupname - }) - } catch (createError) { - try { //Maybe it exists already? - await rocketchat.get(`groups.info?roomName=${groupname}`) - } catch (infoError) { - console.log(JSON.stringify(createError)) - console.log(JSON.stringify(infoError)) - throw "Failed to find or create private group" - } - } -} +const createGroupIfNotExists = async(groupname) => { + console.log(`Creating private group ${ groupname }`); + try { + await rocketchat.post('groups.create', { + name: groupname + }); + } catch (createError) { + try { // Maybe it exists already? + await rocketchat.get(`groups.info?roomName=${ groupname }`); + } catch (infoError) { + console.log(JSON.stringify(createError)); + console.log(JSON.stringify(infoError)); + throw new Error('Failed to find or create private group'); + } + } +}; -const changeChannelJoinCode = async (roomId, joinCode) => { - console.log(`Changing channel Join Code ${roomId}`) - try { - await rocketchat.post('method.call/saveRoomSettings', { - message: JSON.stringify({ - method: 'saveRoomSettings', - params: [ - roomId, - { joinCode } - ] - }) - }) - } catch (createError) { - console.log(JSON.stringify(createError)) - throw "Failed to create protected channel" - } -} +const changeChannelJoinCode = async(roomId, joinCode) => { + console.log(`Changing channel Join Code ${ roomId }`); + try { + await rocketchat.post('method.call/saveRoomSettings', { + message: JSON.stringify({ + method: 'saveRoomSettings', + params: [ + roomId, + { joinCode } + ] + }) + }); + } catch (createError) { + console.log(JSON.stringify(createError)); + throw new Error('Failed to create protected channel'); + } +}; -const sendMessage = async (user, channel, msg) => { - console.log(`Sending message to ${channel}`) - try { - await login(user.username, user.password); - await rocketchat.post('chat.postMessage', { channel, msg }); - } catch (infoError) { - console.log(JSON.stringify(infoError)) - throw "Failed to find or create private group" - } -} +const sendMessage = async(user, channel, msg) => { + console.log(`Sending message to ${ channel }`); + try { + await login(user.username, user.password); + await rocketchat.post('chat.postMessage', { channel, msg }); + } catch (infoError) { + console.log(JSON.stringify(infoError)); + throw new Error('Failed to find or create private group'); + } +}; -const setup = async () => { - await login(data.adminUser, data.adminPassword) - - for (var userKey in data.users) { - if (data.users.hasOwnProperty(userKey)) { - const user = data.users[userKey] - await createUser(user.username, user.password, user.username, user.email) - } - } +const setup = async() => { + await login(data.adminUser, data.adminPassword); - for (var channelKey in data.channels) { - if (data.channels.hasOwnProperty(channelKey)) { - const channel = data.channels[channelKey] - const { data: { channel: { _id } } } = await createChannelIfNotExists(channel.name) + for (const userKey in data.users) { + if (Object.prototype.hasOwnProperty.call(data.users, userKey)) { + const user = data.users[userKey]; + await createUser(user.username, user.password, user.username, user.email); + } + } - if (channel.joinCode) { - await changeChannelJoinCode(_id, channel.joinCode); - } - } - } + for (const channelKey in data.channels) { + if (Object.prototype.hasOwnProperty.call(data.channels, channelKey)) { + const channel = data.channels[channelKey]; + const { data: { channel: { _id } } } = await createChannelIfNotExists(channel.name); - await login(data.users.regular.username, data.users.regular.password) + if (channel.joinCode) { + await changeChannelJoinCode(_id, channel.joinCode); + } + } + } - for (var groupKey in data.groups) { - if (data.groups.hasOwnProperty(groupKey)) { - const group = data.groups[groupKey] - await createGroupIfNotExists(group.name) - } - } + await login(data.users.regular.username, data.users.regular.password); - for (var teamKey in data.teams) { - if (data.teams.hasOwnProperty(teamKey)) { - const team = data.teams[teamKey] - await createTeamIfNotExists(team.name) - } - } + for (const groupKey in data.groups) { + if (Object.prototype.hasOwnProperty.call(data.groups, groupKey)) { + const group = data.groups[groupKey]; + await createGroupIfNotExists(group.name); + } + } - return -} + for (const teamKey in data.teams) { + if (Object.prototype.hasOwnProperty.call(data.teams, teamKey)) { + const team = data.teams[teamKey]; + await createTeamIfNotExists(team.name); + } + } +}; const get = (endpoint) => { - console.log(`GET /${ endpoint }`) - return rocketchat.get(endpoint); -} + console.log(`GET /${ endpoint }`); + return rocketchat.get(endpoint); +}; const post = (endpoint, body) => { - console.log(`POST /${ endpoint } ${ JSON.stringify(body) }`) - return rocketchat.post(endpoint, body); -} + console.log(`POST /${ endpoint } ${ JSON.stringify(body) }`); + return rocketchat.post(endpoint, body); +}; module.exports = { - setup, sendMessage, get, post, login -} \ No newline at end of file + setup, sendMessage, get, post, login +}; diff --git a/e2e/helpers/random.js b/e2e/helpers/random.js index d26e832e3..d41575c07 100644 --- a/e2e/helpers/random.js +++ b/e2e/helpers/random.js @@ -6,4 +6,4 @@ function random(length) { } return text; } -module.exports = random; \ No newline at end of file +module.exports = random; diff --git a/e2e/tests/assorted/01-e2eencryption.spec.js b/e2e/tests/assorted/01-e2eencryption.spec.js index 423d96152..de5ccb225 100644 --- a/e2e/tests/assorted/01-e2eencryption.spec.js +++ b/e2e/tests/assorted/01-e2eencryption.spec.js @@ -1,12 +1,11 @@ const { - expect, element, by, waitFor -} = require('detox'); -const { navigateToLogin, login, sleep, tapBack, mockMessage, searchRoom, logout } = require('../../helpers/app'); + navigateToLogin, login, sleep, tapBack, mockMessage, searchRoom, logout +} = require('../../helpers/app'); const data = require('../../data'); -const testuser = data.users.regular -const otheruser = data.users.alternate +const testuser = data.users.regular; +const otheruser = data.users.alternate; const checkServer = async(server) => { const label = `Connected to ${ server }`; @@ -14,11 +13,11 @@ const checkServer = async(server) => { await waitFor(element(by.id('sidebar-view'))).toBeVisible().withTimeout(2000); await waitFor(element(by.label(label))).toBeVisible().withTimeout(60000); await element(by.id('sidebar-close-drawer')).tap(); -} +}; const checkBanner = async() => { await waitFor(element(by.id('listheader-encryption').withDescendant(by.label('Save Your Encryption Password')))).toBeVisible().withTimeout(10000); -} +}; async function navigateToRoom(roomName) { await searchRoom(`${ roomName }`); @@ -45,36 +44,36 @@ describe('E2E Encryption', () => { const room = `encrypted${ data.random }`; const newPassword = 'abc'; - before(async () => { + before(async() => { await device.launchApp({ permissions: { notifications: 'YES' }, delete: true }); await navigateToLogin(); await login(testuser.username, testuser.password); }); - describe('Banner', async() => { - describe('Render', async () => { - it('should have encryption badge', async () => { + describe('Banner', () => { + describe('Render', () => { + it('should have encryption badge', async() => { await checkBanner(); }); }); - - describe('Usage', async () => { + + describe('Usage', () => { it('should tap encryption badge and open save password modal', async() => { await element(by.id('listheader-encryption')).tap(); await waitFor(element(by.id('e2e-save-password-view'))).toBeVisible().withTimeout(2000); }); - + it('should tap "How it works" and navigate', async() => { await element(by.id('e2e-save-password-view-how-it-works').and(by.label('How It Works'))).tap(); await waitFor(element(by.id('e2e-how-it-works-view'))).toBeVisible().withTimeout(2000); await tapBack(); }); - + it('should tap "Save my password" and close modal', async() => { await element(by.id('e2e-save-password-view-saved-password').and(by.label('I Saved My E2E Password'))).tap(); await waitFor(element(by.id('rooms-list-view'))).toBeVisible().withTimeout(2000); }); - + it('should create encrypted room', async() => { await element(by.id('rooms-list-view-create-channel')).tap(); await waitFor(element(by.id('new-message-view'))).toBeVisible().withTimeout(2000); @@ -92,15 +91,15 @@ describe('E2E Encryption', () => { await waitFor(element(by.id('room-view'))).toBeVisible().withTimeout(60000); await waitFor(element(by.id(`room-view-title-${ room }`))).toBeVisible().withTimeout(60000); }); - + it('should send message and be able to read it', async() => { await mockMessage('message'); await tapBack(); }); }); - }) + }); - describe('Security and Privacy', async() => { + describe('Security and Privacy', () => { it('should navigate to security privacy', async() => { await waitFor(element(by.id('rooms-list-view'))).toBeVisible().withTimeout(2000); await element(by.id('rooms-list-view-sidebar')).tap(); @@ -120,7 +119,7 @@ describe('E2E Encryption', () => { }); }); - describe('E2E Encryption Security', async() => { + describe('E2E Encryption Security', () => { it('should navigate to e2e encryption security', async() => { await element(by.id('security-privacy-view-e2e-encryption')).tap(); await waitFor(element(by.id('e2e-encryption-security-view'))).toBeVisible().withTimeout(2000); @@ -133,9 +132,9 @@ describe('E2E Encryption', () => { await expect(element(by.id('e2e-encryption-security-view-change-password').and(by.label('Save Changes')))).toExist(); await expect(element(by.id('e2e-encryption-security-view-reset-key').and(by.label('Reset E2E Key')))).toExist(); }); - }) + }); - describe('Change password', async() => { + describe('Change password', () => { it('should change password', async() => { await element(by.id('e2e-encryption-security-view-password')).typeText(newPassword); await element(by.id('e2e-encryption-security-view-change-password')).tap(); @@ -184,7 +183,7 @@ describe('E2E Encryption', () => { }); }); - describe('Reset E2E key', async() => { + describe('Reset E2E key', () => { it('should reset e2e key', async() => { await tapBack(); await waitFor(element(by.id('rooms-list-view'))).toBeVisible().withTimeout(2000); @@ -195,7 +194,7 @@ describe('E2E Encryption', () => { await waitFor(element(by.text('Are you sure?'))).toExist().withTimeout(2000); await expect(element(by.text('You\'re going to be logged out.'))).toExist(); await element(by.label('Yes, reset it').and(by.type('UILabel'))).tap(); - await sleep(2000) + await sleep(2000); await waitFor(element(by.id('workspace-view'))).toBeVisible().withTimeout(10000); await waitFor(element(by.text('You\'ve been logged out by the server. Please log in again.'))).toExist().withTimeout(2000); await element(by.label('OK').and(by.type('_UIAlertControllerActionView'))).tap(); @@ -203,7 +202,7 @@ describe('E2E Encryption', () => { await waitFor(element(by.id('login-view'))).toBeVisible().withTimeout(2000); await login(testuser.username, testuser.password); await waitFor(element(by.id('listheader-encryption').withDescendant(by.label('Save Your Encryption Password')))).toBeVisible().withTimeout(2000); - }) + }); }); }); @@ -211,21 +210,21 @@ describe('E2E Encryption', () => { it('check save banner', async() => { await checkServer(data.server); await checkBanner(); - }) - + }); + it('should add server and create new user', async() => { await sleep(5000); await element(by.id('rooms-list-header-server-dropdown-button')).tap(); await waitFor(element(by.id('rooms-list-header-server-dropdown'))).toBeVisible().withTimeout(5000); await element(by.id('rooms-list-header-server-add')).tap(); - + // TODO: refactor await waitFor(element(by.id('new-server-view'))).toBeVisible().withTimeout(60000); - await element(by.id('new-server-view-input')).typeText(`${data.alternateServer}\n`); + await element(by.id('new-server-view-input')).typeText(`${ data.alternateServer }\n`); await waitFor(element(by.id('workspace-view'))).toBeVisible().withTimeout(60000); await element(by.id('workspace-view-register')).tap(); await waitFor(element(by.id('register-view'))).toBeVisible().withTimeout(2000); - + // Register new user await element(by.id('register-view-name')).replaceText(data.registeringUser.username); await element(by.id('register-view-username')).replaceText(data.registeringUser.username); @@ -233,10 +232,10 @@ describe('E2E Encryption', () => { await element(by.id('register-view-password')).typeText(data.registeringUser.password); await element(by.id('register-view-submit')).tap(); await waitFor(element(by.id('rooms-list-view'))).toBeVisible().withTimeout(60000); - + await checkServer(data.alternateServer); }); - + it('should change back', async() => { await element(by.id('rooms-list-header-server-dropdown-button')).tap(); await waitFor(element(by.id('rooms-list-header-server-dropdown'))).toBeVisible().withTimeout(5000); @@ -255,4 +254,4 @@ describe('E2E Encryption', () => { await checkBanner(); }); }); -}); \ No newline at end of file +}); diff --git a/e2e/tests/assorted/02-broadcast.spec.js b/e2e/tests/assorted/02-broadcast.spec.js index 059643c02..12350ee86 100644 --- a/e2e/tests/assorted/02-broadcast.spec.js +++ b/e2e/tests/assorted/02-broadcast.spec.js @@ -1,13 +1,13 @@ +// const OTP = require('otp.js'); +// const GA = OTP.googleAuthenticator; + const { - device, expect, element, by, waitFor -} = require('detox'); -const OTP = require('otp.js'); -const GA = OTP.googleAuthenticator; -const { navigateToLogin, login, mockMessage, tapBack, sleep, searchRoom } = require('../../helpers/app'); + navigateToLogin, login, mockMessage, tapBack, searchRoom +} = require('../../helpers/app'); const data = require('../../data'); -const testuser = data.users.regular -const otheruser = data.users.alternate +const testuser = data.users.regular; +const otheruser = data.users.alternate; describe('Broadcast room', () => { before(async() => { @@ -28,7 +28,7 @@ describe('Broadcast room', () => { await element(by.id('selected-users-view-submit')).tap(); await waitFor(element(by.id('create-channel-view'))).toExist().withTimeout(5000); await element(by.id('create-channel-name')).replaceText(`broadcast${ data.random }`); - await element(by.id('create-channel-broadcast')).longPress(); //https://github.com/facebook/react-native/issues/28032 + await element(by.id('create-channel-broadcast')).longPress(); // https://github.com/facebook/react-native/issues/28032 await element(by.id('create-channel-submit')).tap(); await waitFor(element(by.id('room-view'))).toBeVisible().withTimeout(60000); await waitFor(element(by.id(`room-view-title-broadcast${ data.random }`))).toBeVisible().withTimeout(60000); @@ -54,11 +54,11 @@ describe('Broadcast room', () => { await navigateToLogin(); await login(otheruser.username, otheruser.password); - //await waitFor(element(by.id('two-factor'))).toBeVisible().withTimeout(5000); - //await expect(element(by.id('two-factor'))).toBeVisible(); - //const code = GA.gen(data.alternateUserTOTPSecret); - //await element(by.id('two-factor-input')).replaceText(code); - //await element(by.id('two-factor-send')).tap(); + // await waitFor(element(by.id('two-factor'))).toBeVisible().withTimeout(5000); + // await expect(element(by.id('two-factor'))).toBeVisible(); + // const code = GA.gen(data.alternateUserTOTPSecret); + // await element(by.id('two-factor-input')).replaceText(code); + // await element(by.id('two-factor-send')).tap(); await searchRoom(`broadcast${ data.random }`); await element(by.id(`rooms-list-view-item-broadcast${ data.random }`)).tap(); diff --git a/e2e/tests/assorted/03-profile.spec.js b/e2e/tests/assorted/03-profile.spec.js index 86fc001db..b17485a3f 100644 --- a/e2e/tests/assorted/03-profile.spec.js +++ b/e2e/tests/assorted/03-profile.spec.js @@ -1,10 +1,7 @@ -const { - device, expect, element, by, waitFor -} = require('detox'); const { navigateToLogin, login, sleep } = require('../../helpers/app'); const data = require('../../data'); -const profileChangeUser = data.users.profileChanges +const profileChangeUser = data.users.profileChanges; const scrollDown = 200; @@ -28,7 +25,7 @@ describe('Profile screen', () => { await waitFor(element(by.id('profile-view'))).toBeVisible().withTimeout(2000); }); - describe('Render', async() => { + describe('Render', () => { it('should have profile view', async() => { await expect(element(by.id('profile-view'))).toBeVisible(); }); @@ -56,7 +53,7 @@ describe('Profile screen', () => { it('should have avatar url', async() => { await expect(element(by.id('profile-view-avatar-url'))).toExist(); }); - + it('should have reset avatar button', async() => { await waitFor(element(by.id('profile-view-reset-avatar'))).toExist().whileElement(by.id('profile-view-list')).scroll(scrollDown, 'down'); }); @@ -74,7 +71,7 @@ describe('Profile screen', () => { }); }); - describe('Usage', async() => { + describe('Usage', () => { it('should change name and username', async() => { await element(by.id('profile-view-name')).replaceText(`${ profileChangeUser.username }new`); await element(by.id('profile-view-username')).typeText(`${ profileChangeUser.username }new`); @@ -87,7 +84,7 @@ describe('Profile screen', () => { await element(by.id('profile-view-email')).replaceText(`mobile+profileChangesNew${ data.random }@rocket.chat`); await element(by.id('profile-view-new-password')).replaceText(`${ profileChangeUser.password }new`); await element(by.id('profile-view-submit')).tap(); - await element(by.type('_UIAlertControllerTextField')).typeText(`${ profileChangeUser.password }\n`) + await element(by.type('_UIAlertControllerTextField')).typeText(`${ profileChangeUser.password }\n`); await waitForToast(); }); diff --git a/e2e/tests/assorted/04-setting.spec.js b/e2e/tests/assorted/04-setting.spec.js index 14bdbe71f..edfb3fd40 100644 --- a/e2e/tests/assorted/04-setting.spec.js +++ b/e2e/tests/assorted/04-setting.spec.js @@ -1,11 +1,8 @@ -const { - device, expect, element, by, waitFor -} = require('detox'); -const { navigateToLogin, login, tapBack } = require('../../helpers/app'); +const { navigateToLogin, login } = require('../../helpers/app'); const data = require('../../data'); -const testuser = data.users.regular +const testuser = data.users.regular; describe('Settings screen', () => { before(async() => { @@ -20,7 +17,7 @@ describe('Settings screen', () => { await waitFor(element(by.id('settings-view'))).toBeVisible().withTimeout(2000); }); - describe('Render', async() => { + describe('Render', () => { it('should have settings view', async() => { await expect(element(by.id('settings-view'))).toBeVisible(); }); @@ -62,14 +59,14 @@ describe('Settings screen', () => { }); }); - describe('Usage', async() => { + describe('Usage', () => { it('should tap clear cache and navigate to roomslistview', async() => { await waitFor(element(by.id('settings-view'))).toBeVisible().withTimeout(2000); await element(by.id('settings-view-clear-cache')).tap(); await waitFor(element(by.text('This will clear all your offline data.'))).toExist().withTimeout(2000); - await element(by.label('Clear').and(by.type('_UIAlertControllerActionView'))).tap(); + await element(by.label('Clear').and(by.type('_UIAlertControllerActionView'))).tap(); await waitFor(element(by.id('rooms-list-view'))).toBeVisible().withTimeout(5000); await waitFor(element(by.id(`rooms-list-view-item-${ data.groups.private.name }`))).toExist().withTimeout(10000); - }) + }); }); }); diff --git a/e2e/tests/assorted/05-joinpublicroom.spec.js b/e2e/tests/assorted/05-joinpublicroom.spec.js index 15acbda9c..afeff4f76 100644 --- a/e2e/tests/assorted/05-joinpublicroom.spec.js +++ b/e2e/tests/assorted/05-joinpublicroom.spec.js @@ -1,10 +1,9 @@ -const { - device, expect, element, by, waitFor -} = require('detox'); const data = require('../../data'); -const { navigateToLogin, login, mockMessage, tapBack, sleep, searchRoom } = require('../../helpers/app'); +const { + navigateToLogin, login, mockMessage, tapBack, searchRoom +} = require('../../helpers/app'); -const testuser = data.users.regular +const testuser = data.users.regular; const room = data.channels.detoxpublic.name; async function navigateToRoom() { @@ -26,7 +25,7 @@ describe('Join public room', () => { await navigateToRoom(); }); - describe('Render', async() => { + describe('Render', () => { it('should have room screen', async() => { await expect(element(by.id('room-view'))).toBeVisible(); }); @@ -36,14 +35,14 @@ describe('Join public room', () => { // }); // Render - Header - describe('Header', async() => { + describe('Header', () => { it('should have actions button ', async() => { await expect(element(by.id('room-header'))).toBeVisible(); }); }); // Render - Join - describe('Join', async() => { + describe('Join', () => { it('should have join', async() => { await expect(element(by.id('room-view-join'))).toBeVisible(); }); @@ -61,7 +60,7 @@ describe('Join public room', () => { }); }); - describe('Room Actions', async() => { + describe('Room Actions', () => { before(async() => { await navigateToRoomActions(); }); @@ -117,11 +116,11 @@ describe('Join public room', () => { after(async() => { await tapBack(); await waitFor(element(by.id('room-view'))).toBeVisible().withTimeout(2000); - }) + }); }); }); - describe('Usage', async() => { + describe('Usage', () => { it('should join room', async() => { await element(by.id('room-view-join-button')).tap(); await tapBack(); diff --git a/e2e/tests/assorted/06-status.spec.js b/e2e/tests/assorted/06-status.spec.js index 52c6f9b98..7eeb246b1 100644 --- a/e2e/tests/assorted/06-status.spec.js +++ b/e2e/tests/assorted/06-status.spec.js @@ -1,17 +1,15 @@ -const { - expect, element, by, waitFor -} = require('detox'); const { navigateToLogin, login, sleep } = require('../../helpers/app'); const data = require('../../data'); -const testuser = data.users.regular + +const testuser = data.users.regular; async function waitForToast() { await sleep(300); } describe('Status screen', () => { - before(async () => { + before(async() => { await device.launchApp({ permissions: { notifications: 'YES' }, delete: true }); await navigateToLogin(); await login(testuser.username, testuser.password); @@ -24,8 +22,8 @@ describe('Status screen', () => { await waitFor(element(by.id('status-view'))).toBeVisible().withTimeout(2000); }); - describe('Render', async () => { - it('should have status input', async () => { + describe('Render', () => { + it('should have status input', async() => { await expect(element(by.id('status-view-input'))).toBeVisible(); await expect(element(by.id('status-view-online'))).toExist(); await expect(element(by.id('status-view-busy'))).toExist(); @@ -34,17 +32,17 @@ describe('Status screen', () => { }); }); - describe('Usage', async () => { - it('should change status', async () => { + describe('Usage', () => { + it('should change status', async() => { await element(by.id('status-view-busy')).tap(); await waitFor(element(by.id('status-view-current-busy'))).toExist().withTimeout(2000); }); - it('should change status text', async () => { + it('should change status text', async() => { await element(by.id('status-view-input')).typeText('status-text-new'); await element(by.id('status-view-submit')).tap(); await waitForToast(); await waitFor(element(by.label('status-text-new').withAncestor(by.id('sidebar-custom-status')))).toExist().withTimeout(2000); }); }); -}); \ No newline at end of file +}); diff --git a/e2e/tests/assorted/07-changeserver.spec.js b/e2e/tests/assorted/07-changeserver.spec.js index 06ac7c36a..4ed0d6b58 100644 --- a/e2e/tests/assorted/07-changeserver.spec.js +++ b/e2e/tests/assorted/07-changeserver.spec.js @@ -1,6 +1,3 @@ -const { - device, expect, element, by, waitFor -} = require('detox'); const data = require('../../data'); const { navigateToLogin, login, checkServer } = require('../../helpers/app'); @@ -8,7 +5,7 @@ const reopenAndCheckServer = async(server) => { await device.launchApp({ permissions: { notifications: 'YES' } }); await waitFor(element(by.id('rooms-list-view'))).toBeVisible().withTimeout(6000); await checkServer(server); -} +}; describe('Change server', () => { before(async() => { @@ -24,7 +21,7 @@ describe('Change server', () => { await element(by.id('rooms-list-header-server-add')).tap(); await waitFor(element(by.id('new-server-view'))).toBeVisible().withTimeout(6000); - await element(by.id('new-server-view-input')).typeText(`${data.alternateServer}\n`); + await element(by.id('new-server-view-input')).typeText(`${ data.alternateServer }\n`); await waitFor(element(by.id('workspace-view'))).toBeVisible().withTimeout(10000); await reopenAndCheckServer(data.server); }); @@ -64,5 +61,5 @@ describe('Change server', () => { it('should reopen the app and show main server', async() => { await reopenAndCheckServer(data.server); - }) + }); }); diff --git a/e2e/tests/assorted/08-joinprotectedroom.spec.js b/e2e/tests/assorted/08-joinprotectedroom.spec.js index 9101a9659..f10d7bc5f 100644 --- a/e2e/tests/assorted/08-joinprotectedroom.spec.js +++ b/e2e/tests/assorted/08-joinprotectedroom.spec.js @@ -1,12 +1,11 @@ -const { - device, expect, element, by, waitFor -} = require('detox'); const data = require('../../data'); -const { navigateToLogin, login, mockMessage, tapBack, sleep, searchRoom } = require('../../helpers/app'); +const { + navigateToLogin, login, mockMessage, searchRoom +} = require('../../helpers/app'); -const testuser = data.users.regular -const room = data.channels.detoxpublicprotected.name -const joinCode = data.channels.detoxpublicprotected.joinCode +const testuser = data.users.regular; +const room = data.channels.detoxpublicprotected.name; +const { joinCode } = data.channels.detoxpublicprotected; async function navigateToRoom() { await searchRoom(room); @@ -27,10 +26,10 @@ describe('Join protected room', () => { await navigateToRoom(); }); - describe('Usage', async() => { + describe('Usage', () => { it('should tap join and ask for join code', async() => { await openJoinCode(); - }) + }); it('should cancel join room', async() => { await element(by.id('join-code-cancel')).tap(); diff --git a/e2e/tests/assorted/09-joinfromdirectory.spec.js b/e2e/tests/assorted/09-joinfromdirectory.spec.js index 039ef823c..e04faabf4 100644 --- a/e2e/tests/assorted/09-joinfromdirectory.spec.js +++ b/e2e/tests/assorted/09-joinfromdirectory.spec.js @@ -1,13 +1,12 @@ -const { - device, expect, element, by, waitFor -} = require('detox'); const data = require('../../data'); -const { navigateToLogin, login, tapBack, sleep } = require('../../helpers/app'); +const { + navigateToLogin, login, tapBack, sleep +} = require('../../helpers/app'); -const testuser = data.users.regular +const testuser = data.users.regular; async function navigateToRoom(search) { - await element(by.id('directory-view-search')).replaceText(search); + await element(by.id('directory-view-search')).replaceText(search); await waitFor(element(by.id(`directory-view-item-${ search }`))).toBeVisible().withTimeout(10000); await sleep(300); // app takes some time to animate await element(by.id(`directory-view-item-${ search }`)).tap(); @@ -22,34 +21,34 @@ describe('Join room from directory', () => { await login(testuser.username, testuser.password); }); - describe('Usage', async() => { + describe('Usage', () => { it('should tap directory', async() => { - await element(by.id('rooms-list-view-directory')).tap(); + await element(by.id('rooms-list-view-directory')).tap(); await waitFor(element(by.id('directory-view'))).toExist().withTimeout(2000); - }) + }); it('should search public channel and navigate', async() => { await navigateToRoom(data.channels.detoxpublic.name); - }) - - it('should search user and navigate', async() => { - await tapBack(); - await element(by.id('rooms-list-view-directory')).tap(); - await waitFor(element(by.id('directory-view'))).toExist().withTimeout(2000); - await element(by.id('directory-view-dropdown')).tap(); - await element(by.label('Users')).tap(); - await element(by.label('Search by')).tap(); - await navigateToRoom(data.users.alternate.username); - }) + }); it('should search user and navigate', async() => { await tapBack(); await element(by.id('rooms-list-view-directory')).tap(); await waitFor(element(by.id('directory-view'))).toExist().withTimeout(2000); - await element(by.id('directory-view-dropdown')).tap(); + await element(by.id('directory-view-dropdown')).tap(); + await element(by.label('Users')).tap(); + await element(by.label('Search by')).tap(); + await navigateToRoom(data.users.alternate.username); + }); + + it('should search user and navigate', async() => { + await tapBack(); + await element(by.id('rooms-list-view-directory')).tap(); + await waitFor(element(by.id('directory-view'))).toExist().withTimeout(2000); + await element(by.id('directory-view-dropdown')).tap(); await element(by.label('Teams')).tap(); - await element(by.label('Search by')).tap(); + await element(by.label('Search by')).tap(); await navigateToRoom(data.teams.private.name); - }) + }); }); }); diff --git a/e2e/tests/assorted/10-deleteserver.spec.js b/e2e/tests/assorted/10-deleteserver.spec.js index 8e260fd70..d92d3c442 100644 --- a/e2e/tests/assorted/10-deleteserver.spec.js +++ b/e2e/tests/assorted/10-deleteserver.spec.js @@ -1,8 +1,7 @@ -const { - device, element, by, waitFor -} = require('detox'); const data = require('../../data'); -const { sleep, navigateToLogin, login, checkServer } = require('../../helpers/app'); +const { + sleep, navigateToLogin, login, checkServer +} = require('../../helpers/app'); describe('Delete server', () => { before(async() => { @@ -13,7 +12,7 @@ describe('Delete server', () => { it('should be logged in main server', async() => { await checkServer(data.server); - }) + }); it('should add server', async() => { await sleep(5000); @@ -22,7 +21,7 @@ describe('Delete server', () => { await element(by.id('rooms-list-header-server-add')).tap(); await waitFor(element(by.id('new-server-view'))).toBeVisible().withTimeout(10000); - await element(by.id('new-server-view-input')).typeText(`${data.alternateServer}\n`); + await element(by.id('new-server-view-input')).typeText(`${ data.alternateServer }\n`); await waitFor(element(by.id('workspace-view'))).toBeVisible().withTimeout(10000); await element(by.id('workspace-view-register')).tap(); await waitFor(element(by.id('register-view'))).toBeVisible().withTimeout(2000); @@ -42,7 +41,7 @@ describe('Delete server', () => { await element(by.id('rooms-list-header-server-dropdown-button')).tap(); await waitFor(element(by.id('rooms-list-header-server-dropdown'))).toBeVisible().withTimeout(5000); await element(by.id(`rooms-list-header-server-${ data.server }`)).longPress(1500); - await element(by.label('Delete').and(by.type('_UIAlertControllerActionView'))).tap(); + await element(by.label('Delete').and(by.type('_UIAlertControllerActionView'))).tap(); await element(by.id('rooms-list-header-server-dropdown-button')).tap(); await waitFor(element(by.id('rooms-list-header-server-dropdown'))).toBeVisible().withTimeout(5000); await waitFor(element(by.id(`rooms-list-header-server-${ data.server }`))).toBeNotVisible().withTimeout(10000); diff --git a/e2e/tests/assorted/11-deeplinking.spec.js b/e2e/tests/assorted/11-deeplinking.spec.js index c40cff7bf..8a30be0a9 100644 --- a/e2e/tests/assorted/11-deeplinking.spec.js +++ b/e2e/tests/assorted/11-deeplinking.spec.js @@ -1,13 +1,10 @@ -const { - device, element, by, waitFor -} = require('detox'); const data = require('../../data'); const { tapBack, checkServer, navigateToRegister } = require('../../helpers/app'); -const { post, get, login } = require('../../helpers/data_setup'); +const { get, login } = require('../../helpers/data_setup'); const DEEPLINK_METHODS = { AUTH: 'auth', ROOM: 'room' }; const getDeepLink = (method, server, params) => { - const deeplink = `rocketchat://${ method }?host=${ server.replace(/^(http:\/\/|https:\/\/)/, '') }&${params}`; + const deeplink = `rocketchat://${ method }?host=${ server.replace(/^(http:\/\/|https:\/\/)/, '') }&${ params }`; console.log(`Deeplinking to: ${ deeplink }`); return deeplink; }; @@ -43,7 +40,7 @@ describe('Deep linking', () => { await waitFor(element(by.id('rooms-list-view'))).toBeVisible().withTimeout(10000); await checkServer(data.server); await waitFor(element(by.id(`rooms-list-view-item-${ data.groups.private.name }`))).toBeVisible().withTimeout(2000); - } + }; it('should authenticate and navigate', async() => { await authAndNavigate(); @@ -63,7 +60,7 @@ describe('Deep linking', () => { }); describe('Room', () => { - describe('While logged in', async() => { + describe('While logged in', () => { it('should navigate to the room using path', async() => { await device.launchApp({ permissions: { notifications: 'YES' }, @@ -75,7 +72,7 @@ describe('Deep linking', () => { }); it('should navigate to the room using rid', async() => { - const roomResult = await get(`groups.info?roomName=${ data.groups.private.name }`) + const roomResult = await get(`groups.info?roomName=${ data.groups.private.name }`); await device.launchApp({ permissions: { notifications: 'YES' }, newInstance: true, @@ -87,7 +84,7 @@ describe('Deep linking', () => { }); }); - describe('Others', async() => { + describe('Others', () => { it('should change server', async() => { await waitFor(element(by.id('rooms-list-view'))).toBeVisible().withTimeout(2000); await element(by.id('rooms-list-header-server-dropdown-button')).tap(); diff --git a/e2e/tests/assorted/12-i18n.spec.js b/e2e/tests/assorted/12-i18n.spec.js index 51273fd72..1c4a6a9d5 100644 --- a/e2e/tests/assorted/12-i18n.spec.js +++ b/e2e/tests/assorted/12-i18n.spec.js @@ -1,11 +1,9 @@ -const { - device, element, by, waitFor -} = require('detox'); const { navigateToLogin, login, sleep } = require('../../helpers/app'); const { post } = require('../../helpers/data_setup'); const data = require('../../data'); -const testuser = data.users.regular + +const testuser = data.users.regular; const defaultLaunchArgs = { permissions: { notifications: 'YES' } }; const navToLanguage = async() => { @@ -25,8 +23,8 @@ describe('i18n', () => { await device.launchApp({ ...defaultLaunchArgs, languageAndLocale: { - language: "en", - locale: "en" + language: 'en', + locale: 'en' }, delete: true }); @@ -34,20 +32,20 @@ describe('i18n', () => { await expect(element(by.id('join-workspace').and(by.label('Join a workspace')))).toBeVisible(); await expect(element(by.id('create-workspace-button').and(by.label('Create a new workspace')))).toBeVisible(); }); - + it('OS set to unavailable language and fallback to \'en\'', async() => { await device.launchApp({ ...defaultLaunchArgs, languageAndLocale: { - language: "es-MX", - locale: "es-MX" + language: 'es-MX', + locale: 'es-MX' } }); await waitFor(element(by.id('onboarding-view'))).toBeVisible().withTimeout(20000); await expect(element(by.id('join-workspace').and(by.label('Join a workspace')))).toBeVisible(); await expect(element(by.id('create-workspace-button').and(by.label('Create a new workspace')))).toBeVisible(); }); - + /** * This test might become outdated as soon as we support the language * Although this seems to be a bad approach, that's the intention for having fallback enabled @@ -110,5 +108,5 @@ describe('i18n', () => { await expect(element(by.id('sidebar-settings').withDescendant(by.label('Settings')))).toBeVisible(); await post('users.setPreferences', { data: { language: 'en' } }); // Set back to english }); - }) -}); \ No newline at end of file + }); +}); diff --git a/e2e/tests/init.js b/e2e/tests/init.js index 18ad98327..b1e08a2bd 100644 --- a/e2e/tests/init.js +++ b/e2e/tests/init.js @@ -1,13 +1,13 @@ const detox = require('detox'); -const config = require('../../package.json').detox; -const { setup } = require('../helpers/data_setup') const adapter = require('detox/runners/mocha/adapter'); +const config = require('../../package.json').detox; +const { setup } = require('../helpers/data_setup'); before(async() => { - await Promise.all([setup(), detox.init(config, { launchApp: false })]) - //await dataSetup() - //await detox.init(config, { launchApp: false }); - //await device.launchApp({ permissions: { notifications: 'YES' } }); + await Promise.all([setup(), detox.init(config, { launchApp: false })]); + // await dataSetup() + // await detox.init(config, { launchApp: false }); + // await device.launchApp({ permissions: { notifications: 'YES' } }); }); beforeEach(async function() { diff --git a/e2e/tests/onboarding/01-onboarding.spec.js b/e2e/tests/onboarding/01-onboarding.spec.js index e38a83764..a8cad8991 100644 --- a/e2e/tests/onboarding/01-onboarding.spec.js +++ b/e2e/tests/onboarding/01-onboarding.spec.js @@ -1,6 +1,3 @@ -const { - device, expect, element, by, waitFor -} = require('detox'); const data = require('../../data'); describe('Onboarding', () => { @@ -12,10 +9,10 @@ describe('Onboarding', () => { describe('Render', () => { it('should have onboarding screen', async() => { await expect(element(by.id('onboarding-view'))).toBeVisible(); - }); + }); it('should have "Join a workspace"', async() => { - await expect(element(by.id('join-workspace'))).toBeVisible(); + await expect(element(by.id('join-workspace'))).toBeVisible(); }); it('should have "Create a new workspace"', async() => { @@ -27,7 +24,7 @@ describe('Onboarding', () => { // it('should navigate to create new workspace', async() => { // // webviews are not supported by detox: https://github.com/wix/detox/issues/136#issuecomment-306591554 // }); - + it('should navigate to join a workspace', async() => { await element(by.id('join-workspace')).tap(); await waitFor(element(by.id('new-server-view'))).toBeVisible().withTimeout(60000); @@ -50,7 +47,7 @@ describe('Onboarding', () => { await waitFor(element(by.id('onboarding-view'))).toBeVisible().withTimeout(2000); await element(by.id('join-workspace')).tap(); await waitFor(element(by.id('new-server-view'))).toBeVisible().withTimeout(60000); - await element(by.id('new-server-view-input')).typeText(`${data.server}\n`); + await element(by.id('new-server-view-input')).typeText(`${ data.server }\n`); await waitFor(element(by.id('workspace-view'))).toBeVisible().withTimeout(60000); }); }); diff --git a/e2e/tests/onboarding/02-legal.spec.js b/e2e/tests/onboarding/02-legal.spec.js index 191e0647c..4ac96d985 100644 --- a/e2e/tests/onboarding/02-legal.spec.js +++ b/e2e/tests/onboarding/02-legal.spec.js @@ -1,24 +1,20 @@ -const { - device, expect, element, by, waitFor -} = require('detox'); const { navigateToRegister, navigateToLogin } = require('../../helpers/app'); describe('Legal screen', () => { - describe('From Login', () => { before(async() => { await device.launchApp({ permissions: { notifications: 'YES' }, delete: true }); await navigateToLogin(); }); - - it('should have legal button on login', async() => { + + it('should have legal button on login', async() => { await waitFor(element(by.id('login-view-more'))).toBeVisible().withTimeout(60000); }); - + it('should navigate to legal from login', async() => { await expect(element(by.id('login-view-more'))).toBeVisible(); await element(by.id('login-view-more')).tap(); - await waitFor(element(by.id('legal-view'))).toBeVisible().withTimeout(4000) + await waitFor(element(by.id('legal-view'))).toBeVisible().withTimeout(4000); }); }); @@ -28,32 +24,32 @@ describe('Legal screen', () => { await navigateToRegister(); }); - it('should have legal button on register', async() => { + it('should have legal button on register', async() => { await waitFor(element(by.id('register-view-more'))).toBeVisible().withTimeout(60000); }); - + it('should navigate to legal from register', async() => { await expect(element(by.id('register-view-more'))).toBeVisible(); await element(by.id('register-view-more')).tap(); await waitFor(element(by.id('legal-view'))).toBeVisible().withTimeout(4000); }); - + it('should have terms of service button', async() => { await expect(element(by.id('legal-terms-button'))).toBeVisible(); }); - + it('should have privacy policy button', async() => { await expect(element(by.id('legal-privacy-button'))).toBeVisible(); }); // We can't simulate how webview behaves, so I had to disable :( - /* + /* it('should navigate to terms', async() => { await element(by.id('legal-terms-button')).tap(); await waitFor(element(by.id('terms-view'))).toBeVisible().withTimeout(2000); await expect(element(by.id('terms-view'))).toBeVisible(); }); - + it('should navigate to privacy', async() => { await tapBack(); await element(by.id('legal-privacy-button')).tap(); diff --git a/e2e/tests/onboarding/03-forgotpassword.spec.js b/e2e/tests/onboarding/03-forgotpassword.spec.js index 03afe5925..d53690d6f 100644 --- a/e2e/tests/onboarding/03-forgotpassword.spec.js +++ b/e2e/tests/onboarding/03-forgotpassword.spec.js @@ -1,6 +1,3 @@ -const { - device, expect, element, by, waitFor -} = require('detox'); const data = require('../../data'); const { navigateToLogin } = require('../../helpers/app'); @@ -12,7 +9,7 @@ describe('Forgot password screen', () => { await waitFor(element(by.id('forgot-password-view'))).toExist().withTimeout(2000); }); - describe('Render', async() => { + describe('Render', () => { it('should have forgot password screen', async() => { await expect(element(by.id('forgot-password-view'))).toExist(); }); @@ -26,7 +23,7 @@ describe('Forgot password screen', () => { }); }); - describe('Usage', async() => { + describe('Usage', () => { it('should reset password and navigate to login', async() => { await element(by.id('forgot-password-view-email')).replaceText(data.users.existing.email); await element(by.id('forgot-password-view-submit')).tap(); diff --git a/e2e/tests/onboarding/04-createuser.spec.js b/e2e/tests/onboarding/04-createuser.spec.js index cf706d78b..e88e9eab3 100644 --- a/e2e/tests/onboarding/04-createuser.spec.js +++ b/e2e/tests/onboarding/04-createuser.spec.js @@ -1,7 +1,4 @@ -const { - device, expect, element, by, waitFor -} = require('detox'); -const { navigateToRegister, sleep } = require('../../helpers/app'); +const { navigateToRegister } = require('../../helpers/app'); const data = require('../../data'); describe('Create user screen', () => { @@ -37,7 +34,6 @@ describe('Create user screen', () => { }); describe('Usage', () => { - // FIXME: Detox isn't able to check if it's tappable: https://github.com/wix/Detox/issues/246 // it('should submit invalid email and do nothing', async() => { // const invalidEmail = 'invalidemail'; diff --git a/e2e/tests/onboarding/05-login.spec.js b/e2e/tests/onboarding/05-login.spec.js index 7c6b4853c..91cb91737 100644 --- a/e2e/tests/onboarding/05-login.spec.js +++ b/e2e/tests/onboarding/05-login.spec.js @@ -1,7 +1,4 @@ -const { - expect, element, by, waitFor -} = require('detox'); -const { navigateToLogin, tapBack, sleep } = require('../../helpers/app'); +const { navigateToLogin, tapBack } = require('../../helpers/app'); const data = require('../../data'); describe('Login screen', () => { @@ -46,13 +43,13 @@ describe('Login screen', () => { await waitFor(element(by.id('register-view'))).toBeVisible().withTimeout(2000); await tapBack(); }); - + it('should navigate to forgot password', async() => { await element(by.id('login-view-forgot-password')).tap(); await waitFor(element(by.id('forgot-password-view'))).toExist().withTimeout(2000); await tapBack(); }); - + it('should insert wrong password and get error', async() => { await element(by.id('login-view-email')).replaceText(data.users.regular.username); await element(by.id('login-view-password')).replaceText('NotMyActualPassword'); @@ -60,7 +57,7 @@ describe('Login screen', () => { await waitFor(element(by.text('Your credentials were rejected! Please try again.'))).toBeVisible().withTimeout(10000); await element(by.text('OK')).tap(); }); - + it('should login with success', async() => { await element(by.id('login-view-password')).replaceText(data.users.regular.password); await element(by.id('login-view-submit')).tap(); diff --git a/e2e/tests/onboarding/06-roomslist.spec.js b/e2e/tests/onboarding/06-roomslist.spec.js index ea6dc06c1..03e595edf 100644 --- a/e2e/tests/onboarding/06-roomslist.spec.js +++ b/e2e/tests/onboarding/06-roomslist.spec.js @@ -1,15 +1,13 @@ const { - device, expect, element, by, waitFor -} = require('detox'); -const { login, navigateToLogin, logout, tapBack, sleep, searchRoom } = require('../../helpers/app'); + login, navigateToLogin, logout, tapBack, searchRoom +} = require('../../helpers/app'); const data = require('../../data'); describe('Rooms list screen', () => { - before(async() => { await device.launchApp({ permissions: { notifications: 'YES' }, newInstance: true, delete: true }); await navigateToLogin(); - await login(data.users.regular.username, data.users.regular.password) + await login(data.users.regular.username, data.users.regular.password); }); describe('Render', () => { @@ -20,13 +18,13 @@ describe('Rooms list screen', () => { it('should have room item', async() => { await expect(element(by.id('rooms-list-view-item-general'))).toExist(); }); - + // Render - Header describe('Header', () => { it('should have create channel button', async() => { await expect(element(by.id('rooms-list-view-create-channel'))).toBeVisible(); }); - + it('should have sidebar button', async() => { await expect(element(by.id('rooms-list-view-sidebar'))).toBeVisible(); }); diff --git a/e2e/tests/onboarding/07-server-history.spec.js b/e2e/tests/onboarding/07-server-history.spec.js index fc1d6af9c..b984b9c8b 100644 --- a/e2e/tests/onboarding/07-server-history.spec.js +++ b/e2e/tests/onboarding/07-server-history.spec.js @@ -1,7 +1,6 @@ const { - device, expect, element, by, waitFor -} = require('detox'); -const { login, navigateToLogin, logout, tapBack } = require('../../helpers/app'); + login, navigateToLogin, logout, tapBack +} = require('../../helpers/app'); const data = require('../../data'); describe('Server history', () => { @@ -16,7 +15,7 @@ describe('Server history', () => { await logout(); await element(by.id('join-workspace')).tap(); await waitFor(element(by.id('new-server-view'))).toBeVisible().withTimeout(60000); - }) + }); it('should show servers history', async() => { await element(by.id('new-server-view-input')).tap(); diff --git a/e2e/tests/room/01-createroom.spec.js b/e2e/tests/room/01-createroom.spec.js index 874255e43..bc67b2c3e 100644 --- a/e2e/tests/room/01-createroom.spec.js +++ b/e2e/tests/room/01-createroom.spec.js @@ -1,10 +1,7 @@ -const { - device, expect, element, by, waitFor -} = require('detox'); const data = require('../../data'); -const { tapBack, sleep, navigateToLogin, login, tryTapping } = require('../../helpers/app'); - - +const { + tapBack, navigateToLogin, login, tryTapping +} = require('../../helpers/app'); describe('Create room screen', () => { before(async() => { @@ -13,30 +10,30 @@ describe('Create room screen', () => { await login(data.users.regular.username, data.users.regular.password); }); - describe('New Message', async() => { + describe('New Message', () => { before(async() => { await element(by.id('rooms-list-view-create-channel')).tap(); }); - describe('Render', async() => { + describe('Render', () => { it('should have new message screen', async() => { await waitFor(element(by.id('new-message-view'))).toBeVisible().withTimeout(2000); }); - + it('should have search input', async() => { await waitFor(element(by.id('new-message-view-search'))).toBeVisible().withTimeout(2000); }); - }) + }); - describe('Usage', async() => { + describe('Usage', () => { it('should back to rooms list', async() => { await waitFor(element(by.id('new-message-view-close'))).toBeVisible().withTimeout(5000); await element(by.id('new-message-view-close')).tap(); await waitFor(element(by.id('rooms-list-view'))).toBeVisible().withTimeout(5000); - + await tryTapping(element(by.id('rooms-list-view-create-channel')), 3000); - //await element(by.id('rooms-list-view-create-channel')).tap(); + // await element(by.id('rooms-list-view-create-channel')).tap(); await waitFor(element(by.id('new-message-view'))).toExist().withTimeout(5000); }); @@ -56,13 +53,13 @@ describe('Create room screen', () => { await element(by.id('new-message-view-create-channel')).tap(); await waitFor(element(by.id('select-users-view'))).toExist().withTimeout(5000); }); - }) + }); }); - describe('Select Users', async() => { + describe('Select Users', () => { it('should search users', async() => { await element(by.id('select-users-view-search')).replaceText('rocket.cat'); - await waitFor(element(by.id(`select-users-view-item-rocket.cat`))).toBeVisible().withTimeout(10000); + await waitFor(element(by.id('select-users-view-item-rocket.cat'))).toBeVisible().withTimeout(10000); }); it('should select/unselect user', async() => { @@ -80,27 +77,27 @@ describe('Create room screen', () => { await element(by.id('selected-users-view-submit')).tap(); await waitFor(element(by.id('create-channel-view'))).toExist().withTimeout(10000); }); - }) + }); - describe('Create Channel', async() => { - describe('Render', async() => { + describe('Create Channel', () => { + describe('Render', () => { it('should render all fields', async() => { await expect(element(by.id('create-channel-name'))).toBeVisible(); await expect(element(by.id('create-channel-type'))).toBeVisible(); await expect(element(by.id('create-channel-readonly'))).toBeVisible(); await expect(element(by.id('create-channel-broadcast'))).toBeVisible(); - }) - }) + }); + }); - describe('Usage', async() => { + describe('Usage', () => { it('should get invalid room', async() => { await element(by.id('create-channel-name')).typeText('general'); await element(by.id('create-channel-submit')).tap(); - await waitFor(element(by.text(`A channel with name general exists`))).toExist().withTimeout(60000); - await expect(element(by.text(`A channel with name general exists`))).toExist(); + await waitFor(element(by.text('A channel with name general exists'))).toExist().withTimeout(60000); + await expect(element(by.text('A channel with name general exists'))).toExist(); await element(by.text('OK')).tap(); }); - + it('should create public room', async() => { const room = `public${ data.random }`; await element(by.id('create-channel-name')).replaceText(''); @@ -116,7 +113,7 @@ describe('Create room screen', () => { await waitFor(element(by.id(`rooms-list-view-item-${ room }`))).toExist().withTimeout(6000); await expect(element(by.id(`rooms-list-view-item-${ room }`))).toExist(); }); - + it('should create private room', async() => { const room = `private${ data.random }`; await waitFor(element(by.id('rooms-list-view'))).toExist().withTimeout(5000); @@ -161,6 +158,6 @@ describe('Create room screen', () => { await waitFor(element(by.id(`rooms-list-view-item-${ room }`))).toExist().withTimeout(60000); await expect(element(by.id(`rooms-list-view-item-${ room }`))).toExist(); }); - }) + }); }); }); diff --git a/e2e/tests/room/02-room.spec.js b/e2e/tests/room/02-room.spec.js index d6a374185..4e1711e64 100644 --- a/e2e/tests/room/02-room.spec.js +++ b/e2e/tests/room/02-room.spec.js @@ -1,8 +1,7 @@ -const { - device, expect, element, by, waitFor -} = require('detox'); const data = require('../../data'); -const { navigateToLogin, login, mockMessage, tapBack, sleep, searchRoom, starMessage, pinMessage, dismissReviewNag, tryTapping, logout } = require('../../helpers/app'); +const { + navigateToLogin, login, mockMessage, tapBack, sleep, searchRoom, starMessage, pinMessage, dismissReviewNag, tryTapping +} = require('../../helpers/app'); async function navigateToRoom(roomName) { await searchRoom(`${ roomName }`); @@ -20,14 +19,14 @@ describe('Room screen', () => { await navigateToRoom(mainRoom); }); - describe('Render', async() => { + describe('Render', () => { it('should have room screen', async() => { await expect(element(by.id('room-view'))).toExist(); await waitFor(element(by.id(`room-view-title-${ mainRoom }`))).toExist().withTimeout(5000); }); // Render - Header - describe('Header', async() => { + describe('Header', () => { it('should have actions button ', async() => { await expect(element(by.id('room-header'))).toExist(); }); @@ -38,7 +37,7 @@ describe('Room screen', () => { }); // Render - Messagebox - describe('Messagebox', async() => { + describe('Messagebox', () => { it('should have messagebox', async() => { await expect(element(by.id('messagebox'))).toExist(); }); @@ -63,15 +62,15 @@ describe('Room screen', () => { }); }); - describe('Usage', async() => { - describe('Messagebox', async() => { + describe('Usage', () => { + describe('Messagebox', () => { it('should send message', async() => { - await mockMessage('message') + await mockMessage('message'); await expect(element(by.label(`${ data.random }message`)).atIndex(0)).toExist(); }); - it('should show/hide emoji keyboard', async () => { + it('should show/hide emoji keyboard', async() => { if (device.getPlatform() === 'android') { await element(by.id('messagebox-open-emoji')).tap(); await waitFor(element(by.id('messagebox-keyboard-emoji'))).toExist().withTimeout(10000); @@ -105,20 +104,20 @@ describe('Room screen', () => { it('should not show emoji autocomplete on semicolon in middle of a string', async() => { await element(by.id('messagebox-input')).tap(); // await element(by.id('messagebox-input')).replaceText(':'); - await element(by.id('messagebox-input')).typeText('name:is'); + await element(by.id('messagebox-input')).typeText('name:is'); await waitFor(element(by.id('messagebox-container'))).toNotExist().withTimeout(20000); await element(by.id('messagebox-input')).clearText(); }); it('should show and tap on user autocomplete and send mention', async() => { - const username = data.users.regular.username + const { username } = data.users.regular; await element(by.id('messagebox-input')).tap(); await element(by.id('messagebox-input')).typeText(`@${ username }`); await waitFor(element(by.id('messagebox-container'))).toExist().withTimeout(4000); - await waitFor(element(by.id(`mention-item-${ username }`))).toBeVisible().withTimeout(4000) + await waitFor(element(by.id(`mention-item-${ username }`))).toBeVisible().withTimeout(4000); await tryTapping(element(by.id(`mention-item-${ username }`)), 2000, true); await expect(element(by.id('messagebox-input'))).toHaveText(`@${ username } `); - await tryTapping(element(by.id('messagebox-input')), 2000) + await tryTapping(element(by.id('messagebox-input')), 2000); await element(by.id('messagebox-input')).typeText(`${ data.random }mention`); await element(by.id('messagebox-send-message')).tap(); // await waitFor(element(by.label(`@${ data.user } ${ data.random }mention`)).atIndex(0)).toExist().withTimeout(60000); @@ -126,7 +125,7 @@ describe('Room screen', () => { it('should not show user autocomplete on @ in the middle of a string', async() => { await element(by.id('messagebox-input')).tap(); - await element(by.id('messagebox-input')).typeText(`email@gmail`); + await element(by.id('messagebox-input')).typeText('email@gmail'); await waitFor(element(by.id('messagebox-container'))).toNotExist().withTimeout(4000); await element(by.id('messagebox-input')).clearText(); }); @@ -134,9 +133,9 @@ describe('Room screen', () => { it('should show and tap on room autocomplete', async() => { await element(by.id('messagebox-input')).tap(); await element(by.id('messagebox-input')).typeText('#general'); - //await waitFor(element(by.id('messagebox-container'))).toExist().withTimeout(4000); + // await waitFor(element(by.id('messagebox-container'))).toExist().withTimeout(4000); await waitFor(element(by.id('mention-item-general'))).toBeVisible().withTimeout(4000); - await tryTapping(element(by.id('mention-item-general')), 2000, true) + await tryTapping(element(by.id('mention-item-general')), 2000, true); await expect(element(by.id('messagebox-input'))).toHaveText('#general '); await element(by.id('messagebox-input')).clearText(); }); @@ -147,7 +146,7 @@ describe('Room screen', () => { await waitFor(element(by.id('messagebox-container'))).toNotExist().withTimeout(4000); await element(by.id('messagebox-input')).clearText(); }); - it('should draft message', async () => { + it('should draft message', async() => { await element(by.id('messagebox-input')).tap(); await element(by.id('messagebox-input')).typeText(`${ data.random }draft`); await tapBack(); @@ -159,10 +158,10 @@ describe('Room screen', () => { await navigateToRoom(mainRoom); await expect(element(by.id('messagebox-input'))).toHaveText(''); - }); + }); }); - describe('Message', async() => { + describe('Message', () => { it('should copy permalink', async() => { await element(by.label(`${ data.random }message`)).atIndex(0).longPress(); await expect(element(by.id('action-sheet'))).toExist(); @@ -184,9 +183,9 @@ describe('Room screen', () => { }); it('should star message', async() => { - await starMessage('message') + await starMessage('message'); - await sleep(1000) //https://github.com/RocketChat/Rocket.Chat.ReactNative/issues/2324 + await sleep(1000); // https://github.com/RocketChat/Rocket.Chat.ReactNative/issues/2324 await element(by.label(`${ data.random }message`)).atIndex(0).longPress(); await expect(element(by.id('action-sheet'))).toExist(); await expect(element(by.id('action-sheet-handle'))).toBeVisible(); @@ -229,8 +228,8 @@ describe('Room screen', () => { }); it('should ask for review', async() => { - await dismissReviewNag() //TODO: Create a proper test for this elsewhere. - }) + await dismissReviewNag(); // TODO: Create a proper test for this elsewhere. + }); it('should remove reaction', async() => { await element(by.id('message-reaction-:grinning:')).tap(); @@ -263,8 +262,8 @@ describe('Room screen', () => { }); it('should pin message', async() => { - await mockMessage('pin') - await pinMessage('pin') + await mockMessage('pin'); + await pinMessage('pin'); await waitFor(element(by.label(`${ data.random }pin`)).atIndex(0)).toExist().withTimeout(5000); await waitFor(element(by.label(`${ data.users.regular.username } Message pinned`)).atIndex(0)).toExist().withTimeout(5000); @@ -277,7 +276,7 @@ describe('Room screen', () => { }); it('should delete message', async() => { - await mockMessage('delete') + await mockMessage('delete'); await waitFor(element(by.label(`${ data.random }delete`)).atIndex(0)).toBeVisible(); await element(by.label(`${ data.random }delete`)).atIndex(0).longPress(); diff --git a/e2e/tests/room/03-roomactions.spec.js b/e2e/tests/room/03-roomactions.spec.js index ecbac2233..1d37bff3d 100644 --- a/e2e/tests/room/03-roomactions.spec.js +++ b/e2e/tests/room/03-roomactions.spec.js @@ -1,9 +1,8 @@ -const { - device, expect, element, by, waitFor -} = require('detox'); const data = require('../../data'); -const { navigateToLogin, login, tapBack, sleep, searchRoom, mockMessage, starMessage, pinMessage } = require('../../helpers/app'); -const { sendMessage } = require('../../helpers/data_setup') +const { + navigateToLogin, login, tapBack, sleep, searchRoom, mockMessage, starMessage, pinMessage +} = require('../../helpers/app'); +const { sendMessage } = require('../../helpers/data_setup'); async function navigateToRoomActions(type) { let room; @@ -36,15 +35,14 @@ async function waitForToast() { } describe('Room actions screen', () => { - before(async() => { await device.launchApp({ permissions: { notifications: 'YES' }, delete: true }); await navigateToLogin(); await login(data.users.regular.username, data.users.regular.password); }); - - describe('Render', async() => { - describe('Direct', async() => { + + describe('Render', () => { + describe('Direct', () => { before(async() => { await navigateToRoomActions('d'); }); @@ -52,41 +50,41 @@ describe('Room actions screen', () => { it('should have room actions screen', async() => { await expect(element(by.id('room-actions-view'))).toExist(); }); - + it('should have info', async() => { await expect(element(by.id('room-actions-info'))).toExist(); }); - + // it('should have voice', async() => { // await expect(element(by.id('room-actions-voice'))).toExist(); // }); - + // it('should have video', async() => { // await expect(element(by.id('room-actions-video'))).toExist(); // }); - + it('should have files', async() => { await expect(element(by.id('room-actions-files'))).toExist(); }); - + it('should have mentions', async() => { await expect(element(by.id('room-actions-mentioned'))).toExist(); }); - + it('should have starred', async() => { await expect(element(by.id('room-actions-starred'))).toExist(); }); - + it('should have share', async() => { await waitFor(element(by.id('room-actions-share'))).toExist(); await expect(element(by.id('room-actions-share'))).toExist(); }); - + it('should have pinned', async() => { await waitFor(element(by.id('room-actions-pinned'))).toExist(); await expect(element(by.id('room-actions-pinned'))).toExist(); }); - + it('should have notifications', async() => { await waitFor(element(by.id('room-actions-notifications'))).toExist(); await expect(element(by.id('room-actions-notifications'))).toExist(); @@ -102,7 +100,7 @@ describe('Room actions screen', () => { }); }); - describe('Channel/Group', async() => { + describe('Channel/Group', () => { before(async() => { await navigateToRoomActions('c'); }); @@ -110,15 +108,15 @@ describe('Room actions screen', () => { it('should have room actions screen', async() => { await expect(element(by.id('room-actions-view'))).toExist(); }); - + it('should have info', async() => { await expect(element(by.id('room-actions-info'))).toExist(); }); - + // it('should have voice', async() => { // await expect(element(by.id('room-actions-voice'))).toExist(); // }); - + // it('should have video', async() => { // await expect(element(by.id('room-actions-video'))).toExist(); // }); @@ -130,34 +128,34 @@ describe('Room actions screen', () => { it('should have add user', async() => { await expect(element(by.id('room-actions-add-user'))).toExist(); }); - + it('should have files', async() => { await expect(element(by.id('room-actions-files'))).toExist(); }); - + it('should have mentions', async() => { await expect(element(by.id('room-actions-mentioned'))).toExist(); }); - + it('should have starred', async() => { await expect(element(by.id('room-actions-starred'))).toExist(); }); - + it('should have share', async() => { await waitFor(element(by.id('room-actions-share'))).toExist(); await expect(element(by.id('room-actions-share'))).toExist(); }); - + it('should have pinned', async() => { await waitFor(element(by.id('room-actions-pinned'))).toExist(); await expect(element(by.id('room-actions-pinned'))).toExist(); }); - + it('should have notifications', async() => { await waitFor(element(by.id('room-actions-notifications'))).toExist(); await expect(element(by.id('room-actions-notifications'))).toExist(); }); - + it('should have leave channel', async() => { await waitFor(element(by.id('room-actions-leave-channel'))).toExist(); await expect(element(by.id('room-actions-leave-channel'))).toExist(); @@ -165,7 +163,7 @@ describe('Room actions screen', () => { }); }); - describe('Usage', async() => { + describe('Usage', () => { describe('TDB', async() => { // TODO: test into a jitsi call // it('should NOT navigate to voice call', async() => { @@ -191,7 +189,7 @@ describe('Room actions screen', () => { // }); }); - describe('Common', async() => { + describe('Common', () => { it('should show mentioned messages', async() => { await element(by.id('room-actions-mentioned')).tap(); await waitFor(element(by.id('mentioned-messages-view'))).toExist().withTimeout(2000); @@ -200,24 +198,23 @@ describe('Room actions screen', () => { }); it('should show starred message and unstar it', async() => { - - //Go back to room and send a message + // Go back to room and send a message await tapBack(); await mockMessage('messageToStar'); - //Star the message - await starMessage('messageToStar') + // Star the message + await starMessage('messageToStar'); - //Back into Room Actions + // Back into Room Actions await element(by.id('room-header')).tap(); await waitFor(element(by.id('room-actions-view'))).toExist().withTimeout(5000); - //Go to starred messages + // Go to starred messages await element(by.id('room-actions-starred')).tap(); await waitFor(element(by.id('starred-messages-view'))).toExist().withTimeout(2000); await waitFor(element(by.label(`${ data.random }messageToStar`).withAncestor(by.id('starred-messages-view')))).toExist().withTimeout(60000); - - //Unstar message + + // Unstar message await element(by.label(`${ data.random }messageToStar`)).atIndex(0).longPress(); await expect(element(by.id('action-sheet'))).toExist(); await expect(element(by.id('action-sheet-handle'))).toBeVisible(); @@ -228,15 +225,14 @@ describe('Room actions screen', () => { }); it('should show pinned message and unpin it', async() => { - - //Go back to room and send a message + // Go back to room and send a message await tapBack(); await mockMessage('messageToPin'); - //Pin the message - await pinMessage('messageToPin') + // Pin the message + await pinMessage('messageToPin'); - //Back into Room Actions + // Back into Room Actions await element(by.id('room-header')).tap(); await waitFor(element(by.id('room-actions-view'))).toExist().withTimeout(5000); await element(by.id('room-actions-scrollview')).scrollTo('bottom'); @@ -273,7 +269,7 @@ describe('Room actions screen', () => { // }); }); - describe('Notification', async() => { + describe('Notification', () => { it('should navigate to notification preference view', async() => { await element(by.id('room-actions-scrollview')).scrollTo('bottom'); await waitFor(element(by.id('room-actions-notifications'))).toExist().withTimeout(2000); @@ -318,13 +314,13 @@ describe('Room actions screen', () => { after(async() => { await backToActions(); }); - }) + }); - describe('Channel/Group', async() => { + describe('Channel/Group', () => { // Currently, there's no way to add more owners to the room // So we test only for the 'You are the last owner...' message - const user = data.users.alternate + const user = data.users.alternate; it('should tap on leave channel and raise alert', async() => { await element(by.id('room-actions-scrollview')).scrollTo('bottom'); @@ -363,12 +359,24 @@ describe('Room actions screen', () => { await backToActions(); }); - describe('Room Members', async() => { + describe('Room Members', () => { before(async() => { await element(by.id('room-actions-members')).tap(); await waitFor(element(by.id('room-members-view'))).toExist().withTimeout(2000); }); + const openActionSheet = async(username) => { + await waitFor(element(by.id(`room-members-view-item-${ username }`))).toExist().withTimeout(5000); + await element(by.id(`room-members-view-item-${ username }`)).tap(); + await sleep(300); + await expect(element(by.id('action-sheet'))).toExist(); + await expect(element(by.id('action-sheet-handle'))).toBeVisible(); + }; + + const closeActionSheet = async() => { + await element(by.id('action-sheet-handle')).swipe('down', 'fast', 0.6); + }; + it('should show all users', async() => { await element(by.id('room-members-view-toggle-status')).tap(); await waitFor(element(by.id(`room-members-view-item-${ user.username }`))).toExist().withTimeout(60000); @@ -397,18 +405,6 @@ describe('Room actions screen', () => { await waitFor(element(by.id(`room-members-view-item-${ user.username }`))).toExist().withTimeout(60000); }); - const openActionSheet = async(username) => { - await waitFor(element(by.id(`room-members-view-item-${ username }`))).toExist().withTimeout(5000); - await element(by.id(`room-members-view-item-${ username }`)).tap(); - await sleep(300); - await expect(element(by.id('action-sheet'))).toExist(); - await expect(element(by.id('action-sheet-handle'))).toBeVisible(); - } - - const closeActionSheet = async() => { - await element(by.id('action-sheet-handle')).swipe('down', 'fast', 0.6); - } - it('should set/remove as owner', async() => { await openActionSheet(user.username); await element(by.id('action-sheet-set-owner')).tap(); @@ -504,9 +500,9 @@ describe('Room actions screen', () => { await waitFor(element(by.id('rooms-list-view'))).toExist().withTimeout(2000); }); }); - }) + }); - describe('Direct', async() => { + describe('Direct', () => { before(async() => { await navigateToRoomActions('d'); }); diff --git a/e2e/tests/room/04-discussion.spec.js b/e2e/tests/room/04-discussion.spec.js index aa39f2eaf..29fc5a090 100644 --- a/e2e/tests/room/04-discussion.spec.js +++ b/e2e/tests/room/04-discussion.spec.js @@ -1,7 +1,6 @@ const { - expect, element, by, waitFor -} = require('detox'); -const { navigateToLogin, login, mockMessage, tapBack, searchRoom } = require('../../helpers/app'); + navigateToLogin, login, mockMessage, tapBack, searchRoom +} = require('../../helpers/app'); const data = require('../../data'); const channel = data.groups.private.name; @@ -10,28 +9,28 @@ const navigateToRoom = async() => { await searchRoom(channel); await element(by.id(`rooms-list-view-item-${ channel }`)).tap(); await waitFor(element(by.id('room-view'))).toBeVisible().withTimeout(5000); -} +}; describe('Discussion', () => { before(async() => { await device.launchApp({ permissions: { notifications: 'YES' }, newInstance: true, delete: true }); await navigateToLogin(); - await login(data.users.regular.username, data.users.regular.password) + await login(data.users.regular.username, data.users.regular.password); }); it('should create discussion from NewMessageView', async() => { - const discussionName = `${data.random} Discussion NewMessageView`; + const discussionName = `${ data.random } Discussion NewMessageView`; await element(by.id('rooms-list-view-create-channel')).tap(); await waitFor(element(by.id('new-message-view'))).toExist().withTimeout(2000); await element(by.label('Create Discussion')).atIndex(0).tap(); await waitFor(element(by.id('create-discussion-view'))).toExist().withTimeout(60000); await expect(element(by.id('create-discussion-view'))).toExist(); await element(by.label('Select a Channel...')).tap(); - await element(by.id('multi-select-search')).replaceText(`${channel}`); - await waitFor(element(by.id(`multi-select-item-${channel}`))).toExist().withTimeout(10000); - await element(by.id(`multi-select-item-${channel}`)).tap(); + await element(by.id('multi-select-search')).replaceText(`${ channel }`); + await waitFor(element(by.id(`multi-select-item-${ channel }`))).toExist().withTimeout(10000); + await element(by.id(`multi-select-item-${ channel }`)).tap(); await element(by.id('multi-select-discussion-name')).replaceText(discussionName); - await waitFor(element(by.id(`create-discussion-submit`))).toExist().withTimeout(10000); + await waitFor(element(by.id('create-discussion-submit'))).toExist().withTimeout(10000); await element(by.id('create-discussion-submit')).tap(); await waitFor(element(by.id('room-view'))).toExist().withTimeout(10000); await waitFor(element(by.id(`room-view-title-${ discussionName }`))).toExist().withTimeout(5000); @@ -40,20 +39,20 @@ describe('Discussion', () => { }); it('should create discussion from action button', async() => { - const discussionName = `${data.random} Discussion Action Button`; + const discussionName = `${ data.random } Discussion Action Button`; await navigateToRoom(); await element(by.id('messagebox-actions')).tap(); await waitFor(element(by.id('action-sheet'))).toExist().withTimeout(2000); await element(by.label('Create Discussion')).atIndex(0).tap(); await waitFor(element(by.id('create-discussion-view'))).toExist().withTimeout(2000); await element(by.id('multi-select-discussion-name')).replaceText(discussionName); - await waitFor(element(by.id(`create-discussion-submit`))).toExist().withTimeout(10000); + await waitFor(element(by.id('create-discussion-submit'))).toExist().withTimeout(10000); await element(by.id('create-discussion-submit')).tap(); await waitFor(element(by.id('room-view'))).toExist().withTimeout(10000); await waitFor(element(by.id(`room-view-title-${ discussionName }`))).toExist().withTimeout(5000); }); - describe('Create Discussion from action sheet', async() => { + describe('Create Discussion from action sheet', () => { it('should send a message', async() => { await waitFor(element(by.id('messagebox'))).toBeVisible().withTimeout(60000); await mockMessage('message'); @@ -63,15 +62,15 @@ describe('Discussion', () => { const discussionName = `${ data.random }message`; await element(by.label(discussionName)).atIndex(0).longPress(); await waitFor(element(by.id('action-sheet'))).toExist().withTimeout(2000); - await element(by.label(`Start a Discussion`)).atIndex(0).tap(); + await element(by.label('Start a Discussion')).atIndex(0).tap(); await waitFor(element(by.id('create-discussion-view'))).toExist().withTimeout(2000); await element(by.id('create-discussion-submit')).tap(); await waitFor(element(by.id('room-view'))).toExist().withTimeout(10000); await waitFor(element(by.id(`room-view-title-${ discussionName }`))).toExist().withTimeout(5000); }); }); - - describe('Check RoomActionsView render', async() => { + + describe('Check RoomActionsView render', () => { it('should navigete to RoomActionsView', async() => { await waitFor(element(by.id('room-header'))).toBeVisible().withTimeout(5000); await element(by.id('room-header')).tap(); diff --git a/e2e/tests/room/05-threads.spec.js b/e2e/tests/room/05-threads.spec.js index 381fa2b07..e3eee4c36 100644 --- a/e2e/tests/room/05-threads.spec.js +++ b/e2e/tests/room/05-threads.spec.js @@ -1,8 +1,7 @@ -const { - device, expect, element, by, waitFor -} = require('detox'); const data = require('../../data'); -const { navigateToLogin, login, mockMessage, tapBack, sleep, searchRoom, starMessage, pinMessage, dismissReviewNag, tryTapping } = require('../../helpers/app'); +const { + navigateToLogin, login, mockMessage, tapBack, sleep, searchRoom, dismissReviewNag +} = require('../../helpers/app'); async function navigateToRoom(roomName) { await device.launchApp({ permissions: { notifications: 'YES' }, delete: true }); @@ -20,14 +19,14 @@ describe('Threads', () => { await navigateToRoom(mainRoom); }); - describe('Render', async() => { + describe('Render', () => { it('should have room screen', async() => { await expect(element(by.id('room-view'))).toExist(); await waitFor(element(by.id(`room-view-title-${ mainRoom }`))).toExist().withTimeout(5000); }); // Render - Header - describe('Header', async() => { + describe('Header', () => { it('should have actions button ', async() => { await expect(element(by.id('room-header'))).toExist(); }); @@ -38,7 +37,7 @@ describe('Threads', () => { }); // Render - Messagebox - describe('Messagebox', async() => { + describe('Messagebox', () => { it('should have messagebox', async() => { await expect(element(by.id('messagebox'))).toExist(); }); @@ -63,8 +62,8 @@ describe('Threads', () => { }); }); - describe('Usage', async() => { - describe('Thread', async() => { + describe('Usage', () => { + describe('Thread', () => { const thread = `${ data.random }thread`; it('should create thread', async() => { await mockMessage('thread'); @@ -104,9 +103,9 @@ describe('Threads', () => { const messageText = 'threadonly'; await mockMessage(messageText, true); await tapBack(); - await waitFor(element(by.id('room-header').and(by.label(`${ mainRoom }`)))).toBeVisible().withTimeout(2000); - await waitFor(element(by.id('room-header').and(by.label(`${ data.random }thread`)))).toBeNotVisible().withTimeout(2000); - await sleep(500) //TODO: Find a better way to wait for the animation to finish and the messagebox-input to be available and usable :( + await waitFor(element(by.id('room-header').and(by.label(`${ mainRoom }`)))).toBeVisible().withTimeout(2000); + await waitFor(element(by.id('room-header').and(by.label(`${ data.random }thread`)))).toBeNotVisible().withTimeout(2000); + await sleep(500); // TODO: Find a better way to wait for the animation to finish and the messagebox-input to be available and usable :( await waitFor(element(by.label(`${ data.random }${ messageText }`)).atIndex(0)).toNotExist().withTimeout(2000); }); @@ -117,24 +116,24 @@ describe('Threads', () => { await element(by.id('messagebox-send-to-channel')).tap(); await element(by.id('messagebox-send-message')).tap(); await tapBack(); - await waitFor(element(by.id('room-header').and(by.label(`${ mainRoom }`)))).toBeVisible().withTimeout(2000); - await waitFor(element(by.id('room-header').and(by.label(`${ data.random }thread`)))).toBeNotVisible().withTimeout(2000); - await sleep(500) //TODO: Find a better way to wait for the animation to finish and the messagebox-input to be available and usable :( + await waitFor(element(by.id('room-header').and(by.label(`${ mainRoom }`)))).toBeVisible().withTimeout(2000); + await waitFor(element(by.id('room-header').and(by.label(`${ data.random }thread`)))).toBeNotVisible().withTimeout(2000); + await sleep(500); // TODO: Find a better way to wait for the animation to finish and the messagebox-input to be available and usable :( await waitFor(element(by.label(messageText)).atIndex(0)).toExist().withTimeout(2000); }); it('should navigate to thread from thread name', async() => { const messageText = 'navthreadname'; await mockMessage('dummymessagebetweenthethread'); - await dismissReviewNag() //TODO: Create a proper test for this elsewhere. + await dismissReviewNag(); // TODO: Create a proper test for this elsewhere. await element(by.id(`message-thread-button-${ thread }`)).tap(); await element(by.id('messagebox-input-thread')).typeText(messageText); await element(by.id('messagebox-send-to-channel')).tap(); await element(by.id('messagebox-send-message')).tap(); await tapBack(); - await waitFor(element(by.id('room-header').and(by.label(`${ mainRoom }`)))).toBeVisible().withTimeout(2000); - await waitFor(element(by.id('room-header').and(by.label(`${ data.random }thread`)))).toBeNotVisible().withTimeout(2000); - await waitFor(element(by.id(`message-thread-replied-on-${ thread }`))).toBeVisible().withTimeout(2000); + await waitFor(element(by.id('room-header').and(by.label(`${ mainRoom }`)))).toBeVisible().withTimeout(2000); + await waitFor(element(by.id('room-header').and(by.label(`${ data.random }thread`)))).toBeNotVisible().withTimeout(2000); + await waitFor(element(by.id(`message-thread-replied-on-${ thread }`))).toBeVisible().withTimeout(2000); await element(by.id(`message-thread-replied-on-${ thread }`)).tap(); await waitFor(element(by.id(`room-view-title-${ thread }`))).toExist().withTimeout(5000); await expect(element(by.id(`room-view-title-${ thread }`))).toExist(); @@ -155,7 +154,7 @@ describe('Threads', () => { await tapBack(); }); - it('should draft thread message', async () => { + it('should draft thread message', async() => { await element(by.id(`message-thread-button-${ thread }`)).tap(); await waitFor(element(by.id(`room-view-title-${ thread }`))).toExist().withTimeout(5000); await element(by.id('messagebox-input-thread')).typeText(`${ thread }draft`); diff --git a/e2e/tests/room/06-createdmgroup.spec.js b/e2e/tests/room/06-createdmgroup.spec.js index a6451bfd7..bd2be06ab 100644 --- a/e2e/tests/room/06-createdmgroup.spec.js +++ b/e2e/tests/room/06-createdmgroup.spec.js @@ -1,8 +1,7 @@ -const { - device, expect, element, by, waitFor -} = require('detox'); const data = require('../../data'); -const { tapBack, sleep, navigateToLogin, login, tryTapping } = require('../../helpers/app'); +const { + navigateToLogin, login +} = require('../../helpers/app'); @@ -13,41 +12,39 @@ describe('Group DM', () => { await login(data.users.regular.username, data.users.regular.password); }); - describe('Create Group DM', async() => { + describe('Create Group DM', () => { before(async() => { await element(by.id('rooms-list-view-create-channel')).tap(); }); - describe('Render', async() => { + describe('Render', () => { it('should have new message screen', async() => { await waitFor(element(by.id('new-message-view'))).toBeVisible().withTimeout(2000); }); - + it('should have search input', async() => { await waitFor(element(by.id('new-message-view-search'))).toBeVisible().withTimeout(2000); }); - }) + }); - describe('Usage', async() => { + describe('Usage', () => { it('should navigate to create DM', async() => { await element(by.label('Create Direct Messages')).tap(); }); it('should add users', async() => { await element(by.id('select-users-view-search')).replaceText('rocket.cat'); - await waitFor(element(by.id(`select-users-view-item-rocket.cat`))).toBeVisible().withTimeout(10000); + await waitFor(element(by.id('select-users-view-item-rocket.cat'))).toBeVisible().withTimeout(10000); await element(by.id('select-users-view-item-rocket.cat')).tap(); await element(by.id('select-users-view-search')).replaceText(data.users.existing.username); - await waitFor(element(by.id(`select-users-view-item-${data.users.existing.username}`))).toBeVisible().withTimeout(10000); - await element(by.id(`select-users-view-item-${data.users.existing.username}`)).tap(); + await waitFor(element(by.id(`select-users-view-item-${ data.users.existing.username }`))).toBeVisible().withTimeout(10000); + await element(by.id(`select-users-view-item-${ data.users.existing.username }`)).tap(); await element(by.id('selected-users-view-submit')).tap(); }); it('check Group DM exist', async() => { - await waitFor(element(by.id(`room-view-title-${data.users.existing.username}, rocket.cat`))).toExist().withTimeout(10000); + await waitFor(element(by.id(`room-view-title-${ data.users.existing.username }, rocket.cat`))).toExist().withTimeout(10000); }); - - - }) + }); }); }); diff --git a/e2e/tests/room/07-markasunread.spec.js b/e2e/tests/room/07-markasunread.spec.js index 383f49a7b..82920ba84 100644 --- a/e2e/tests/room/07-markasunread.spec.js +++ b/e2e/tests/room/07-markasunread.spec.js @@ -1,9 +1,8 @@ -const { - device, expect, element, by, waitFor -} = require('detox'); const data = require('../../data'); -const { navigateToLogin, login, searchRoom, sleep } = require('../../helpers/app'); -const { sendMessage } = require('../../helpers/data_setup') +const { + navigateToLogin, login, searchRoom, sleep +} = require('../../helpers/app'); +const { sendMessage } = require('../../helpers/data_setup'); async function navigateToRoom(user) { await searchRoom(`${ user }`); @@ -12,7 +11,7 @@ async function navigateToRoom(user) { } describe('Mark as unread', () => { - const user = data.users.alternate.username + const user = data.users.alternate.username; before(async() => { await device.launchApp({ permissions: { notifications: 'YES' }, delete: true }); @@ -21,9 +20,8 @@ describe('Mark as unread', () => { await navigateToRoom(user); }); - // TODO: Fix flakiness. If it fails, run it solo. - describe('Usage', async() => { - describe('Mark message as unread', async() => { + describe('Usage', () => { + describe('Mark message as unread', () => { it('should mark message as unread', async() => { const message = `${ data.random }message-mark-as-unread`; const channelName = `@${ data.users.regular.username }`; @@ -35,7 +33,7 @@ describe('Mark as unread', () => { await element(by.id('action-sheet-handle')).swipe('up', 'fast', 0.5); await element(by.label('Mark Unread')).atIndex(0).tap(); await waitFor(element(by.id('rooms-list-view'))).toExist().withTimeout(5000); - await expect(element(by.id(`rooms-list-view-item-${data.users.alternate.username}`))).toExist(); + await expect(element(by.id(`rooms-list-view-item-${ data.users.alternate.username }`))).toExist(); }); }); }); diff --git a/e2e/tests/room/08-roominfo.spec.js b/e2e/tests/room/08-roominfo.spec.js index fd6216cf9..8786c3761 100644 --- a/e2e/tests/room/08-roominfo.spec.js +++ b/e2e/tests/room/08-roominfo.spec.js @@ -1,10 +1,9 @@ -const { - device, expect, element, by, waitFor -} = require('detox'); const data = require('../../data'); -const { navigateToLogin, login, tapBack, sleep, searchRoom } = require('../../helpers/app'); +const { + navigateToLogin, login, tapBack, sleep, searchRoom +} = require('../../helpers/app'); -const privateRoomName = data.groups.private.name +const privateRoomName = data.groups.private.name; async function navigateToRoomInfo(type) { let room; @@ -31,14 +30,13 @@ async function waitForToast() { } describe('Room info screen', () => { - before(async() => { await device.launchApp({ permissions: { notifications: 'YES' }, delete: true }); await navigateToLogin(); await login(data.users.regular.username, data.users.regular.password); }); - describe('Direct', async() => { + describe('Direct', () => { before(async() => { await navigateToRoomInfo('d'); }); @@ -49,107 +47,107 @@ describe('Room info screen', () => { }); after(async() => { - await tapBack() - await tapBack() - await tapBack() - }) + await tapBack(); + await tapBack(); + await tapBack(); + }); }); - describe('Channel/Group', async() => { + describe('Channel/Group', () => { before(async() => { await navigateToRoomInfo('c'); }); - describe('Render', async() => { + describe('Render', () => { it('should have room info view', async() => { await expect(element(by.id('room-info-view'))).toExist(); }); - + it('should have name', async() => { await expect(element(by.id('room-info-view-name'))).toExist(); }); - + it('should have description', async() => { await expect(element(by.label('Description'))).toExist(); }); - + it('should have topic', async() => { await expect(element(by.label('Topic'))).toExist(); }); - + it('should have announcement', async() => { await expect(element(by.label('Announcement'))).toExist(); }); - + it('should have edit button', async() => { await expect(element(by.id('room-info-view-edit-button'))).toExist(); }); }); - describe('Render Edit', async() => { + describe('Render Edit', () => { before(async() => { await waitFor(element(by.id('room-info-view-edit-button'))).toExist().withTimeout(10000); await element(by.id('room-info-view-edit-button')).tap(); await waitFor(element(by.id('room-info-edit-view'))).toExist().withTimeout(2000); }); - + it('should have room info edit view', async() => { await expect(element(by.id('room-info-edit-view'))).toExist(); }); - + it('should have name input', async() => { await expect(element(by.id('room-info-edit-view-name'))).toExist(); }); - + it('should have description input', async() => { await expect(element(by.id('room-info-edit-view-description'))).toExist(); }); - + it('should have topic input', async() => { await expect(element(by.id('room-info-edit-view-topic'))).toExist(); }); - + it('should have announcement input', async() => { await expect(element(by.id('room-info-edit-view-announcement'))).toExist(); }); - + it('should have password input', async() => { await expect(element(by.id('room-info-edit-view-password'))).toExist(); }); - + it('should have type switch', async() => { // Ugly hack to scroll on detox await element(by.id('room-info-edit-view-list')).swipe('up', 'fast', 0.8); await expect(element(by.id('room-info-edit-view-t'))).toExist(); }); - + it('should have ready only switch', async() => { await expect(element(by.id('room-info-edit-view-ro'))).toExist(); }); - + it('should have submit button', async() => { await expect(element(by.id('room-info-edit-view-submit'))).toExist(); }); - + it('should have reset button', async() => { await expect(element(by.id('room-info-edit-view-reset'))).toExist(); }); - + it('should have archive button', async() => { await expect(element(by.id('room-info-edit-view-archive'))).toExist(); }); - + it('should have delete button', async() => { await expect(element(by.id('room-info-edit-view-delete'))).toExist(); }); - + after(async() => { // Ugly hack to scroll on detox await element(by.id('room-info-edit-view-list')).swipe('down', 'fast', 0.8); }); }); - - describe('Usage', async() => { + + describe('Usage', () => { // it('should enter "invalid name" and get error', async() => { // await element(by.type('UIScrollView')).atIndex(1).swipe('down'); // await element(by.id('room-info-edit-view-name')).replaceText('invalid name'); @@ -161,7 +159,7 @@ describe('Room info screen', () => { // await waitFor(element(by.text('There was an error while saving settings!'))).toBeNotVisible().withTimeout(10000); // await element(by.type('UIScrollView')).atIndex(1).swipe('down'); // }); - + it('should change room name', async() => { await element(by.id('room-info-edit-view-name')).replaceText(`${ privateRoomName }new`); await element(by.id('room-info-edit-view-list')).swipe('up', 'fast', 0.5); @@ -179,7 +177,7 @@ describe('Room info screen', () => { await waitForToast(); await element(by.id('room-info-edit-view-list')).swipe('down', 'fast', 0.8); }); - + it('should reset form', async() => { await element(by.id('room-info-edit-view-name')).replaceText('abc'); await element(by.id('room-info-edit-view-description')).replaceText('abc'); @@ -188,7 +186,7 @@ describe('Room info screen', () => { await element(by.id('room-info-edit-view-password')).replaceText('abc'); await element(by.id('room-info-edit-view-list')).swipe('up', 'fast', 0.5); await element(by.id('room-info-edit-view-t')).tap(); - await element(by.id('room-info-edit-view-ro')).longPress(); //https://github.com/facebook/react-native/issues/28032 + await element(by.id('room-info-edit-view-ro')).longPress(); // https://github.com/facebook/react-native/issues/28032 await element(by.id('room-info-edit-view-react-when-ro')).tap(); await element(by.id('room-info-edit-view-reset')).tap(); // after reset @@ -202,7 +200,7 @@ describe('Room info screen', () => { await expect(element(by.id('room-info-edit-view-react-when-ro'))).toBeNotVisible(); await element(by.id('room-info-edit-view-list')).swipe('down', 'fast', 0.8); }); - + it('should change room description', async() => { await element(by.id('room-info-edit-view-description')).replaceText('new description'); await element(by.id('room-info-edit-view-list')).swipe('up', 'fast', 0.5); @@ -212,7 +210,7 @@ describe('Room info screen', () => { await waitFor(element(by.id('room-info-view'))).toExist().withTimeout(2000); await expect(element(by.label('new description').withAncestor(by.id('room-info-view-description')))).toExist(); }); - + it('should change room topic', async() => { await waitFor(element(by.id('room-info-view-edit-button'))).toExist().withTimeout(10000); await element(by.id('room-info-view-edit-button')).tap(); @@ -225,7 +223,7 @@ describe('Room info screen', () => { await waitFor(element(by.id('room-info-view'))).toExist().withTimeout(2000); await expect(element(by.label('new topic').withAncestor(by.id('room-info-view-topic')))).toExist(); }); - + it('should change room announcement', async() => { await waitFor(element(by.id('room-info-view-edit-button'))).toExist().withTimeout(10000); await element(by.id('room-info-view-edit-button')).tap(); @@ -238,7 +236,7 @@ describe('Room info screen', () => { await waitFor(element(by.id('room-info-view'))).toExist().withTimeout(2000); await expect(element(by.label('new announcement').withAncestor(by.id('room-info-view-announcement')))).toExist(); }); - + it('should change room password', async() => { await waitFor(element(by.id('room-info-view-edit-button'))).toExist().withTimeout(10000); await element(by.id('room-info-view-edit-button')).tap(); @@ -248,7 +246,7 @@ describe('Room info screen', () => { await element(by.id('room-info-edit-view-submit')).tap(); await waitForToast(); }); - + it('should change room type', async() => { await element(by.id('room-info-edit-view-list')).swipe('up', 'fast', 0.5); await element(by.id('room-info-edit-view-t')).tap(); @@ -258,7 +256,7 @@ describe('Room info screen', () => { await element(by.id('room-info-edit-view-submit')).tap(); await waitForToast(); }); - + // it('should change room read only and allow reactions', async() => { // await sleep(1000); // await element(by.type('UIScrollView')).atIndex(1).swipe('up'); @@ -270,7 +268,7 @@ describe('Room info screen', () => { // await waitForToast(); // // TODO: test if it's possible to react // }); - + it('should archive room', async() => { await element(by.id('room-info-edit-view-list')).swipe('up', 'fast', 0.5); await element(by.id('room-info-edit-view-archive')).tap(); diff --git a/e2e/tests/room/09-jumptomessage.spec.js b/e2e/tests/room/09-jumptomessage.spec.js new file mode 100644 index 000000000..82ab06e5b --- /dev/null +++ b/e2e/tests/room/09-jumptomessage.spec.js @@ -0,0 +1,154 @@ +const data = require('../../data'); +const { + navigateToLogin, tapBack, login, searchRoom +} = require('../../helpers/app'); + +async function navigateToRoom(roomName) { + await searchRoom(`${ roomName }`); + await element(by.id(`rooms-list-view-item-${ roomName }`)).tap(); + await waitFor(element(by.id('room-view'))).toBeVisible().withTimeout(5000); +} + +async function clearCache() { + await waitFor(element(by.id('room-view'))).toBeVisible().withTimeout(5000); + await tapBack(); + await waitFor(element(by.id('rooms-list-view'))).toBeVisible().withTimeout(10000); + await element(by.id('rooms-list-view-sidebar')).tap(); + await waitFor(element(by.id('sidebar-view'))).toBeVisible().withTimeout(2000); + await element(by.id('sidebar-settings')).tap(); + await waitFor(element(by.id('settings-view'))).toBeVisible().withTimeout(2000); + await element(by.id('settings-view-clear-cache')).tap(); + await waitFor(element(by.text('This will clear all your offline data.'))).toExist().withTimeout(2000); + await element(by.label('Clear').and(by.type('_UIAlertControllerActionView'))).tap(); + await waitFor(element(by.id('rooms-list-view'))).toBeVisible().withTimeout(5000); + await waitFor(element(by.id('rooms-list-view-item-jumping'))).toExist().withTimeout(10000); +} + +async function waitForLoading() { + await waitFor(element(by.id('loading'))).toBeVisible().withTimeout(5000); + await waitFor(element(by.id('loading'))).toBeNotVisible().withTimeout(5000); +} + +describe('Room', () => { + before(async() => { + await device.launchApp({ permissions: { notifications: 'YES' }, delete: true }); + await navigateToLogin(); + await login(data.adminUser, data.adminPassword); + }); + + it('should jump to an old message and load its surroundings', async() => { + await navigateToRoom('jumping'); + await waitFor(element(by.label('Quote first message'))).toExist().withTimeout(5000); + await element(by.label('1')).atIndex(0).tap(); + await waitForLoading(); + await expect(element(by.label('1')).atIndex(0)).toExist(); + await expect(element(by.label('2'))).toExist(); + }); + + it('should tap FAB and scroll to bottom', async() => { + await waitFor(element(by.id('nav-jump-to-bottom'))).toExist().withTimeout(5000); + await element(by.id('nav-jump-to-bottom')).tap(); + await waitFor(element(by.label('Quote first message'))).toExist().withTimeout(5000); + await clearCache(); + }); + + it('should load messages on scroll', async() => { + await navigateToRoom('jumping'); + await waitFor(element(by.id('room-view-messages'))).toExist().withTimeout(5000); + await waitFor(element(by.label('300'))).toExist().withTimeout(5000); + let found = false; + while (!found) { + await element(by.id('room-view-messages')).atIndex(0).scroll(500, 'up'); + try { + await expect(element(by.label('249'))).toExist(); + found = true; + } catch { + // + } + } + await clearCache(); + }); + + it('should search for old message and load its surroundings', async() => { + await navigateToRoom('jumping'); + await element(by.id('room-view-search')).tap(); + await waitFor(element(by.id('search-messages-view'))).toExist().withTimeout(5000); + await element(by.id('search-message-view-input')).typeText('30\n'); + await waitFor(element(by.label('30')).atIndex(0)).toExist().withTimeout(5000); + await element(by.label('30')).atIndex(0).tap(); + await waitForLoading(); + await expect(element(by.label('30'))).toExist(); + await expect(element(by.label('31'))).toExist(); + await expect(element(by.label('32'))).toExist(); + }); + + it('should load newer and older messages', async() => { + await element(by.id('room-view-messages')).atIndex(0).swipe('down', 'fast', 0.8); + await waitFor(element(by.label('5'))).toExist().withTimeout(5000); + await waitFor(element(by.label('Load Older'))).toExist().withTimeout(5000); + await element(by.label('Load Older')).atIndex(0).tap(); + await waitFor(element(by.label('4'))).toExist().withTimeout(5000); + await element(by.id('room-view-messages')).atIndex(0).swipe('down', 'fast', 0.5); + await waitFor(element(by.label('1'))).toExist().withTimeout(5000); + await element(by.id('room-view-messages')).atIndex(0).swipe('up', 'fast', 0.5); + await waitFor(element(by.label('25'))).toExist().withTimeout(5000); + await element(by.id('room-view-messages')).atIndex(0).swipe('up', 'fast', 0.5); + await waitFor(element(by.label('50'))).toExist().withTimeout(5000); + await element(by.id('room-view-messages')).atIndex(0).swipe('up', 'slow', 0.5); + await waitFor(element(by.label('Load Newer'))).toExist().withTimeout(5000); + await element(by.label('Load Newer')).atIndex(0).tap(); + await waitFor(element(by.label('104'))).toExist().withTimeout(5000); + await waitFor(element(by.label('Load Newer'))).toExist().withTimeout(5000); + await element(by.label('Load Newer')).atIndex(0).tap(); + await waitFor(element(by.label('154'))).toExist().withTimeout(5000); + await waitFor(element(by.label('Load Newer'))).toExist().withTimeout(5000); + await element(by.label('Load Newer')).atIndex(0).tap(); + await waitFor(element(by.label('Load Newer'))).toNotExist().withTimeout(5000); + await expect(element(by.label('Load More'))).toNotExist(); + await expect(element(by.label('201'))).toExist(); + await expect(element(by.label('202'))).toExist(); + await tapBack(); + }); +}); + +const expectThreadMessages = async(message) => { + await waitFor(element(by.id('room-view-title-jumping-thread'))).toExist().withTimeout(5000); + await expect(element(by.label(message))).toExist(); +}; + +describe('Threads', () => { + it('should navigate to a thread from another room', async() => { + await navigateToRoom('jumping'); + await waitFor(element(by.label('Go to jumping-thread\'s thread')).atIndex(0)).toExist().withTimeout(5000); + await element(by.label('Go to jumping-thread\'s thread')).atIndex(0).tap(); + await waitForLoading(); + await expectThreadMessages('Go to jumping-thread\'s thread'); + await tapBack(); + }); + + it('should tap on thread message from main room', async() => { + await waitFor(element(by.label('thread message sent to main room')).atIndex(0)).toExist().withTimeout(5000); + await element(by.label('thread message sent to main room')).atIndex(0).tap(); + await expectThreadMessages('thread message sent to main room'); + await tapBack(); + }); + + it('should tap on quote', async() => { + await waitFor(element(by.label('quoted'))).toExist().withTimeout(5000); + await element(by.label('quoted')).atIndex(0).tap(); + await expectThreadMessages('quoted'); + await tapBack(); + }); + + it('should jump from search message', async() => { + await waitFor(element(by.id('room-view-title-jumping-thread'))).toExist().withTimeout(5000); + await element(by.id('room-view-search')).atIndex(0).tap(); + await waitFor(element(by.id('search-messages-view'))).toExist().withTimeout(5000); + await element(by.id('search-message-view-input')).typeText('to be searched\n'); + await waitFor(element(by.label('to be searched'))).toExist().withTimeout(5000); + await element(by.label('to be searched')).atIndex(1).tap(); + await expectThreadMessages('to be searched'); + }); + + // TODO: Threads pagination +}); diff --git a/e2e/tests/team/01-createteam.spec.js b/e2e/tests/team/01-createteam.spec.js index 3c9a2260c..0fb71a7b6 100644 --- a/e2e/tests/team/01-createteam.spec.js +++ b/e2e/tests/team/01-createteam.spec.js @@ -1,6 +1,3 @@ -const { - device, expect, element, by, waitFor -} = require('detox'); const data = require('../../data'); const { navigateToLogin, login } = require('../../helpers/app'); @@ -13,7 +10,7 @@ describe('Create team screen', () => { await login(data.users.regular.username, data.users.regular.password); }); - describe('New Message', async() => { + describe('New Message', () => { before(async() => { await element(by.id('rooms-list-view-create-channel')).tap(); }); @@ -28,17 +25,17 @@ describe('Create team screen', () => { }); }); - describe('Select Users', async() => { + describe('Select Users', () => { it('should nav to create team', async() => { await element(by.id('selected-users-view-submit')).tap(); await waitFor(element(by.id('create-channel-view'))).toExist().withTimeout(10000); }); - }) + }); - describe('Create Team', async() => { - describe('Usage', async() => { + describe('Create Team', () => { + describe('Usage', () => { it('should get invalid team name', async() => { - await element(by.id('create-channel-name')).typeText(`${data.teams.private.name}`); + await element(by.id('create-channel-name')).typeText(`${ data.teams.private.name }`); await element(by.id('create-channel-submit')).tap(); await element(by.text('OK')).tap(); }); @@ -52,10 +49,10 @@ describe('Create team screen', () => { await waitFor(element(by.id(`room-view-title-${ teamName }`))).toExist().withTimeout(6000); await expect(element(by.id(`room-view-title-${ teamName }`))).toExist(); }); - }) + }); }); - describe('Delete Team', async() => { + describe('Delete Team', () => { it('should navigate to room info edit view', async() => { await element(by.id('room-header')).tap(); await waitFor(element(by.id('room-actions-view'))).toExist().withTimeout(5000); diff --git a/e2e/tests/team/02-team.spec.js b/e2e/tests/team/02-team.spec.js index f9b819595..c8451cc45 100644 --- a/e2e/tests/team/02-team.spec.js +++ b/e2e/tests/team/02-team.spec.js @@ -1,8 +1,7 @@ -const { - device, expect, element, by, waitFor -} = require('detox'); const data = require('../../data'); -const { navigateToLogin, login, tapBack, sleep, searchRoom } = require('../../helpers/app'); +const { + navigateToLogin, login, tapBack, sleep, searchRoom +} = require('../../helpers/app'); async function navigateToRoom(roomName) { await searchRoom(`${ roomName }`); @@ -29,7 +28,7 @@ async function backToActions() { await waitFor(element(by.id('room-actions-view'))).toExist().withTimeout(2000); } async function closeActionSheet() { - await element(by.id('action-sheet-handle')).swipe('down', 'fast', 0.6); + await element(by.id('action-sheet-handle')).swipe('down', 'fast', 0.6); } async function waitForToast() { @@ -49,13 +48,13 @@ describe('Team', () => { await navigateToRoom(team); }); - describe('Team Room', async() => { - describe('Team Header', async() => { + describe('Team Room', () => { + describe('Team Header', () => { it('should have actions button ', async() => { await expect(element(by.id('room-header'))).toExist(); }); - - it('should have team channels button ', async() => { + + it('should have team channels button ', async() => { await expect(element(by.id('room-view-header-team-channels'))).toExist(); }); @@ -69,19 +68,19 @@ describe('Team', () => { }); }); - describe('Team Header Usage', async() => { + describe('Team Header Usage', () => { it('should navigate to team channels view', async() => { await element(by.id('room-view-header-team-channels')).tap(); await waitFor(element(by.id('team-channels-view'))).toExist().withTimeout(5000); }); - }) + }); - describe('Team Channels Header', async() => { + describe('Team Channels Header', () => { it('should have actions button ', async() => { await expect(element(by.id('room-header'))).toExist(); }); - - it('should have team channels button ', async() => { + + it('should have team channels button ', async() => { await expect(element(by.id('team-channels-view-create'))).toExist(); }); @@ -90,10 +89,10 @@ describe('Team', () => { }); }); - describe('Team Channels Header Usage', async() => { + describe('Team Channels Header Usage', () => { it('should navigate to add team channels view', async() => { await element(by.id('team-channels-view-create')).tap(); - await waitFor(element(by.id('add-channel-team-view'))).toExist().withTimeout(5000); + await waitFor(element(by.id('add-channel-team-view'))).toExist().withTimeout(5000); }); it('should have create new button', async() => { @@ -103,11 +102,10 @@ describe('Team', () => { it('should add existing button', async() => { await waitFor(element(by.id('add-channel-team-view-add-existing'))).toExist().withTimeout(5000); }); - }) + }); - describe('Channels', async() => { + describe('Channels', () => { it('should create new channel for team', async() => { - await element(by.id('add-channel-team-view-create-channel')).tap(); await element(by.id('select-users-view-search')).replaceText('rocket.cat'); @@ -138,12 +136,11 @@ describe('Team', () => { }); it('should add existing channel to team', async() => { - await element(by.id('team-channels-view-create')).tap(); await waitFor(element(by.id('add-channel-team-view'))).toExist().withTimeout(5000); await element(by.id('add-channel-team-view-add-existing')).tap(); - await waitFor(element(by.id('add-existing-channel-view'))).toExist().withTimeout(60000) + await waitFor(element(by.id('add-existing-channel-view'))).toExist().withTimeout(60000); await expect(element(by.id(`add-existing-channel-view-item-${ existingRoom }`))).toExist(); await element(by.id(`add-existing-channel-view-item-${ existingRoom }`)).tap(); await waitFor(element(by.id('add-existing-channel-view-submit'))).toExist().withTimeout(6000); @@ -174,14 +171,14 @@ describe('Team', () => { await waitFor(element(by.id('auto-join-tag'))).toBeNotVisible().withTimeout(5000); await waitFor(element(by.id(`rooms-list-view-item-${ existingRoom }`))).toExist().withTimeout(6000); }); - }) + }); - describe('Team actions', () => { + describe('Team actions', () => { before(async() => { await tapBack(); await navigateToRoomActions(); }); - + it('should add users to the team', async() => { await waitFor(element(by.id('room-actions-add-user'))).toExist().withTimeout(10000); await element(by.id('room-actions-add-user')).tap(); @@ -214,9 +211,9 @@ describe('Team', () => { await element(by.id('room-actions-leave-channel')).tap(); await waitFor(element(by.id('select-list-view'))).toExist().withTimeout(2000); - await waitFor(element(by.id(`select-list-view-item-${room}`))).toExist().withTimeout(2000); - await waitFor(element(by.id(`select-list-view-item-${existingRoom}`))).toExist().withTimeout(2000); - await element(by.id(`select-list-view-item-${room}`)).tap(); + await waitFor(element(by.id(`select-list-view-item-${ room }`))).toExist().withTimeout(2000); + await waitFor(element(by.id(`select-list-view-item-${ existingRoom }`))).toExist().withTimeout(2000); + await element(by.id(`select-list-view-item-${ room }`)).tap(); await waitFor(element(by.label('You are the last owner of this channel. Once you leave the team, the channel will be kept inside the team but you will be managing it from outside.'))).toExist().withTimeout(2000); await element(by.text('OK')).tap(); @@ -227,8 +224,8 @@ describe('Team', () => { await tapBack(); await waitFor(element(by.id('room-actions-view'))).toExist().withTimeout(2000); }); - - describe('Room Members', async() => { + + describe('Room Members', () => { before(async() => { await element(by.id('room-actions-members')).tap(); await waitFor(element(by.id('room-members-view'))).toExist().withTimeout(2000); @@ -278,9 +275,9 @@ describe('Team', () => { await element(by.id('room-actions-leave-channel')).tap(); await waitFor(element(by.id('select-list-view'))).toExist().withTimeout(2000); - await waitFor(element(by.id(`select-list-view-item-${room}`))).toExist().withTimeout(2000); - await waitFor(element(by.id(`select-list-view-item-${existingRoom}`))).toExist().withTimeout(2000); - await element(by.id(`select-list-view-item-${room}`)).tap(); + await waitFor(element(by.id(`select-list-view-item-${ room }`))).toExist().withTimeout(2000); + await waitFor(element(by.id(`select-list-view-item-${ existingRoom }`))).toExist().withTimeout(2000); + await element(by.id(`select-list-view-item-${ room }`)).tap(); await waitFor(element(by.label('You are the last owner of this channel. Once you leave the team, the channel will be kept inside the team but you will be managing it from outside.'))).toExist().withTimeout(2000); await element(by.text('OK')).tap(); @@ -291,4 +288,4 @@ describe('Team', () => { }); }); }); -}); \ No newline at end of file +}); diff --git a/e2e/tests/team/03-moveconvert.spec.js b/e2e/tests/team/03-moveconvert.spec.js index 17143c609..754aafc09 100644 --- a/e2e/tests/team/03-moveconvert.spec.js +++ b/e2e/tests/team/03-moveconvert.spec.js @@ -1,8 +1,7 @@ -const { - device, expect, element, by, waitFor -} = require('detox'); const data = require('../../data'); -const { navigateToLogin, login, tapBack, searchRoom, sleep } = require('../../helpers/app'); +const { + navigateToLogin, login, tapBack, searchRoom, sleep +} = require('../../helpers/app'); const toBeConverted = `to-be-converted-${ data.random }`; const toBeMoved = `to-be-moved-${ data.random }`; @@ -21,7 +20,7 @@ const createChannel = async(room) => { await tapBack(); await waitFor(element(by.id('rooms-list-view'))).toExist().withTimeout(2000); await waitFor(element(by.id(`rooms-list-view-item-${ room }`))).toExist().withTimeout(60000); -} +}; async function navigateToRoom(room) { await searchRoom(`${ room }`); @@ -42,7 +41,7 @@ describe('Move/Convert Team', () => { await login(data.users.regular.username, data.users.regular.password); }); - describe('Convert', async() => { + describe('Convert', () => { before(async() => { await createChannel(toBeConverted); }); @@ -52,7 +51,7 @@ describe('Move/Convert Team', () => { await element(by.id('room-actions-scrollview')).scrollTo('bottom'); await waitFor(element(by.id('room-actions-convert-to-team'))).toExist().withTimeout(2000); 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 waitFor(element(by.id('room-view'))).toExist().withTimeout(20000); await waitFor(element(by.id(`room-view-title-${ toBeConverted }`))).toExist().withTimeout(6000); @@ -61,10 +60,10 @@ describe('Move/Convert Team', () => { after(async() => { await tapBack(); await waitFor(element(by.id('rooms-list-view'))).toExist().withTimeout(2000); - }) + }); }); - describe('Move', async() => { + describe('Move', () => { before(async() => { await createChannel(toBeMoved); }); @@ -78,12 +77,39 @@ describe('Move/Convert Team', () => { await element(by.id('select-list-view-submit')).tap(); await sleep(2000); await waitFor(element(by.id('select-list-view'))).toExist().withTimeout(2000); - await waitFor(element(by.id(`select-list-view-item-${toBeConverted}`))).toExist().withTimeout(2000); - await element(by.id(`select-list-view-item-${toBeConverted}`)).tap(); + await waitFor(element(by.id(`select-list-view-item-${ toBeConverted }`))).toExist().withTimeout(2000); + await element(by.id(`select-list-view-item-${ toBeConverted }`)).tap(); await element(by.id('select-list-view-submit')).atIndex(0).tap(); await waitFor(element(by.label('After reading the previous intructions about this behavior, do you still want to move this channel to the selected team?'))).toExist().withTimeout(2000); await element(by.text('Yes, move it!')).tap(); 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); + }); + }); }); diff --git a/ios/RocketChatRN.xcodeproj/project.pbxproj b/ios/RocketChatRN.xcodeproj/project.pbxproj index bbebd2ee7..2c24aa093 100644 --- a/ios/RocketChatRN.xcodeproj/project.pbxproj +++ b/ios/RocketChatRN.xcodeproj/project.pbxproj @@ -1694,7 +1694,7 @@ INFOPLIST_FILE = NotificationService/Info.plist; IPHONEOS_DEPLOYMENT_TARGET = 11.0; 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_FAST_MATH = YES; PRODUCT_BUNDLE_IDENTIFIER = chat.rocket.reactnative.NotificationService; @@ -1731,7 +1731,7 @@ INFOPLIST_FILE = NotificationService/Info.plist; IPHONEOS_DEPLOYMENT_TARGET = 11.0; 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; PRODUCT_BUNDLE_IDENTIFIER = chat.rocket.reactnative.NotificationService; PRODUCT_NAME = "$(TARGET_NAME)"; diff --git a/ios/RocketChatRN/Info.plist b/ios/RocketChatRN/Info.plist index 4357a8abb..bc30c1441 100644 --- a/ios/RocketChatRN/Info.plist +++ b/ios/RocketChatRN/Info.plist @@ -23,7 +23,7 @@ CFBundlePackageType APPL CFBundleShortVersionString - 4.17.0 + 4.18.0 CFBundleSignature ???? CFBundleURLTypes diff --git a/ios/ShareRocketChatRN/Info.plist b/ios/ShareRocketChatRN/Info.plist index e38798d73..5db7e5aef 100644 --- a/ios/ShareRocketChatRN/Info.plist +++ b/ios/ShareRocketChatRN/Info.plist @@ -21,7 +21,7 @@ CFBundlePackageType XPC! CFBundleShortVersionString - 4.17.0 + 4.18.0 CFBundleVersion 1 KeychainGroup diff --git a/package.json b/package.json index 7e0e5d6da..f338cbadb 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "rocket-chat-reactnative", - "version": "4.17.0", + "version": "4.18.0", "private": true, "scripts": { "start": "react-native start", diff --git a/patches/react-native+0.63.4.patch b/patches/react-native+0.63.4.patch new file mode 100644 index 000000000..efadfe80b --- /dev/null +++ b/patches/react-native+0.63.4.patch @@ -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 { + // 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]}, +