diff --git a/src/App.vue b/src/App.vue index 52ef75f..3e6596f 100644 --- a/src/App.vue +++ b/src/App.vue @@ -63,6 +63,13 @@ export default { }) .catch((error) => { console.log("Error creating client", error); + if (error.data.errcode ==='M_FORBIDDEN' && this.currentUser.is_guest) { + // Guest account and password don't work. We are in a strange state, probably because + // of server cleanup of accounts or similar. Wipe account and restart... + this.$store.commit("setUser", null); + this.$store.commit("setCurrentRoomId", null); + this.$navigation.push({ path: "/login" }, -1); + } }) .finally(() => { this.loading = false; @@ -87,16 +94,19 @@ export default { // Assigns available language for ex 'zh_Hans' when browser header language is 'zh' or 'zh-HK' this.availableJsonTranslation= LocalesArr[LocalesArr.findIndex(locale => locale.includes(lang))]; - if (this.$i18n.messages[this.browserLanguage]) { - this.$store.commit("setLanguage", this.browserLanguage); - } else if (this.browserLanguage.includes("-")) { - if (this.$i18n.messages[lang]) { - this.$store.commit("setLanguage", lang); + if (!this.$store.state.language) { + // Set default language if not set already + if (this.$i18n.messages[this.browserLanguage]) { + this.$store.commit("setLanguage", this.browserLanguage); + } else if (this.browserLanguage.includes("-")) { + if (this.$i18n.messages[lang]) { + this.$store.commit("setLanguage", lang); + } else { + this.$store.commit("setLanguage", this.availableJsonTranslation); + } } else { this.$store.commit("setLanguage", this.availableJsonTranslation); } - } else { - this.$store.commit("setLanguage", this.availableJsonTranslation); } // Set language diff --git a/src/assets/css/_utilities.scss b/src/assets/css/_utilities.scss index f7c4fd3..53f4bfb 100644 --- a/src/assets/css/_utilities.scss +++ b/src/assets/css/_utilities.scss @@ -18,3 +18,9 @@ .white-space-pre { white-space: pre; } +.v-visible { + visibility: visible; +} +.v-hidden { + visibility: hidden; +} \ No newline at end of file diff --git a/src/assets/css/chat.scss b/src/assets/css/chat.scss index 6ea6685..df5edc0 100644 --- a/src/assets/css/chat.scss +++ b/src/assets/css/chat.scss @@ -115,6 +115,11 @@ $admin-fg: white; background-color: $chat-background; overflow: hidden; + .chat-room-invitations { + padding: 10px; + background-color: #f2f2f2; + } + .chat-content { margin: 0; padding-top: $chat-standard-padding-s; @@ -818,7 +823,9 @@ $admin-fg: white; } .filled-button { - min-width: 180px !important; + @media #{map-get($display-breakpoints, 'sm-and-up')} { + min-width: 180px !important; + } } .v-card { @@ -826,6 +833,14 @@ $admin-fg: white; border-radius: 20px; } + .member .user-name { + margin-left: 6px; + } + + .member .start-private-chat { + margin-left: 38px; + } + .member::after { content: " "; display: block; diff --git a/src/assets/css/join.scss b/src/assets/css/join.scss index c57ddac..ab1d755 100644 --- a/src/assets/css/join.scss +++ b/src/assets/css/join.scss @@ -161,4 +161,8 @@ @media #{map-get($display-breakpoints, 'sm-and-down')} { margin: 10px; } + @media #{map-get($display-breakpoints, 'md-and-up')} { + width: $main-desktop-width; + margin: 0 auto; + } } diff --git a/src/assets/translations/en.json b/src/assets/translations/en.json index 34807c1..a5a28ea 100644 --- a/src/assets/translations/en.json +++ b/src/assets/translations/en.json @@ -1,235 +1,237 @@ { - "language_display_name": "English", - "project": { - "name": "Convene", - "tag_line": "Simply connect" - }, - "menu": { - "start_private_chat": "Private chat with this user", - "reply": "Reply", - "edit": "Edit", - "delete": "Delete", - "download": "Download", - "ok": "Ok", - "done": "Done", - "cancel": "Cancel", - "send": "Send", - "back": "BACK", - "login": "Login", - "logout": "Logout", - "new_room": "New Room", - "undo": "Undo", - "join": "Join", - "ignore": "Ignore", - "loading": "Loading {appName}" - }, - "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", - "user_said": "{user} said:", - "file_prefix": "File: ", - "edited": "(edited)", - "download_progress": "{percentage}% downloaded", - "upload_progress": "Uploaded {count}", - "upload_progress_with_total": "Uploaded {count} of {total}", - "user_changed_room_history": "{user} made room history {type}", - "room_history_world_readable": "readable by anyone", - "room_history_shared": "readable to all members in the room", - "room_history_invited": "readable to members from when they were invited", - "room_history_joined": "readable to members from when they joined", - "user_changed_join_rules": "{user} made the room {type}", - "room_joinrule_invite": "invite only", - "room_joinrule_public": "public", - "user_changed_room_name": "{user} changed room name to {name}", - "user_changed_room_topic": "{user} changed room topic to {topic}", - "unread_messages": "Unread messages", - "replying_to": "Replying to {user}", - "your_message": "Your message...", - "scale_image": "Scale image", - "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_changed_guest_access_closed": "{user} disallowed guests to join the room", - "user_changed_guest_access_open": "{user} allowed guests to join the room", - "reply_image": "Image", - "reply_audio_message": "Audio message", - "reply_video": "Video" - }, - "room": { - "members": "no members | 1 member | {count} members", - "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": { - "info": "Welcome! Here are a few things to know about your room:", - "encrypted": "Messages are end-to-end encrypted.", - "room_history_is": "Room history is {type}.", - "room_history_joined": "People can only see the messages sent after they join.", - "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’ at any time in the room settings.", - "got_it": "Got it" - }, - "new_room": { - "new_room": "New Room", - "create": "Create", - "next": "Next", - "name_room": "Name room", - "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 room and how easily others can be invited. They can be changed anytime.", - "get_link": "Get link", - "add_people": "Add people", - "link_copied": "Link copied!", - "public_info": "Anyone with a link", - "public_description": "Get a link to share", - "invite_info": "Only people added", - "invite_description": "Choose from a list or search by account ID", - "status_creating": "Creating room", - "status_avatar_total": "Uploading avatar: {count} of {total}", - "status_avatar": "Uploading avatar: {count}" - }, - "device_list": { - "title": "DEVICES", - "blocked": "Blocked", - "verified": "Verified", - "not_verified": "Not verified" - }, - "login": { - "title": "Login", - "username": "Username (ex: marta)", - "password": "Enter Password", - "username_required": "Username is required", - "password_required": "Password is required", - "login": "Login", - "create_room": "Register & Create Room", - "or": "OR", - "invalid_message": "Invalid username or password" - }, - "profile": { - "title": "My Profile", - "temporary_identity": "This identity is temporary. Set a password to use it again", - "set_password": "Set password", - "change_name": "Change name", - "change_password": "Change password", - "select_language": "Language", - "set_language": "Set your language", - "language_description": "Convene is available in many languages.", - "dont_see_yours": "Don't see yours?", - "tell_us": "Tell us.", - "password_old": "Old password", - "password_new": "New password", - "password_repeat": "Repeat new password", - "display_name": "Display name" - }, - "profile_info_popup": { - "you_are": "You are", - "identity": "{displayName}", - "identity_temporary": "{displayName}", - "edit_profile": "Edit profile", - "logout": "Logout", - "want_more": "Want more?", - "powered_by": "This room is powered by {product}. Learn more at {productLink} or go ahead and create another room!", - "new_room": "+ New room" - }, - "join": { - "title": "Welcome you have been invited to join", - "user_name_label": "User name", - "remember_me": "Remember me", - "joining_as": "You are joining as:", - "join": "Join room", - "enter_room": "Enter room", - "status_logging_in": "Logging in...", - "status_joining": "Joining room...", - "join_failed": "Failed to join room." - }, - "invite": { - "title": "Add Friends", - "done": "Done", - "send_invites_to": "Send invites to", - "status_inviting": "Inviting friend {index} of {count}", - "status_error": "Failed to invite one or or more friends!" - }, - "leave": { - "title_public": "Goodbye, {user}", - "text_public": "You can always join this room again if you know the link.", - "text_public_lastroom": "If you want to join this room again, you can join under a new identity. To keep {user}, {action}.", - "title_invite": "Are you sure you want to leave?", - "text_invite": "This room is locked. You cannot rejoin without a special permission.", - "create_account": "create an account", - "go_back": "Go back", - "leave": "Leave" - }, - "purge_room": { - "title": "Delete room?", - "info": "All members and messages will be removed. This action cannot be undone.", - "button": "Delete", - "n_seconds": "{seconds} seconds", - "self_destruct": "Room will self destruct in seconds.", - "deleting": "Deleting room:", - "notified": "We've notified members.", - "room_deletion_notice": "Time to say goodbye! This room has been deleted by {user}. It will self destruct in seconds." - }, - "goodbye": { - "room_deleted": "Room deleted.", - "close_tab": "Close browser tab", - "view_other_rooms": "View other rooms" - }, - "room_info": { - "title": "Room Details", - "created_by": "Created by {user}", - "permissions": "Join Permissions", - "join_invite": "Only People Added", - "join_public": "Anyone with a link", - "copy_link": "Copy invite link", - "link_copied": "Link copied!", - "purge": "Delete room", - "members": "Members", - "user": "{user}", - "user_you": "{user} (you)", - "hide_all": "Hide", - "show_all": "Show all >", - "leave_room": "Leave", - "version_info": "Powered by Guardian Project. Version: {version}", - "scan_code": "Scan to join the room" - }, - "room_info_sheet": { - "this_room": "This room", - "view_details": "View details" - }, - "voice_recorder": { - "swipe_to_cancel": "Swipe to cancel", - "release_to_cancel": "Release to cancel", - "failed_to_record": "Failed to record audio", - "not_supported_title": "Not supported", - "not_supported_text": "Unfortunately, this browser does not support audio recording." - }, - "power_level": { - "admin": "administrator", - "moderator": "moderator", - "default": "default", - "custom": "custom ({level})", - "restricted": "restricted" - }, - "fallbacks": { - "audio_file": "Audio file", - "video_file": "Video file", - "original_text": "", - "download_name": "Download" - } + "language_display_name": "English", + "project": { + "name": "Convene", + "tag_line": "Simply connect" + }, + "menu": { + "start_private_chat": "Private chat with this user", + "reply": "Reply", + "edit": "Edit", + "delete": "Delete", + "download": "Download", + "ok": "Ok", + "done": "Done", + "cancel": "Cancel", + "send": "Send", + "back": "BACK", + "login": "Login", + "logout": "Logout", + "new_room": "New Room", + "undo": "Undo", + "join": "Join", + "ignore": "Ignore", + "loading": "Loading {appName}" + }, + "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", + "user_said": "{user} said:", + "file_prefix": "File: ", + "edited": "(edited)", + "download_progress": "{percentage}% downloaded", + "upload_progress": "Uploaded {count}", + "upload_progress_with_total": "Uploaded {count} of {total}", + "user_changed_room_history": "{user} made room history {type}", + "room_history_world_readable": "readable by anyone", + "room_history_shared": "readable to all members in the room", + "room_history_invited": "readable to members from when they were invited", + "room_history_joined": "readable to members from when they joined", + "user_changed_join_rules": "{user} made the room {type}", + "room_joinrule_invite": "invite only", + "room_joinrule_public": "public", + "user_changed_room_name": "{user} changed room name to {name}", + "user_changed_room_topic": "{user} changed room topic to {topic}", + "unread_messages": "Unread messages", + "replying_to": "Replying to {user}", + "your_message": "Your message...", + "scale_image": "Scale image", + "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_changed_guest_access_closed": "{user} disallowed guests to join the room", + "user_changed_guest_access_open": "{user} allowed guests to join the room", + "reply_image": "Image", + "reply_audio_message": "Audio message", + "reply_video": "Video", + "time_ago": "Today | Yesterday | {count} days ago" + }, + "room": { + "invitations": "You have no invitations | You have 1 invitation | You have {count} invitations", + "members": "no members | 1 member | {count} members", + "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": { + "info": "Welcome! Here are a few things to know about your room:", + "encrypted": "Messages are end-to-end encrypted.", + "room_history_is": "Room history is {type}.", + "room_history_joined": "People can only see the messages sent after they join.", + "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’ at any time in the room settings.", + "got_it": "Got it" + }, + "new_room": { + "new_room": "New Room", + "create": "Create", + "next": "Next", + "name_room": "Name room", + "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 room and how easily others can be invited. They can be changed anytime.", + "get_link": "Get link", + "add_people": "Add people", + "link_copied": "Link copied!", + "public_info": "Anyone with a link", + "public_description": "Get a link to share", + "invite_info": "Only people added", + "invite_description": "Choose from a list or search by account ID", + "status_creating": "Creating room", + "status_avatar_total": "Uploading avatar: {count} of {total}", + "status_avatar": "Uploading avatar: {count}" + }, + "device_list": { + "title": "DEVICES", + "blocked": "Blocked", + "verified": "Verified", + "not_verified": "Not verified" + }, + "login": { + "title": "Login", + "username": "Username (ex: marta)", + "password": "Enter Password", + "username_required": "Username is required", + "password_required": "Password is required", + "login": "Login", + "create_room": "Register & Create Room", + "or": "OR", + "invalid_message": "Invalid username or password" + }, + "profile": { + "title": "My Profile", + "temporary_identity": "This identity is temporary. Set a password to use it again", + "set_password": "Set password", + "change_name": "Change name", + "change_password": "Change password", + "select_language": "Language", + "set_language": "Set your language", + "language_description": "Convene is available in many languages.", + "dont_see_yours": "Don't see yours?", + "tell_us": "Tell us.", + "password_old": "Old password", + "password_new": "New password", + "password_repeat": "Repeat new password", + "display_name": "Display name" + }, + "profile_info_popup": { + "you_are": "You are", + "identity": "{displayName}", + "identity_temporary": "{displayName}", + "edit_profile": "Edit profile", + "logout": "Logout", + "want_more": "Want more?", + "powered_by": "This room is powered by {product}. Learn more at {productLink} or go ahead and create another room!", + "new_room": "+ New room" + }, + "join": { + "title": "Welcome you have been invited to join", + "user_name_label": "User name", + "remember_me": "Remember me", + "joining_as": "You are joining as:", + "join": "Join room", + "enter_room": "Enter room", + "status_logging_in": "Logging in...", + "status_joining": "Joining room...", + "join_failed": "Failed to join room." + }, + "invite": { + "title": "Add Friends", + "done": "Done", + "send_invites_to": "Send invites to", + "status_inviting": "Inviting friend {index} of {count}", + "status_error": "Failed to invite one or or more friends!" + }, + "leave": { + "title_public": "Goodbye, {user}", + "text_public": "You can always join this room again if you know the link.", + "text_public_lastroom": "If you want to join this room again, you can join under a new identity. To keep {user}, {action}.", + "title_invite": "Are you sure you want to leave?", + "text_invite": "This room is locked. You cannot rejoin without a special permission.", + "create_account": "create an account", + "go_back": "Go back", + "leave": "Leave" + }, + "purge_room": { + "title": "Delete room?", + "info": "All members and messages will be removed. This action cannot be undone.", + "button": "Delete", + "n_seconds": "{seconds} seconds", + "self_destruct": "Room will self destruct in seconds.", + "deleting": "Deleting room:", + "notified": "We've notified members.", + "room_deletion_notice": "Time to say goodbye! This room has been deleted by {user}. It will self destruct in seconds." + }, + "goodbye": { + "room_deleted": "Room deleted.", + "close_tab": "Close browser tab", + "view_other_rooms": "View other rooms" + }, + "room_info": { + "title": "Room Details", + "created_by": "Created by {user}", + "permissions": "Join Permissions", + "join_invite": "Only People Added", + "join_public": "Anyone with a link", + "copy_link": "Copy invite link", + "link_copied": "Link copied!", + "purge": "Delete room", + "members": "Members", + "user": "{user}", + "user_you": "{user} (you)", + "hide_all": "Hide", + "show_all": "Show all >", + "leave_room": "Leave", + "version_info": "Powered by Guardian Project. Version: {version}", + "scan_code": "Scan to join the room" + }, + "room_info_sheet": { + "this_room": "This room", + "view_details": "View details" + }, + "voice_recorder": { + "swipe_to_cancel": "Swipe to cancel", + "release_to_cancel": "Release to cancel", + "failed_to_record": "Failed to record audio", + "not_supported_title": "Not supported", + "not_supported_text": "Unfortunately, this browser does not support audio recording." + }, + "power_level": { + "admin": "administrator", + "moderator": "moderator", + "default": "default", + "custom": "custom ({level})", + "restricted": "restricted" + }, + "fallbacks": { + "audio_file": "Audio file", + "video_file": "Video file", + "original_text": "", + "download_name": "Download" + } } diff --git a/src/components/BottomSheet.vue b/src/components/BottomSheet.vue index d6bf889..20e83ba 100644 --- a/src/components/BottomSheet.vue +++ b/src/components/BottomSheet.vue @@ -48,6 +48,7 @@ export default { mc: null, y: 0, startY: 0, + startYCoord: 0, isMove: false, state: this.defaultState, rect: {}, @@ -65,14 +66,20 @@ export default { const self = this; this.mc.on("panup pandown", (evt) => { - self.y = evt.center.y - 16; + self.y = self.startYCoord - (self.startY - evt.center.y); }); this.mc.on("panstart", (evt) => { self.startY = evt.center.y; + self.startYCoord = this.calcY(); self.isMove = true; }); + this.mc.on("pancancel", (ignoredEvt) => { + self.y = self.startYCoord; + self.isMove = false; + }); + this.mc.on("panend", (evt) => { self.isMove = false; diff --git a/src/components/Chat.vue b/src/components/Chat.vue index 0bdf05b..a86caf2 100644 --- a/src/components/Chat.vue +++ b/src/components/Chat.vue @@ -1,5 +1,8 @@ @@ -58,19 +80,24 @@ import LeaveRoomDialog from "../components/LeaveRoomDialog"; import ProfileInfoPopup from "../components/ProfileInfoPopup"; import profileInfoMixin from "../components/profileInfoMixin"; +import PurgeRoomDialog from "../components/PurgeRoomDialog"; + +import roomInfoMixin from "./roomInfoMixin"; export default { name: "ChatHeader", - mixins: [profileInfoMixin], + mixins: [profileInfoMixin, roomInfoMixin], components: { LeaveRoomDialog, ProfileInfoPopup, + PurgeRoomDialog }, data() { return { memberCount: null, showLeaveConfirmation: false, showProfileInfo: false, + showPurgeConfirmation: false }; }, mounted() { diff --git a/src/components/CreateRoom.vue b/src/components/CreateRoom.vue index 5619af9..a75836d 100644 --- a/src/components/CreateRoom.vue +++ b/src/components/CreateRoom.vue @@ -12,7 +12,7 @@ :disabled="step > steps.NAME_SET" > arrow_back - {{ $t("menu.back") }} + {{ $t("menu.back") }} -
- {{ $t("room_info.purge") }} -
-
{{ $t("room_info.version_info", { version: buildVersion }) }}
@@ -188,12 +177,6 @@ @close="showLeaveConfirmation = false" /> - - @@ -201,18 +184,17 @@ diff --git a/src/components/RoomList.vue b/src/components/RoomList.vue index a21f624..b78de3a 100644 --- a/src/components/RoomList.vue +++ b/src/components/RoomList.vue @@ -52,7 +52,7 @@ -
+
{{ notificationCount(room) }}
diff --git a/src/components/messages/AudioPlayer.vue b/src/components/messages/AudioPlayer.vue index e73c080..00157aa 100644 --- a/src/components/messages/AudioPlayer.vue +++ b/src/components/messages/AudioPlayer.vue @@ -45,6 +45,7 @@ export default { }; }, mounted() { + this.$root.$on('playback-start', this.onPlaybackStart); this.player = this.$refs.player; this.player.addEventListener("timeupdate", this.updateProgressBar); this.player.addEventListener("play", () => { @@ -58,6 +59,9 @@ export default { this.playing = false; }); }, + beforeDestroy() { + this.$root.$off('playback-start', this.onPlaybackStart); + }, computed: { currentTime() { return util.formatDuration(this.playTime); @@ -80,6 +84,7 @@ export default { methods: { play() { if (this.player.src) { + this.$root.$emit("playback-start", this); if (this.player.paused) { this.player.play(); } else if (this.player.ended) { @@ -107,6 +112,11 @@ export default { updateDuration() { this.duration = 1000 * this.player.duration; }, + onPlaybackStart(item) { + if (item != this && this.playing) { + this.pause(); + } + } }, }; diff --git a/src/components/messages/messageMixin.js b/src/components/messages/messageMixin.js index faa4351..4255022 100644 --- a/src/components/messages/messageMixin.js +++ b/src/components/messages/messageMixin.js @@ -88,10 +88,7 @@ export default { while (lines.length && !lines[0].startsWith('> ')) lines.shift(); // Reply fallback has a blank line after it, so remove it to prevent leading newline if (lines[0] === '') lines.shift(); - const text = lines - .map((item) => { return item.replace(/^> (<.*> )?/g, ''); }) - .reverse() - .join('\n'); + const text = lines[0].replace(/^> (<.*> )?/g, ''); if (text) { return text; } @@ -126,7 +123,7 @@ export default { /** * Classes to set for the message. Currently only for "messageIn", TODO: - detect messageIn or messageOut. */ - + messageClasses() { return {'messageIn':true,'from-admin':this.senderIsAdminOrModerator(this.event)} }, diff --git a/src/components/profileInfoMixin.js b/src/components/profileInfoMixin.js index 02bd1e5..7a9dd35 100644 --- a/src/components/profileInfoMixin.js +++ b/src/components/profileInfoMixin.js @@ -1,7 +1,7 @@ export default { computed: { user() { - if (!this.$matrix.matrixClient) { + if (!this.$matrix.ready) { return null; } return this.$matrix.matrixClient.getUser(this.$matrix.currentUserId); diff --git a/src/plugins/utils.js b/src/plugins/utils.js index ab3709f..ef40596 100644 --- a/src/plugins/utils.js +++ b/src/plugins/utils.js @@ -546,19 +546,15 @@ class Util { return t2.diff(t1, 'day'); } - formatDay(timestamp) { + dayDiffToday(timestamp) { var then = dayjs(timestamp).endOf('day'); var now = dayjs().endOf('day'); - const dayDiff = now.diff(then, 'day'); - if (dayDiff < 1) { - return "Today"; - } else if (dayDiff < 2) { - return "Yesterday"; - } else if (dayDiff < 7) { - return "" + dayDiff + " days ago"; - } else { - return then.format('L'); - } + return now.diff(then, 'day'); + } + + formatDay(timestamp) { + var then = dayjs(timestamp).endOf('day'); + return then.format('L'); } formatRecordDuration(ms) { diff --git a/src/services/matrix.service.js b/src/services/matrix.service.js index 8401bf0..dd205ee 100644 --- a/src/services/matrix.service.js +++ b/src/services/matrix.service.js @@ -391,8 +391,8 @@ export default { // Invitation. Need to call "recalculate" to pick // up room name, not sure why exactly. room.recalculate(); - this.reloadRooms(); } + this.reloadRooms(); }, onSessionLoggedOut() { @@ -409,12 +409,21 @@ export default { // we need to hang on to the generated password and use that to login to a new // session, so only wipe the token in s that case. // Clear the access token - var user = JSON.parse(this.$store.state.auth.user); + var user = this.$store.state.auth.user; if (user.is_guest) { delete user.access_token; this.$store.commit("setUser", user); + // Login again - this.login(user); + this.login(user).catch(error => { + if (error.data.errcode ==='M_FORBIDDEN' && this.currentUser.is_guest) { + // Guest account and password don't work. We are in a strange state, probably because + // of server cleanup of accounts or similar. Wipe account and restart... + this.$store.commit("setUser", null); + } + this.$store.commit("setCurrentRoomId", null); + this.$navigation.push({ path: "/login" }, -1); + }) } else { this.$store.commit("setUser", null); this.$store.commit("setCurrentRoomId", null); @@ -688,10 +697,14 @@ export default { for (const room of this.rooms) { // Is the other member the one we are looking for? if (this.isDirectRoomWith(room, userId)) { - var member = room.getMember(userId); - if (member && member.membership != "join") { - // Resend invite - this.matrixClient.invite(room.roomId, userId); + if (room.getMyMembership() == "invite") { + this.matrixClient.joinRoom(room.roomId); + } else { + var member = room.getMember(userId); + if (member && member.membership != "join") { + // Resend invite + this.matrixClient.invite(room.roomId, userId); + } } resolve(room); return; @@ -703,6 +716,7 @@ export default { const createRoomOptions = { visibility: "private", // Not listed! preset: "private_chat", + is_direct: true, initial_state: [ { type: "m.room.encryption", @@ -746,22 +760,18 @@ export default { */ isDirectRoomWith(room, userId) { if ( - room.selfMembership == "join" && - room.getInvitedAndJoinedMemberCount() == 2 + room.getJoinRule() == "invite" && + room.getMembers().length == 2 ) { - // Is the other member the one we are looking for? - if ( - room - .getMembersWithMembership("join") - .some((item) => item.userId == userId) - ) { - return true; - } else if ( - room - .getMembersWithMembership("invite") - .some((item) => item.userId == userId) - ) { - return true; + let other = room.getMember(userId); + if (other) { + if (room.getMyMembership() == "invite" && other.membership == "join") { + return true; + } else if (room.getMyMembership() == "join" && room.canInvite(this.currentUserId)) { + return true; + } else if (room.getMyMembership() == "join" && other.membership == "join") { + return true; + } } } return false;