Skip to content

Commit da87bbe

Browse files
Room List Store: Fix bug where left rooms appear in room list (#29452)
* Write failing test * Remove room when membership changes from JOIN to LEAVE
1 parent 4797644 commit da87bbe

File tree

2 files changed

+26
-0
lines changed

2 files changed

+26
-0
lines changed

src/stores/room-list-v3/RoomListStoreV3.ts

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -192,6 +192,11 @@ export class RoomListStoreV3Class extends AsyncStoreWithClient<EmptyObject> {
192192
case "MatrixActions.Room.myMembership": {
193193
const oldMembership = getEffectiveMembership(payload.oldMembership);
194194
const newMembership = getEffectiveMembershipTag(payload.room, payload.membership);
195+
if (oldMembership === EffectiveMembership.Join && newMembership === EffectiveMembership.Leave) {
196+
this.roomSkipList.removeRoom(payload.room);
197+
this.emit(LISTS_UPDATE_EVENT);
198+
return;
199+
}
195200
if (oldMembership !== EffectiveMembership.Join && newMembership === EffectiveMembership.Join) {
196201
// If we're joining an upgraded room, we'll want to make sure we don't proliferate
197202
// the dead room in the list.

test/unit-tests/stores/room-list-v3/RoomListStoreV3-test.ts

Lines changed: 21 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -104,6 +104,27 @@ describe("RoomListStoreV3", () => {
104104
expect(store.getSortedRooms()[0].roomId).toEqual(room.roomId);
105105
});
106106

107+
it("Room is removed when membership changes from join to leave", async () => {
108+
const { store, rooms, dispatcher } = await getRoomListStore();
109+
110+
// Let's say the user leaves room at index 37
111+
const room = rooms[37];
112+
113+
const payload = {
114+
action: "MatrixActions.Room.myMembership",
115+
oldMembership: KnownMembership.Join,
116+
membership: KnownMembership.Leave,
117+
room,
118+
};
119+
120+
const fn = jest.fn();
121+
store.on(LISTS_UPDATE_EVENT, fn);
122+
dispatcher.dispatch(payload, true);
123+
124+
expect(fn).toHaveBeenCalled();
125+
expect(store.getSortedRooms()).not.toContain(room);
126+
});
127+
107128
it("Predecessor room is removed on room upgrade", async () => {
108129
const { store, rooms, client, dispatcher } = await getRoomListStore();
109130
// Let's say that !foo32:matrix.org is being upgraded

0 commit comments

Comments
 (0)