From 15f783d59d01fa815ed8c0dc850f2096cfdc67db Mon Sep 17 00:00:00 2001 From: Michael Telatynski <7t3chguy@gmail.com> Date: Fri, 7 Nov 2025 16:01:26 +0000 Subject: [PATCH 1/3] Fix room list handling of membership changes Including knock->invite for ask to join Signed-off-by: Michael Telatynski <7t3chguy@gmail.com> --- src/stores/room-list-v3/RoomListStoreV3.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/stores/room-list-v3/RoomListStoreV3.ts b/src/stores/room-list-v3/RoomListStoreV3.ts index e0461c3a5f3..203c50e0416 100644 --- a/src/stores/room-list-v3/RoomListStoreV3.ts +++ b/src/stores/room-list-v3/RoomListStoreV3.ts @@ -260,7 +260,7 @@ export class RoomListStoreV3Class extends AsyncStoreWithClient { } } - this.addRoomAndEmit(payload.room, true); + this.addRoomAndEmit(payload.room, !oldMembership || oldMembership === EffectiveMembership.Leave); break; } From 985b8b23d130632825e4317b4a10d36c3fa0cf60 Mon Sep 17 00:00:00 2001 From: Michael Telatynski <7t3chguy@gmail.com> Date: Fri, 7 Nov 2025 16:41:10 +0000 Subject: [PATCH 2/3] Iterate Signed-off-by: Michael Telatynski <7t3chguy@gmail.com> --- src/stores/room-list-v3/RoomListStoreV3.ts | 2 +- .../room-list-v3/RoomListStoreV3-test.ts | 35 ++++++++++++++++--- 2 files changed, 32 insertions(+), 5 deletions(-) diff --git a/src/stores/room-list-v3/RoomListStoreV3.ts b/src/stores/room-list-v3/RoomListStoreV3.ts index 203c50e0416..6133fcfd198 100644 --- a/src/stores/room-list-v3/RoomListStoreV3.ts +++ b/src/stores/room-list-v3/RoomListStoreV3.ts @@ -260,7 +260,7 @@ export class RoomListStoreV3Class extends AsyncStoreWithClient { } } - this.addRoomAndEmit(payload.room, !oldMembership || oldMembership === EffectiveMembership.Leave); + this.addRoomAndEmit(payload.room, oldMembership === EffectiveMembership.Leave); break; } 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 78ec98e02e7..d54adf672d7 100644 --- a/test/unit-tests/stores/room-list-v3/RoomListStoreV3-test.ts +++ b/test/unit-tests/stores/room-list-v3/RoomListStoreV3-test.ts @@ -5,11 +5,10 @@ SPDX-License-Identifier: AGPL-3.0-only OR GPL-3.0-only OR LicenseRef-Element-Com Please see LICENSE files in the repository root for full details. */ +import type { MatrixClient } from "matrix-js-sdk/src/matrix"; import { EventType, KnownMembership, MatrixEvent, Room } from "matrix-js-sdk/src/matrix"; import { logger } from "matrix-js-sdk/src/logger"; import { mocked } from "jest-mock"; - -import type { MatrixClient } from "matrix-js-sdk/src/matrix"; import type { RoomNotificationState } from "../../../../src/stores/notifications/RoomNotificationState"; import { LISTS_UPDATE_EVENT, RoomListStoreV3Class } from "../../../../src/stores/room-list-v3/RoomListStoreV3"; import { AsyncStoreWithClient } from "../../../../src/stores/AsyncStoreWithClient"; @@ -29,6 +28,7 @@ import SettingsStore from "../../../../src/settings/SettingsStore"; import * as utils from "../../../../src/utils/notifications"; import * as roomMute from "../../../../src/stores/room-list/utils/roomMute"; import { Action } from "../../../../src/dispatcher/actions"; +import { SettingLevel } from "../../../../src/settings/SettingLevel.ts"; describe("RoomListStoreV3", () => { async function getRoomListStore() { @@ -218,7 +218,6 @@ describe("RoomListStoreV3", () => { dispatcher.dispatch( { action: "MatrixActions.Room.myMembership", - oldMembership: KnownMembership.Invite, membership: KnownMembership.Join, room: newRoom, }, @@ -253,7 +252,6 @@ describe("RoomListStoreV3", () => { dispatcher.dispatch( { action: "MatrixActions.Room.myMembership", - oldMembership: KnownMembership.Invite, membership: KnownMembership.Join, room: newRoom, }, @@ -759,6 +757,35 @@ describe("RoomListStoreV3", () => { expect(result).toHaveLength(1); expect(result).toContain(rooms[8]); }); + + it("should update filters on membership change", async () => { + await SettingsStore.setValue("feature_ask_to_join", null, SettingLevel.DEVICE, true); + const { store, client, dispatcher } = await getRoomListStore(); + const room = new Room("!fooknock:matrix.org", client, client.getSafeUserId(), {}); + + room.getMyMembership = jest.fn().mockReturnValue(KnownMembership.Knock); + dispatcher.dispatch( + { + action: "MatrixActions.Room.myMembership", + membership: KnownMembership.Knock, + room, + }, + true, + ); + expect(store.getSortedRoomsInActiveSpace([FilterKey.InvitesFilter]).rooms).not.toContain(room); + + room.getMyMembership = jest.fn().mockReturnValue(KnownMembership.Invite); + dispatcher.dispatch( + { + action: "MatrixActions.Room.myMembership", + oldMembership: KnownMembership.Knock, + membership: KnownMembership.Invite, + room, + }, + true, + ); + expect(store.getSortedRoomsInActiveSpace([FilterKey.InvitesFilter]).rooms).toContain(room); + }); }); }); From 31191c630b832a3e84ecbb8a4ef7dc86a722b51c Mon Sep 17 00:00:00 2001 From: Michael Telatynski <7t3chguy@gmail.com> Date: Fri, 7 Nov 2025 16:43:03 +0000 Subject: [PATCH 3/3] lint Signed-off-by: Michael Telatynski <7t3chguy@gmail.com> --- test/unit-tests/stores/room-list-v3/RoomListStoreV3-test.ts | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) 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 d54adf672d7..2d7dd4459c6 100644 --- a/test/unit-tests/stores/room-list-v3/RoomListStoreV3-test.ts +++ b/test/unit-tests/stores/room-list-v3/RoomListStoreV3-test.ts @@ -5,10 +5,11 @@ SPDX-License-Identifier: AGPL-3.0-only OR GPL-3.0-only OR LicenseRef-Element-Com Please see LICENSE files in the repository root for full details. */ -import type { MatrixClient } from "matrix-js-sdk/src/matrix"; import { EventType, KnownMembership, MatrixEvent, Room } from "matrix-js-sdk/src/matrix"; import { logger } from "matrix-js-sdk/src/logger"; import { mocked } from "jest-mock"; + +import type { MatrixClient } from "matrix-js-sdk/src/matrix"; import type { RoomNotificationState } from "../../../../src/stores/notifications/RoomNotificationState"; import { LISTS_UPDATE_EVENT, RoomListStoreV3Class } from "../../../../src/stores/room-list-v3/RoomListStoreV3"; import { AsyncStoreWithClient } from "../../../../src/stores/AsyncStoreWithClient";