From 3c60ad4f140d4bfc914e1316cb5ba314f36bd14d Mon Sep 17 00:00:00 2001 From: N-Pex Date: Wed, 19 May 2021 13:22:28 +0200 Subject: [PATCH 01/10] Make app title configurable Issue #123 --- src/App.vue | 4 +++- src/assets/config.json | 1 + vue.config.js | 14 +++++++++++--- 3 files changed, 15 insertions(+), 4 deletions(-) diff --git a/src/App.vue b/src/App.vue index 1bad6de..0e1d17e 100644 --- a/src/App.vue +++ b/src/App.vue @@ -7,6 +7,8 @@ + + \ No newline at end of file From 878c60f4a105f60d315fa44dbda3e08bc87bdab4 Mon Sep 17 00:00:00 2001 From: N-Pex Date: Fri, 21 May 2021 16:27:39 +0200 Subject: [PATCH 08/10] Allow "createroom" to be accessed without account A new one will be generated. Issue #67. --- src/assets/translations/en.js | 3 + src/components/CreateRoom.vue | 209 ++++++++++++++++++++---- src/components/Join.vue | 20 +-- src/components/messages/RoomAliased.vue | 17 ++ src/router/index.js | 2 +- src/services/matrix.service.js | 13 ++ 6 files changed, 213 insertions(+), 51 deletions(-) create mode 100644 src/components/messages/RoomAliased.vue diff --git a/src/assets/translations/en.js b/src/assets/translations/en.js index ff86c44..55bb54c 100644 --- a/src/assets/translations/en.js +++ b/src/assets/translations/en.js @@ -15,9 +15,12 @@ export default { }, message: { you: "You", + user_created_room: "{user} created the room", + user_aliased_room: "{user} made the room alias {alias}", user_changed_display_name: "{user} changed display name to {displayName}", user_changed_avatar: "{user} changed the avatar", user_changed_room_avatar: "{user} changed the room avatar", + user_encrypted_room: "{user} made the room encrypted", user_was_invited: "{user} was invited to the chat...", user_joined: "{user} joined the chat", user_left: "{user} left the chat", diff --git a/src/components/CreateRoom.vue b/src/components/CreateRoom.vue index c58370b..4093743 100644 --- a/src/components/CreateRoom.vue +++ b/src/components/CreateRoom.vue @@ -2,7 +2,7 @@
-
{{$t('new_room.new_room')}}
+
{{ $t("new_room.new_room") }}
arrow_back - {{$t('menu.back')}} + {{ $t("menu.back") }} - {{ step == steps.CREATED ? $t('new_room.done') : $t('new_room.next') }} + {{ + step == steps.CREATED ? $t("new_room.done") : $t("new_room.next") + }}
+ @@ -49,9 +97,11 @@
-
{{$t('new_room.join_permissions')}}
-
{{$t('new_room.set_join_permissions')}}
-
{{$t('new_room.join_permissions_info')}}
+
{{ $t("new_room.join_permissions") }}
+
+ {{ $t("new_room.set_join_permissions") }} +
+
{{ $t("new_room.join_permissions_info") }}
link{{$t('new_room.get_link')}}link{{ $t("new_room.get_link") }} person_add{{$t('new_room.add_people')}}person_add{{ $t("new_room.add_people") }} - +
{{ status }}
@@ -155,24 +209,32 @@ export default { joinRules: [ { id: "public", - text: this.$t('new_room.public_info'), + text: this.$t("new_room.public_info"), icon: "link", - descr: this.$t('new_room.public_description'), + descr: this.$t("new_room.public_description"), }, { id: "invite", - text: this.$t('new_room.invite_info'), + text: this.$t("new_room.invite_info"), icon: "person_add", - descr: this.$t('new_room.invite_description'), + descr: this.$t("new_room.invite_description"), }, ], publicRoomLink: null, publicRoomLinkCopied: false, + availableAvatars: [], + selectedProfile: null, }; }, mounted() { this.joinRule = this.joinRules[0].id; // Set default + this.availableAvatars = util.getDefaultAvatars(); + this.selectAvatar( + this.availableAvatars[ + Math.floor(Math.random() * this.availableAvatars.length) + ] + ); }, watch: { @@ -187,6 +249,16 @@ export default { } return this.roomName.substring(0, 1).toUpperCase(); }, + currentUser() { + return this.$store.state.auth.user; + }, + canEditProfile() { + // If we have an account already, we can't edit profile here (need to go into profile view) + if (this.currentUser) { + return false; + } + return true; + }, }, methods: { @@ -261,8 +333,12 @@ export default { }, createRoom() { this.step = steps.CREATING; + + const hasUser = this.currentUser ? true : false; + var setProfileData = false; + var roomId; - this.status = this.$t('new_room.status_creating'); + this.status = this.$t("new_room.status_creating"); var createRoomOptions = {}; if (this.joinRule == "public") { createRoomOptions = { @@ -308,26 +384,87 @@ export default { // Add topic createRoomOptions.topic = this.roomTopic; } - return this.$matrix.matrixClient - .createRoom(createRoomOptions) - .then(({ room_id, room_alias }) => { - roomId = room_alias || room_id; - if (!this.roomAvatarFile) { - return true; - } - const self = this; - return util.setRoomAvatar( - this.$matrix.matrixClient, - room_id, - this.roomAvatarFile, - function (p) { - if (p.total) { - self.status = this.$t('new_room.status_avatar_total', {count: (p.loaded || 0), total: p.total}); - } else { - self.status = this.$t('new_room.status_avatar', {count: (p.loaded || 0)}); + + return this.$matrix + .getLoginPromise() + .then( + function (user) { + if (user.is_guest && !hasUser) { + // Newly created account, joining first room. + // Set avatar and display name to either the randomly chosen ones, or the + // ones the users has changed to. + setProfileData = true; + + // Set display name and avatar directly on the matrix object. + if ( + this.selectedProfile.name && + this.selectedProfile.name.length > 0 + ) { + this.$matrix.userDisplayName = this.selectedProfile.name; } } - ); + + if ( + !setProfileData || + !this.selectedProfile.name || + this.selectedProfile.name.length == 0 + ) { + return Promise.resolve(user); + } else { + console.log( + "CreateRoom: Set display name to: " + this.selectedProfile.name + ); + return this.$matrix.matrixClient.setDisplayName( + this.selectedProfile.name, + undefined + ); + } + }.bind(this) + ) + .then( + function () { + if (!setProfileData || !this.selectedProfile.image) { + console.log("CreateRoom: No avatar change"); + return Promise.resolve("no avatar"); + } else { + console.log("CreateRoom: Updating avatar"); + return util.setAvatar( + this.$matrix, + this.selectedProfile.image, + function (progress) { + console.log("Progress: " + JSON.stringify(progress)); + } + ); + } + }.bind(this) + ) + .then(() => { + return this.$matrix.matrixClient + .createRoom(createRoomOptions) + .then(({ room_id, room_alias }) => { + roomId = room_alias || room_id; + if (!this.roomAvatarFile) { + return true; + } + const self = this; + return util.setRoomAvatar( + this.$matrix.matrixClient, + room_id, + this.roomAvatarFile, + function (p) { + if (p.total) { + self.status = this.$t("new_room.status_avatar_total", { + count: p.loaded || 0, + total: p.total, + }); + } else { + self.status = this.$t("new_room.status_avatar", { + count: p.loaded || 0, + }); + } + } + ); + }); }) .then(() => { this.status = ""; @@ -384,6 +521,14 @@ export default { } ); }, + + selectAvatar(value) { + this.selectedProfile = Object.assign({}, value); // Make a copy, so editing does not destroy data + }, + + showAvatarPickerList() { + this.$refs.avatar.$refs.input.click(); + }, }, }; diff --git a/src/components/Join.vue b/src/components/Join.vue index 2e5b024..5c1696f 100644 --- a/src/components/Join.vue +++ b/src/components/Join.vue @@ -119,9 +119,7 @@ + + \ No newline at end of file diff --git a/src/router/index.js b/src/router/index.js index 8a088b0..a69fbc1 100644 --- a/src/router/index.js +++ b/src/router/index.js @@ -82,7 +82,7 @@ const router = new VueRouter({ }); router.beforeEach((to, from, next) => { - const publicPages = ['/login']; + const publicPages = ['/login','/createroom']; var authRequired = !publicPages.includes(to.path); const loggedIn = router.app.$store.state.auth.user; diff --git a/src/services/matrix.service.js b/src/services/matrix.service.js index c68025f..00d4013 100644 --- a/src/services/matrix.service.js +++ b/src/services/matrix.service.js @@ -269,6 +269,19 @@ export default { }) }, + /** + * Returns a promise that will log us into the Matrix. + * + * Will use a real account, if we have one, otherwise will create + * a random account. + */ + getLoginPromise() { + if (this.ready) { + return Promise.resolve(this.currentUser); + } + return this.$store.dispatch("login", this.currentUser || new User(config.defaultServer, "", "", true)); + }, + addMatrixClientListeners(client) { if (client) { client.on("event", this.onEvent); From 0ba10690e93cb699913303249e24d06b863df6bc Mon Sep 17 00:00:00 2001 From: N-Pex Date: Fri, 21 May 2021 16:27:59 +0200 Subject: [PATCH 09/10] Implement display of some missing status events --- src/components/Chat.vue | 15 +++++++++++++++ src/components/messages/RoomCreated.vue | 17 +++++++++++++++++ src/components/messages/RoomEncrypted.vue | 17 +++++++++++++++++ 3 files changed, 49 insertions(+) create mode 100644 src/components/messages/RoomCreated.vue create mode 100644 src/components/messages/RoomEncrypted.vue diff --git a/src/components/Chat.vue b/src/components/Chat.vue index f9858a4..c69fc4f 100644 --- a/src/components/Chat.vue +++ b/src/components/Chat.vue @@ -401,12 +401,15 @@ import ContactJoin from "./messages/ContactJoin.vue"; import ContactLeave from "./messages/ContactLeave.vue"; import ContactInvited from "./messages/ContactInvited.vue"; import ContactChanged from "./messages/ContactChanged.vue"; +import RoomCreated from "./messages/RoomCreated.vue"; +import RoomAliased from "./messages/RoomAliased.vue"; import RoomNameChanged from "./messages/RoomNameChanged.vue"; import RoomTopicChanged from "./messages/RoomTopicChanged.vue"; 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 RoomEncrypted from "./messages/RoomEncrypted.vue"; import DebugEvent from "./messages/DebugEvent.vue"; import util from "../plugins/utils"; import MessageOperations from "./messages/MessageOperations.vue"; @@ -477,12 +480,15 @@ export default { ContactLeave, ContactInvited, ContactChanged, + RoomCreated, + RoomAliased, RoomNameChanged, RoomTopicChanged, RoomAvatarChanged, RoomHistoryVisibility, RoomJoinRules, RoomPowerLevelsChanged, + RoomEncrypted, DebugEvent, MessageOperations, MessageOperationsPicker, @@ -974,6 +980,12 @@ export default { return MessageOutgoingText; } + case "m.room.create": + return RoomCreated; + + case "m.room.canonical_alias": + return RoomAliased; + case "m.room.name": return RoomNameChanged; @@ -991,6 +1003,9 @@ export default { case "m.room.power_levels": return RoomPowerLevelsChanged; + + case "m.room.encryption": + return RoomEncrypted; } return this.debugging ? DebugEvent : null; }, diff --git a/src/components/messages/RoomCreated.vue b/src/components/messages/RoomCreated.vue new file mode 100644 index 0000000..9603e0f --- /dev/null +++ b/src/components/messages/RoomCreated.vue @@ -0,0 +1,17 @@ + + + + + \ No newline at end of file diff --git a/src/components/messages/RoomEncrypted.vue b/src/components/messages/RoomEncrypted.vue new file mode 100644 index 0000000..669b6e7 --- /dev/null +++ b/src/components/messages/RoomEncrypted.vue @@ -0,0 +1,17 @@ + + + + + \ No newline at end of file From 473cabbc0236a266358fa536f48f2088285f215c Mon Sep 17 00:00:00 2001 From: N-Pex Date: Fri, 21 May 2021 16:28:23 +0200 Subject: [PATCH 10/10] Version 0.1.7 --- package.json | 2 +- package.json.bak | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/package.json b/package.json index 0a05bd1..4aa8d5e 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "keanuapp-weblite", - "version": "0.1.6", + "version": "0.1.7", "private": true, "scripts": { "serve": "vue-cli-service serve", diff --git a/package.json.bak b/package.json.bak index 70f54f9..0a05bd1 100644 --- a/package.json.bak +++ b/package.json.bak @@ -1,6 +1,6 @@ { "name": "keanuapp-weblite", - "version": "0.1.5", + "version": "0.1.6", "private": true, "scripts": { "serve": "vue-cli-service serve",