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
This commit is contained in:
R Midhun Suresh
2025-03-10 17:28:12 +05:30
committed by GitHub
parent 47976447b5
commit da87bbe854
2 changed files with 26 additions and 0 deletions

View File

@@ -192,6 +192,11 @@ export class RoomListStoreV3Class extends AsyncStoreWithClient<EmptyObject> {
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.

View File

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