Improve edge cases with spaces context switching

This commit is contained in:
Michael Telatynski 2021-04-22 08:22:11 +01:00
parent 68fb9a78c4
commit ee80c27b2b

View file

@ -110,13 +110,14 @@ export class SpaceStoreClass extends AsyncStoreWithClient<IState> {
return this._suggestedRooms; return this._suggestedRooms;
} }
public async setActiveSpace(space: Room | null) { public async setActiveSpace(space: Room | null, contextSwitch = true) {
if (space === this.activeSpace) return; if (space === this.activeSpace) return;
this._activeSpace = space; this._activeSpace = space;
this.emit(UPDATE_SELECTED_SPACE, this.activeSpace); this.emit(UPDATE_SELECTED_SPACE, this.activeSpace);
this.emit(SUGGESTED_ROOMS, this._suggestedRooms = []); this.emit(SUGGESTED_ROOMS, this._suggestedRooms = []);
if (contextSwitch) {
// view last selected room from space // view last selected room from space
const roomId = window.localStorage.getItem(getLastViewedRoomsStorageKey(this.activeSpace)); const roomId = window.localStorage.getItem(getLastViewedRoomsStorageKey(this.activeSpace));
@ -135,6 +136,7 @@ export class SpaceStoreClass extends AsyncStoreWithClient<IState> {
action: "view_home_page", action: "view_home_page",
}); });
} }
}
// persist space selected // persist space selected
if (space) { if (space) {
@ -512,22 +514,11 @@ export class SpaceStoreClass extends AsyncStoreWithClient<IState> {
switch (payload.action) { switch (payload.action) {
case "view_room": { case "view_room": {
const room = this.matrixClient?.getRoom(payload.room_id); const room = this.matrixClient?.getRoom(payload.room_id);
if (!room) break;
// persist last viewed room from a space
// Don't save if the room is a space room. This would cause a problem:
// When switching to a space home, we first view that room and
// only after that we switch to that space. This causes us to
// save the space home to be the last viewed room in the home
// space.
if (room && !room.isSpaceRoom()) {
window.localStorage.setItem(getLastViewedRoomsStorageKey(this.activeSpace), payload.room_id);
}
if (room?.getMyMembership() === "join") {
if (room.isSpaceRoom()) { if (room.isSpaceRoom()) {
this.setActiveSpace(room); this.setActiveSpace(room);
} else if (!this.spaceFilteredRooms.get(this._activeSpace?.roomId || HOME_SPACE).has(room.roomId)) { } else if (!this.getSpaceFilteredRoomIds(this.activeSpace).has(room.roomId)) {
// TODO maybe reverse these first 2 clauses once space panel active is fixed // TODO maybe reverse these first 2 clauses once space panel active is fixed
let parent = this.rootSpaces.find(s => this.spaceFilteredRooms.get(s.roomId)?.has(room.roomId)); let parent = this.rootSpaces.find(s => this.spaceFilteredRooms.get(s.roomId)?.has(room.roomId));
if (!parent) { if (!parent) {
@ -538,10 +529,15 @@ export class SpaceStoreClass extends AsyncStoreWithClient<IState> {
parent = parents.find(p => this.matrixClient.getRoom(p)); parent = parents.find(p => this.matrixClient.getRoom(p));
} }
if (parent) { if (parent) {
this.setActiveSpace(parent); // don't trigger a context switch when we are switching a space to match the chosen room
} this.setActiveSpace(parent, false);
} }
} }
// Persist last viewed room from a space
// we don't await setActiveSpace above as we only care about this.activeSpace being up to date
// synchronously for the below code - everything else can and should be async.
window.localStorage.setItem(getLastViewedRoomsStorageKey(this.activeSpace), payload.room_id);
break; break;
} }
case "after_leave_room": case "after_leave_room":