Forget room when leaving
Also, don't flicker "join" view when knock is accepted. Issues #651 and #653
This commit is contained in:
parent
8ff0d6e6cb
commit
d9da540e40
2 changed files with 32 additions and 12 deletions
|
|
@ -1,6 +1,7 @@
|
||||||
<template>
|
<template>
|
||||||
<v-dialog
|
<v-dialog
|
||||||
v-model="showDialog"
|
v-model="showDialog"
|
||||||
|
v-bind="{ ...$attrs }"
|
||||||
class="ma-0 pa-0"
|
class="ma-0 pa-0"
|
||||||
:width="$vuetify.display.smAndUp ? '688px' : '95%'"
|
:width="$vuetify.display.smAndUp ? '688px' : '95%'"
|
||||||
scroll-strategy="none"
|
scroll-strategy="none"
|
||||||
|
|
@ -36,7 +37,6 @@
|
||||||
<p class="font-weight-light">{{ sharedRooms.slice(0, 3).join(", ") }}</p>
|
<p class="font-weight-light">{{ sharedRooms.slice(0, 3).join(", ") }}</p>
|
||||||
</template>
|
</template>
|
||||||
</div>
|
</div>
|
||||||
{{ message }}
|
|
||||||
<DeviceList :member="activeMember" />
|
<DeviceList :member="activeMember" />
|
||||||
<div class="py-3" v-if="activeMember.userId != $matrix.currentUserId">
|
<div class="py-3" v-if="activeMember.userId != $matrix.currentUserId">
|
||||||
<div v-if="activeMember.membership == 'knock'">
|
<div v-if="activeMember.membership == 'knock'">
|
||||||
|
|
|
||||||
|
|
@ -42,6 +42,7 @@ export default {
|
||||||
matrixClient: null,
|
matrixClient: null,
|
||||||
matrixClientReady: false,
|
matrixClientReady: false,
|
||||||
rooms: [],
|
rooms: [],
|
||||||
|
roomMap: {}, // Map id to room
|
||||||
userDisplayName: null,
|
userDisplayName: null,
|
||||||
userAvatar: null,
|
userAvatar: null,
|
||||||
currentRoom: null,
|
currentRoom: null,
|
||||||
|
|
@ -94,13 +95,13 @@ export default {
|
||||||
|
|
||||||
invites() {
|
invites() {
|
||||||
return this.rooms.filter((room) => {
|
return this.rooms.filter((room) => {
|
||||||
return room.getMyMembership() === "invite";
|
return room.getMyMembership() === "invite" && !room.autoJoining;
|
||||||
});
|
});
|
||||||
},
|
},
|
||||||
|
|
||||||
knockedRooms() {
|
knockedRooms() {
|
||||||
return this.rooms.filter((room) => {
|
return this.rooms.filter((room) => {
|
||||||
return room.getMyMembership() === "knock";
|
return room.getMyMembership() === "knock" || (room.getMyMembership() === "invite" && room.autoJoining);
|
||||||
});
|
});
|
||||||
},
|
},
|
||||||
|
|
||||||
|
|
@ -259,6 +260,7 @@ export default {
|
||||||
this.$store.commit("setUser", null);
|
this.$store.commit("setUser", null);
|
||||||
this.$store.commit("setCurrentRoomId", null);
|
this.$store.commit("setCurrentRoomId", null);
|
||||||
this.rooms = [];
|
this.rooms = [];
|
||||||
|
this.roomMap = {};
|
||||||
this.userDisplayName = null;
|
this.userDisplayName = null;
|
||||||
this.userAvatar = null;
|
this.userAvatar = null;
|
||||||
this.currentRoom = null;
|
this.currentRoom = null;
|
||||||
|
|
@ -429,7 +431,7 @@ export default {
|
||||||
case "m.room.join_rules":
|
case "m.room.join_rules":
|
||||||
{
|
{
|
||||||
const room = this.matrixClient.getRoom(event.getRoomId());
|
const room = this.matrixClient.getRoom(event.getRoomId());
|
||||||
if (room && room.getJoinRule() == "private" && room.getMyMembership() == "invite") {
|
if (room && room.getJoinRule() == "private" && room.getMyMembership() == "invite" && !room.autoJoining) {
|
||||||
// We have an invite to a room that's now "private"? This is most probably a deleted DM room.
|
// We have an invite to a room that's now "private"? This is most probably a deleted DM room.
|
||||||
// Reject the invite, i.e. call "leave" on it.
|
// Reject the invite, i.e. call "leave" on it.
|
||||||
this.matrixClient.leave(room.roomId);
|
this.matrixClient.leave(room.roomId);
|
||||||
|
|
@ -488,11 +490,21 @@ export default {
|
||||||
if (membership === "invite") {
|
if (membership === "invite") {
|
||||||
if (prevMembership === "knock") {
|
if (prevMembership === "knock") {
|
||||||
// This is someone accepting our knock! Auto-join.
|
// This is someone accepting our knock! Auto-join.
|
||||||
this.matrixClient.joinRoom(room.roomId);
|
room.autoJoining = true;
|
||||||
|
this.$nextTick(() => {
|
||||||
|
this.matrixClient.joinRoom(room.roomId)
|
||||||
|
.catch((err) => {
|
||||||
|
})
|
||||||
|
.finally(() => {
|
||||||
|
})
|
||||||
|
})
|
||||||
|
return;
|
||||||
}
|
}
|
||||||
// Invitation. Need to call "recalculate" to pick
|
// Invitation. Need to call "recalculate" to pick
|
||||||
// up room name, not sure why exactly.
|
// up room name, not sure why exactly.
|
||||||
room.recalculate();
|
room.recalculate();
|
||||||
|
} else if (membership === "join" || membership === "leave") {
|
||||||
|
room.autoJoining = false
|
||||||
}
|
}
|
||||||
this.reloadRooms();
|
this.reloadRooms();
|
||||||
},
|
},
|
||||||
|
|
@ -567,16 +579,24 @@ export default {
|
||||||
},
|
},
|
||||||
|
|
||||||
reloadRooms() {
|
reloadRooms() {
|
||||||
// TODO - do incremental update instead of replacing the whole array
|
|
||||||
// each time!
|
|
||||||
var updatedRooms = this.matrixClient.getVisibleRooms();
|
var updatedRooms = this.matrixClient.getVisibleRooms();
|
||||||
updatedRooms = updatedRooms.filter((room) => {
|
updatedRooms = updatedRooms.filter((room) => {
|
||||||
return room.getMyMembership() && ["invite", "join", "knock"].includes(room.getMyMembership()) && room.currentState.getStateEvents(STATE_EVENT_ROOM_DELETED).length == 0;
|
return room.getMyMembership() && ["invite", "join", "knock"].includes(room.getMyMembership()) && room.currentState.getStateEvents(STATE_EVENT_ROOM_DELETED).length == 0;
|
||||||
});
|
});
|
||||||
updatedRooms.forEach((room) => {
|
|
||||||
|
const newRooms = updatedRooms.filter((r) => !this.roomMap[r.roomId]);
|
||||||
|
const updatedRoomIds = updatedRooms.map((r) => r.roomId);
|
||||||
|
|
||||||
|
// remove rooms that are no longer there
|
||||||
|
const rooms = this.rooms.filter((r) => updatedRoomIds.includes(r.roomId));
|
||||||
|
|
||||||
|
newRooms.forEach((room) => {
|
||||||
room["avatar"] = room.getAvatarUrl(this.matrixClient.getHomeserverUrl(), 80, 80, "scale", true, this.useAuthedMedia);
|
room["avatar"] = room.getAvatarUrl(this.matrixClient.getHomeserverUrl(), 80, 80, "scale", true, this.useAuthedMedia);
|
||||||
});
|
});
|
||||||
this["rooms"] = updatedRooms;
|
this.rooms = [...rooms, ...newRooms];
|
||||||
|
let map = {};
|
||||||
|
this.rooms.forEach((r) => map[r.roomId] = r);
|
||||||
|
this.roomMap = map;
|
||||||
|
|
||||||
const resolvedId =
|
const resolvedId =
|
||||||
this.currentRoomId && this.currentRoomId.startsWith("#")
|
this.currentRoomId && this.currentRoomId.startsWith("#")
|
||||||
|
|
@ -658,10 +678,10 @@ export default {
|
||||||
return this.matrixClient.leave(roomId).then(() => {
|
return this.matrixClient.leave(roomId).then(() => {
|
||||||
this.$store.commit("setCurrentRoomId", null);
|
this.$store.commit("setCurrentRoomId", null);
|
||||||
this.rooms = this.rooms.filter((room) => {
|
this.rooms = this.rooms.filter((room) => {
|
||||||
room.roomId != roomId;
|
return room.roomId != roomId;
|
||||||
});
|
});
|
||||||
//this.matrixClient.store.removeRoom(roomId);
|
delete this.roomMap[roomId];
|
||||||
//this.matrixClient.forget(roomId, true, undefined);
|
this.matrixClient.forget(roomId, true);
|
||||||
});
|
});
|
||||||
},
|
},
|
||||||
|
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue