From 6ca7a2040d43d96ab4949b919696778d2d774b01 Mon Sep 17 00:00:00 2001 From: N-Pex Date: Thu, 27 May 2021 12:16:12 +0200 Subject: [PATCH 1/6] Simplify room creation and improve "room welcome header" for new rooms. Issue #127. --- src/assets/translations/en.json | 15 +++--- src/components/CreateRoom.vue | 45 ++++++++++++------ src/components/CreatedRoomWelcomeHeader.vue | 52 ++++++++++++++++++--- src/components/roomInfoMixin.js | 14 ++++++ src/services/matrix.service.js | 11 +++++ 5 files changed, 112 insertions(+), 25 deletions(-) diff --git a/src/assets/translations/en.json b/src/assets/translations/en.json index 660c89b..e47c8a6 100644 --- a/src/assets/translations/en.json +++ b/src/assets/translations/en.json @@ -11,7 +11,8 @@ "send": "Send", "back": "BACK", "login": "Login", - "logout": "Logout" + "logout": "Logout", + "new_room": "New Room" }, "message": { "you": "You", @@ -56,16 +57,19 @@ "room_welcome": { "welcome": "Welcome!", "info": "Here are a few things to know about your group:", - "join_public": "Anyone can join by opening this link: {link}", + "encrypted": "Messages are end-to-end encrypted.", + "room_history_is": "Room history is {type}.", + "join_public": "Anyone can join by opening this link: {link}.", "join_invite": "Only people you invite can join.", "info_permissions": "You can change 'join permissions' and 'message history' at any time in the group settings.", "got_it": "Got it" }, "new_room": { - "new_room": "New Group", - "done": "Done", + "new_room": "New Room", + "create": "Create", "next": "Next", "name_room": "Name group", + "room_topic": "Add a description if you like", "join_permissions": "Join permissions", "set_join_permissions": "Set Join Permissions", "join_permissions_info": "These permissions determine how people can join the group and how easily others can be invited. They can be changed anytime.", @@ -161,8 +165,7 @@ }, "room_info_sheet": { "this_room": "This group", - "view_details": "View details", - "create_room": "Create group" + "view_details": "View details" }, "voice_recorder": { "swipe_to_cancel": "Swipe to cancel", diff --git a/src/components/CreateRoom.vue b/src/components/CreateRoom.vue index 4093743..03bd20b 100644 --- a/src/components/CreateRoom.vue +++ b/src/components/CreateRoom.vue @@ -13,7 +13,7 @@ arrow_back {{ $t("menu.back") }} - - + --> @@ -75,14 +75,16 @@ - - + + camera_alt - + + + + + {{$t('new_room.create')}} -
-
{{ $t("new_room.join_permissions") }}
+ +
{{ status }}
-
+
{ this.roomId = roomId; @@ -476,7 +495,7 @@ export default { (error.data && error.data.error) || error.message || error.toString(); - this.step = steps.NAME_SET; // revert + this.step = steps.INITIAL; // revert return null; }); }, diff --git a/src/components/CreatedRoomWelcomeHeader.vue b/src/components/CreatedRoomWelcomeHeader.vue index 7197e57..0b8620b 100644 --- a/src/components/CreatedRoomWelcomeHeader.vue +++ b/src/components/CreatedRoomWelcomeHeader.vue @@ -1,12 +1,28 @@ @@ -17,6 +33,30 @@ import roomInfoMixin from "./roomInfoMixin"; export default { name: "CreatedRoomWelcomeHeader", mixins: [roomInfoMixin], + computed: { + roomHistoryDescription() { + const visibility = this.$matrix.getRoomHistoryVisibility(this.room); + switch (visibility) { + case "world_readable": + return this.$t("room_welcome.room_history_is", { + type: this.$t("message.room_history_world_readable"), + }); + case "shared": + return this.$t("room_welcome.room_history_is", { + type: this.$t("message.room_history_shared"), + }); + case "invited": + return this.$t("room_welcome.room_history_is", { + type: this.$t("message.room_history_invited"), + }); + case "joined": + return this.$t("room_welcome.room_history_is", { + type: this.$t("message.room_history_joined"), + }); + } + return null; + }, + }, }; diff --git a/src/components/roomInfoMixin.js b/src/components/roomInfoMixin.js index 7c1ca30..83ad8d4 100644 --- a/src/components/roomInfoMixin.js +++ b/src/components/roomInfoMixin.js @@ -41,6 +41,13 @@ export default { return ""; }, + roomIsEncrypted() { + if (this.room) { + return this.$matrix.matrixClient.isRoomEncrypted(this.room.roomId); + } + return false; + }, + publicRoomLink() { if (this.room && this.roomJoinRule == "public") { return this.$router.getRoomLink( @@ -49,6 +56,13 @@ export default { } return null; }, + + roomHistory() { + if (this.room) { + return this.room.shouldEncryptForInvitedMembers() + } + return false; + } }, watch: { room: { diff --git a/src/services/matrix.service.js b/src/services/matrix.service.js index 00d4013..9f26ecf 100644 --- a/src/services/matrix.service.js +++ b/src/services/matrix.service.js @@ -440,6 +440,17 @@ export default { return null; }, + getRoomHistoryVisibility(room) { + if (room) { + const historyVisibility = room.currentState.getStateEvents( + "m.room.history_visibility", + "" + ); + return historyVisibility && historyVisibility.getContent().history_visibility; + } + return null; + }, + leaveRoom(roomId) { return this.matrixClient.leave(roomId, undefined) .then(() => { From e9a1633083414be9e6a8f2b5464d00ce9eeeedcc Mon Sep 17 00:00:00 2001 From: N-Pex Date: Thu, 27 May 2021 12:17:08 +0200 Subject: [PATCH 2/6] Move "new room" to top of list Issue #67. --- src/components/RoomInfoBottomSheet.vue | 9 +-------- src/components/RoomList.vue | 13 +++++++++++++ 2 files changed, 14 insertions(+), 8 deletions(-) diff --git a/src/components/RoomInfoBottomSheet.vue b/src/components/RoomInfoBottomSheet.vue index 8fbdadd..d6bbec0 100644 --- a/src/components/RoomInfoBottomSheet.vue +++ b/src/components/RoomInfoBottomSheet.vue @@ -21,14 +21,7 @@ >{{$t('room_info_sheet.view_details')}} - - {{$t('room_info_sheet.create_room')}} + diff --git a/src/components/RoomList.vue b/src/components/RoomList.vue index 25a1413..ea1bcc8 100644 --- a/src/components/RoomList.vue +++ b/src/components/RoomList.vue @@ -20,6 +20,15 @@
{{title}}
+ + + + + + {{$t('menu.new_room')}} + + + @@ -53,6 +62,10 @@ export default { showInvites: { type: Boolean, default: false + }, + showCreate: { + type: Boolean, + default: false } }, From 86f03c0fc2fdf3ee78defdaaaae6a444db73458f Mon Sep 17 00:00:00 2001 From: N-Pex Date: Thu, 27 May 2021 13:38:57 +0200 Subject: [PATCH 3/6] Purge room work For issue #118. Now with better status and error. Also, make sure to set global flag "no warning for unknown devices" while we are redacting events. --- src/assets/translations/en.json | 12 ++++++++++-- src/components/PurgeRoomDialog.vue | 26 +++++++++++++++++++++----- src/main.js | 2 +- src/services/matrix.service.js | 14 ++++++++++++-- 4 files changed, 44 insertions(+), 10 deletions(-) diff --git a/src/assets/translations/en.json b/src/assets/translations/en.json index e47c8a6..0bbcda2 100644 --- a/src/assets/translations/en.json +++ b/src/assets/translations/en.json @@ -48,11 +48,19 @@ "user_is_typing": "{user} is typing", "users_are_typing": "{count} members are typing", "room_powerlevel_change": "{user} changed powerlevel of {changes}", - "user_powerlevel_change_from_to": "{user} from {powerOld} to {powerNew}" + "user_powerlevel_change_from_to": "{user} from {powerOld} to {powerNew}", + "user_changed_guest_access_closed": "{user} disallowed guests to join the room", + "user_changed_guest_access_open": "{user} allowed guests to join the room" }, "room": { "members": "no members | 1 member | {count} members", - "leave": "Leave" + "leave": "Leave", + "purge_set_room_state": "Setting room state", + "purge_redacting_events": "Redacting events", + "purge_removing_members": "Removing members", + "purge_failed": "Failed to purge room!", + "room_list_invites": "Invites", + "room_list_rooms": "Rooms" }, "room_welcome": { "welcome": "Welcome!", diff --git a/src/components/PurgeRoomDialog.vue b/src/components/PurgeRoomDialog.vue index 37aa355..f76a766 100644 --- a/src/components/PurgeRoomDialog.vue +++ b/src/components/PurgeRoomDialog.vue @@ -3,9 +3,12 @@
@@ -16,8 +19,9 @@ text block class="text-button" + :disabled="isPurging" @click="showDialog = false" - >{{$t('menu.cancel')}}{{ $t("menu.cancel") }} @@ -26,8 +30,9 @@ depressed block class="filled-button" + :disabled="isPurging" @click.stop="onPurgeRoom()" - >{{$t('purge_room.button')}}{{ $t("purge_room.button") }} @@ -52,6 +57,8 @@ export default { data() { return { showDialog: false, + isPurging: false, + status: null, }; }, watch: { @@ -69,8 +76,9 @@ export default { methods: { onPurgeRoom() { + this.isPurging = true; this.$matrix - .purgeRoom(this.room.roomId) + .purgeRoom(this.room.roomId, this.onPurgeStatus) .then(() => { this.showDialog = false; console.log("Purged room"); @@ -78,8 +86,16 @@ export default { }) .catch((err) => { console.error("Error purging", err); + this.status = this.$t("room.purge_failed"); + }) + .finally(() => { + this.isPurging = false; }); }, + + onPurgeStatus(message) { + this.status = message; + }, }, }; diff --git a/src/main.js b/src/main.js index 9b17b0e..d7570e7 100644 --- a/src/main.js +++ b/src/main.js @@ -24,7 +24,7 @@ Vue.config.productionTip = false Vue.use(VueResize); Vue.use(VEmojiPicker); -Vue.use(matrix, { store: store }); +Vue.use(matrix, { store: store, i18n: i18n }); Vue.use(cleaninsights); Vue.use(VueClipboard); diff --git a/src/services/matrix.service.js b/src/services/matrix.service.js index 9f26ecf..440c71b 100644 --- a/src/services/matrix.service.js +++ b/src/services/matrix.service.js @@ -15,10 +15,11 @@ export default { } const store = options.store; + const i18n = options.i18n; const matrixService = new Vue({ store, - + i18n, data() { return { matrixClient: null, @@ -471,7 +472,8 @@ export default { * - Kick all members * @param roomId */ - purgeRoom(roomId) { + purgeRoom(roomId, statusCallback) { + const oldGlobalErrorSetting = this.matrixClient.getGlobalErrorOnUnknownDevices(); return new Promise((resolve, reject) => { const room = this.getRoom(roomId); if (!room) { @@ -487,6 +489,7 @@ export default { const self = this; console.log("Purge: set invite only"); + statusCallback(this.$t('room.purge_set_room_state')); this.matrixClient.sendStateEvent( roomId, "m.room.join_rules", @@ -530,6 +533,9 @@ export default { }) .then(() => { console.log("Purge: redact events"); + statusCallback(this.$t('room.purge_redacting_events')); + // First ignore unknown device errors + this.matrixClient.setGlobalErrorOnUnknownDevices(false); var redactionPromises = []; timelineWindow.getEvents().forEach(event => { if (!event.isRedacted() && !event.isRedaction() && !event.isState()) { @@ -541,6 +547,7 @@ export default { }) .then(() => { console.log("Purge: kick members"); + statusCallback(this.$t('room.purge_removing_members')); var joined = room.getMembersWithMembership("join"); var invited = room.getMembersWithMembership("invite"); var members = joined.concat(invited); @@ -554,10 +561,13 @@ export default { return Promise.all(kickPromises); }) .then(() => { + statusCallback(null); + this.matrixClient.setGlobalErrorOnUnknownDevices(oldGlobalErrorSetting); resolve(true); // Done! }) .catch((err) => { console.error("Error purging room", err); + this.matrixClient.setGlobalErrorOnUnknownDevices(oldGlobalErrorSetting); reject(err); }); }) From 9223db56a6524dd6186b54a07f4cd92a6d6c2a78 Mon Sep 17 00:00:00 2001 From: N-Pex Date: Thu, 27 May 2021 13:39:24 +0200 Subject: [PATCH 4/6] Handle m.room.guest_access events. --- src/components/Chat.vue | 5 +++ .../messages/RoomGuestAccessChanged.vue | 34 +++++++++++++++++++ 2 files changed, 39 insertions(+) create mode 100644 src/components/messages/RoomGuestAccessChanged.vue diff --git a/src/components/Chat.vue b/src/components/Chat.vue index 2a792e5..8428a88 100644 --- a/src/components/Chat.vue +++ b/src/components/Chat.vue @@ -451,6 +451,7 @@ import RoomAvatarChanged from "./messages/RoomAvatarChanged.vue"; import RoomHistoryVisibility from "./messages/RoomHistoryVisibility.vue"; import RoomJoinRules from "./messages/RoomJoinRules.vue"; import RoomPowerLevelsChanged from "./messages/RoomPowerLevelsChanged.vue"; +import RoomGuestAccessChanged from "./messages/RoomGuestAccessChanged.vue"; import RoomEncrypted from "./messages/RoomEncrypted.vue"; import DebugEvent from "./messages/DebugEvent.vue"; import util from "../plugins/utils"; @@ -530,6 +531,7 @@ export default { RoomHistoryVisibility, RoomJoinRules, RoomPowerLevelsChanged, + RoomGuestAccessChanged, RoomEncrypted, DebugEvent, MessageOperations, @@ -1049,6 +1051,9 @@ export default { case "m.room.power_levels": return RoomPowerLevelsChanged; + case "m.room.guest_access": + return RoomGuestAccessChanged; + case "m.room.encryption": return RoomEncrypted; } diff --git a/src/components/messages/RoomGuestAccessChanged.vue b/src/components/messages/RoomGuestAccessChanged.vue new file mode 100644 index 0000000..13d7f27 --- /dev/null +++ b/src/components/messages/RoomGuestAccessChanged.vue @@ -0,0 +1,34 @@ + + + + + \ No newline at end of file From 67d3c07c3019385f97f37c1c34692c09b03b55af Mon Sep 17 00:00:00 2001 From: N-Pex Date: Thu, 27 May 2021 13:39:38 +0200 Subject: [PATCH 5/6] Add "createRoom" as option to Home screen --- src/components/Home.vue | 6 +++++- src/components/RoomList.vue | 6 +++++- 2 files changed, 10 insertions(+), 2 deletions(-) diff --git a/src/components/Home.vue b/src/components/Home.vue index 03dabbd..9109fa0 100644 --- a/src/components/Home.vue +++ b/src/components/Home.vue @@ -1,6 +1,6 @@