From 5a05daedb93ee5dda8ac166740db984dc86f911f Mon Sep 17 00:00:00 2001 From: R Midhun Suresh Date: Sun, 9 Mar 2025 15:42:14 +0530 Subject: [PATCH 1/2] Write failing test --- .../room-list-v3/RoomListStoreV3-test.ts | 21 +++++++++++++++++++ 1 file changed, 21 insertions(+) diff --git a/test/unit-tests/stores/room-list-v3/RoomListStoreV3-test.ts b/test/unit-tests/stores/room-list-v3/RoomListStoreV3-test.ts index 6d4b81239e7..4e0b6ea7c50 100644 --- a/test/unit-tests/stores/room-list-v3/RoomListStoreV3-test.ts +++ b/test/unit-tests/stores/room-list-v3/RoomListStoreV3-test.ts @@ -104,6 +104,27 @@ describe("RoomListStoreV3", () => { expect(store.getSortedRooms()[0].roomId).toEqual(room.roomId); }); + it("Room is removed when membership changes from join to leave", async () => { + const { store, rooms, dispatcher } = await getRoomListStore(); + + // Let's say the user leaves room at index 37 + const room = rooms[37]; + + const payload = { + action: "MatrixActions.Room.myMembership", + oldMembership: KnownMembership.Join, + membership: KnownMembership.Leave, + room, + }; + + const fn = jest.fn(); + store.on(LISTS_UPDATE_EVENT, fn); + dispatcher.dispatch(payload, true); + + expect(fn).toHaveBeenCalled(); + expect(store.getSortedRooms()).not.toContain(room); + }); + it("Predecessor room is removed on room upgrade", async () => { const { store, rooms, client, dispatcher } = await getRoomListStore(); // Let's say that !foo32:matrix.org is being upgraded From ac2d46ddd64468a82be0e37c6b6ff339afd3db4e Mon Sep 17 00:00:00 2001 From: R Midhun Suresh Date: Sun, 9 Mar 2025 15:42:49 +0530 Subject: [PATCH 2/2] Remove room when membership changes from JOIN to LEAVE --- src/stores/room-list-v3/RoomListStoreV3.ts | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/src/stores/room-list-v3/RoomListStoreV3.ts b/src/stores/room-list-v3/RoomListStoreV3.ts index df7246e95cc..f7b5dff6336 100644 --- a/src/stores/room-list-v3/RoomListStoreV3.ts +++ b/src/stores/room-list-v3/RoomListStoreV3.ts @@ -181,6 +181,11 @@ export class RoomListStoreV3Class extends AsyncStoreWithClient { case "MatrixActions.Room.myMembership": { const oldMembership = getEffectiveMembership(payload.oldMembership); const newMembership = getEffectiveMembershipTag(payload.room, payload.membership); + if (oldMembership === EffectiveMembership.Join && newMembership === EffectiveMembership.Leave) { + this.roomSkipList.removeRoom(payload.room); + this.emit(LISTS_UPDATE_EVENT); + return; + } if (oldMembership !== EffectiveMembership.Join && newMembership === EffectiveMembership.Join) { // If we're joining an upgraded room, we'll want to make sure we don't proliferate // the dead room in the list.