Skip to content

Commit 83e6753

Browse files
RoomListStore: Remove invite rooms on decline (#29804)
* Remove room when new membership is leave It doesn't really matter what the previous membership was. * Fix test * Remove on join/invite only * Exclude kicked rooms from being removed
1 parent adc110a commit 83e6753

File tree

2 files changed

+43
-6
lines changed

2 files changed

+43
-6
lines changed

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

+12-2
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,7 @@ Please see LICENSE files in the repository root for full details.
66
*/
77

88
import { logger } from "matrix-js-sdk/src/logger";
9-
import { EventType } from "matrix-js-sdk/src/matrix";
9+
import { EventType, KnownMembership } from "matrix-js-sdk/src/matrix";
1010

1111
import type { EmptyObject, Room, RoomState } from "matrix-js-sdk/src/matrix";
1212
import type { MatrixDispatcher } from "../../dispatcher/dispatcher";
@@ -194,11 +194,21 @@ export class RoomListStoreV3Class extends AsyncStoreWithClient<EmptyObject> {
194194
case "MatrixActions.Room.myMembership": {
195195
const oldMembership = getEffectiveMembership(payload.oldMembership);
196196
const newMembership = getEffectiveMembershipTag(payload.room, payload.membership);
197-
if (oldMembership === EffectiveMembership.Join && newMembership === EffectiveMembership.Leave) {
197+
198+
const ownUserId = this.matrixClient.getSafeUserId();
199+
const isKicked = (payload.room as Room).getMember(ownUserId)?.isKicked();
200+
const shouldRemove =
201+
!isKicked &&
202+
(payload.oldMembership === KnownMembership.Invite ||
203+
payload.oldMembership === KnownMembership.Join) &&
204+
payload.membership === KnownMembership.Leave;
205+
206+
if (shouldRemove) {
198207
this.roomSkipList.removeRoom(payload.room);
199208
this.emit(LISTS_UPDATE_EVENT);
200209
return;
201210
}
211+
202212
if (oldMembership !== EffectiveMembership.Join && newMembership === EffectiveMembership.Join) {
203213
// If we're joining an upgraded room, we'll want to make sure we don't proliferate
204214
// the dead room in the list.

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

+31-4
Original file line numberDiff line numberDiff line change
@@ -122,11 +122,38 @@ describe("RoomListStoreV3", () => {
122122
expect(store.getSortedRooms()[0].roomId).toEqual(room.roomId);
123123
});
124124

125-
it("Room is removed when membership changes from join to leave", async () => {
126-
const { store, rooms, dispatcher } = await getRoomListStore();
125+
it.each([KnownMembership.Join, KnownMembership.Invite])(
126+
"Room is removed when membership changes to leave",
127+
async (membership) => {
128+
const { store, rooms, dispatcher } = await getRoomListStore();
129+
130+
// Let's say the user leaves room at index 37
131+
const room = rooms[37];
132+
133+
const payload = {
134+
action: "MatrixActions.Room.myMembership",
135+
oldMembership: membership,
136+
membership: KnownMembership.Leave,
137+
room,
138+
};
139+
140+
const fn = jest.fn();
141+
store.on(LISTS_UPDATE_EVENT, fn);
142+
dispatcher.dispatch(payload, true);
143+
144+
expect(fn).toHaveBeenCalled();
145+
expect(store.getSortedRooms()).not.toContain(room);
146+
},
147+
);
148+
149+
it("Room is not removed when user is kicked", async () => {
150+
const { store, rooms, dispatcher, client } = await getRoomListStore();
127151

128-
// Let's say the user leaves room at index 37
152+
// Let's say the user gets kicked out of room at index 37
129153
const room = rooms[37];
154+
const mockMember = room.getMember(client.getSafeUserId())!;
155+
mockMember.isKicked = () => true;
156+
room.getMember = () => mockMember;
130157

131158
const payload = {
132159
action: "MatrixActions.Room.myMembership",
@@ -140,7 +167,7 @@ describe("RoomListStoreV3", () => {
140167
dispatcher.dispatch(payload, true);
141168

142169
expect(fn).toHaveBeenCalled();
143-
expect(store.getSortedRooms()).not.toContain(room);
170+
expect(store.getSortedRooms()).toContain(room);
144171
});
145172

146173
it("Predecessor room is removed on room upgrade", async () => {

0 commit comments

Comments
 (0)