mirror of
https://github.com/vector-im/element-web.git
synced 2025-11-26 13:01:30 +01:00
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
This commit is contained in:
parent
adc110a8d9
commit
83e6753c4e
@ -6,7 +6,7 @@ Please see LICENSE files in the repository root for full details.
|
|||||||
*/
|
*/
|
||||||
|
|
||||||
import { logger } from "matrix-js-sdk/src/logger";
|
import { logger } from "matrix-js-sdk/src/logger";
|
||||||
import { EventType } from "matrix-js-sdk/src/matrix";
|
import { EventType, KnownMembership } from "matrix-js-sdk/src/matrix";
|
||||||
|
|
||||||
import type { EmptyObject, Room, RoomState } from "matrix-js-sdk/src/matrix";
|
import type { EmptyObject, Room, RoomState } from "matrix-js-sdk/src/matrix";
|
||||||
import type { MatrixDispatcher } from "../../dispatcher/dispatcher";
|
import type { MatrixDispatcher } from "../../dispatcher/dispatcher";
|
||||||
@ -194,11 +194,21 @@ export class RoomListStoreV3Class extends AsyncStoreWithClient<EmptyObject> {
|
|||||||
case "MatrixActions.Room.myMembership": {
|
case "MatrixActions.Room.myMembership": {
|
||||||
const oldMembership = getEffectiveMembership(payload.oldMembership);
|
const oldMembership = getEffectiveMembership(payload.oldMembership);
|
||||||
const newMembership = getEffectiveMembershipTag(payload.room, payload.membership);
|
const newMembership = getEffectiveMembershipTag(payload.room, payload.membership);
|
||||||
if (oldMembership === EffectiveMembership.Join && newMembership === EffectiveMembership.Leave) {
|
|
||||||
|
const ownUserId = this.matrixClient.getSafeUserId();
|
||||||
|
const isKicked = (payload.room as Room).getMember(ownUserId)?.isKicked();
|
||||||
|
const shouldRemove =
|
||||||
|
!isKicked &&
|
||||||
|
(payload.oldMembership === KnownMembership.Invite ||
|
||||||
|
payload.oldMembership === KnownMembership.Join) &&
|
||||||
|
payload.membership === KnownMembership.Leave;
|
||||||
|
|
||||||
|
if (shouldRemove) {
|
||||||
this.roomSkipList.removeRoom(payload.room);
|
this.roomSkipList.removeRoom(payload.room);
|
||||||
this.emit(LISTS_UPDATE_EVENT);
|
this.emit(LISTS_UPDATE_EVENT);
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (oldMembership !== EffectiveMembership.Join && newMembership === EffectiveMembership.Join) {
|
if (oldMembership !== EffectiveMembership.Join && newMembership === EffectiveMembership.Join) {
|
||||||
// If we're joining an upgraded room, we'll want to make sure we don't proliferate
|
// If we're joining an upgraded room, we'll want to make sure we don't proliferate
|
||||||
// the dead room in the list.
|
// the dead room in the list.
|
||||||
|
|||||||
@ -122,11 +122,38 @@ describe("RoomListStoreV3", () => {
|
|||||||
expect(store.getSortedRooms()[0].roomId).toEqual(room.roomId);
|
expect(store.getSortedRooms()[0].roomId).toEqual(room.roomId);
|
||||||
});
|
});
|
||||||
|
|
||||||
it("Room is removed when membership changes from join to leave", async () => {
|
it.each([KnownMembership.Join, KnownMembership.Invite])(
|
||||||
const { store, rooms, dispatcher } = await getRoomListStore();
|
"Room is removed when membership changes to leave",
|
||||||
|
async (membership) => {
|
||||||
|
const { store, rooms, dispatcher } = await getRoomListStore();
|
||||||
|
|
||||||
// Let's say the user leaves room at index 37
|
// Let's say the user leaves room at index 37
|
||||||
|
const room = rooms[37];
|
||||||
|
|
||||||
|
const payload = {
|
||||||
|
action: "MatrixActions.Room.myMembership",
|
||||||
|
oldMembership: membership,
|
||||||
|
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("Room is not removed when user is kicked", async () => {
|
||||||
|
const { store, rooms, dispatcher, client } = await getRoomListStore();
|
||||||
|
|
||||||
|
// Let's say the user gets kicked out of room at index 37
|
||||||
const room = rooms[37];
|
const room = rooms[37];
|
||||||
|
const mockMember = room.getMember(client.getSafeUserId())!;
|
||||||
|
mockMember.isKicked = () => true;
|
||||||
|
room.getMember = () => mockMember;
|
||||||
|
|
||||||
const payload = {
|
const payload = {
|
||||||
action: "MatrixActions.Room.myMembership",
|
action: "MatrixActions.Room.myMembership",
|
||||||
@ -140,7 +167,7 @@ describe("RoomListStoreV3", () => {
|
|||||||
dispatcher.dispatch(payload, true);
|
dispatcher.dispatch(payload, true);
|
||||||
|
|
||||||
expect(fn).toHaveBeenCalled();
|
expect(fn).toHaveBeenCalled();
|
||||||
expect(store.getSortedRooms()).not.toContain(room);
|
expect(store.getSortedRooms()).toContain(room);
|
||||||
});
|
});
|
||||||
|
|
||||||
it("Predecessor room is removed on room upgrade", async () => {
|
it("Predecessor room is removed on room upgrade", async () => {
|
||||||
|
|||||||
Loading…
x
Reference in New Issue
Block a user