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. 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