From 9611cbf6c42d7f4a4f7a34d3d2e35c54f6b16068 Mon Sep 17 00:00:00 2001 From: Michael Telatynski <7t3chguy@gmail.com> Date: Fri, 12 May 2023 11:49:41 +0100 Subject: [PATCH] Fix people space notification badge not updating for new DM invites (#10849) * Add regression test * Fix people space notification state not updating for new DM invites --- src/stores/spaces/SpaceStore.ts | 9 ++++----- test/stores/SpaceStore-test.ts | 23 +++++++++++++++++++++++ 2 files changed, 27 insertions(+), 5 deletions(-) diff --git a/src/stores/spaces/SpaceStore.ts b/src/stores/spaces/SpaceStore.ts index 73ec56556d..e91b3c5a45 100644 --- a/src/stores/spaces/SpaceStore.ts +++ b/src/stores/spaces/SpaceStore.ts @@ -765,7 +765,7 @@ export class SpaceStoreClass extends AsyncStoreWithClient { const hiddenChildren = new EnhancedMap>(); visibleRooms.forEach((room) => { - if (room.getMyMembership() !== "join") return; + if (!["join", "invite"].includes(room.getMyMembership())) return; this.getParents(room.roomId).forEach((parent) => { hiddenChildren.getOrCreate(parent.roomId, new Set()).add(room.roomId); }); @@ -872,10 +872,9 @@ export class SpaceStoreClass extends AsyncStoreWithClient { } const notificationStatesToUpdate = [...changeSet]; - if ( - this.enabledMetaSpaces.includes(MetaSpace.People) && - userDiff.added.length + userDiff.removed.length + usersChanged.length > 0 - ) { + // We update the People metaspace even if we didn't detect any changes + // as roomIdsBySpace does not pre-calculate it so we have to assume it could have changed + if (this.enabledMetaSpaces.includes(MetaSpace.People)) { notificationStatesToUpdate.push(MetaSpace.People); } this.updateNotificationStates(notificationStatesToUpdate); diff --git a/test/stores/SpaceStore-test.ts b/test/stores/SpaceStore-test.ts index 04a94c1bba..d66c74b7a1 100644 --- a/test/stores/SpaceStore-test.ts +++ b/test/stores/SpaceStore-test.ts @@ -672,6 +672,29 @@ describe("SpaceStore", () => { }); }); + it("should add new DM Invites to the People Space Notification State", async () => { + mkRoom(dm1); + mocked(client.getRoom(dm1)!).getMyMembership.mockReturnValue("join"); + mocked(client).getRoom.mockImplementation((roomId) => rooms.find((room) => room.roomId === roomId) || null); + + await run(); + + mkRoom(dm2); + const cliDm2 = client.getRoom(dm2)!; + mocked(cliDm2).getMyMembership.mockReturnValue("invite"); + mocked(client).getRoom.mockImplementation((roomId) => rooms.find((room) => room.roomId === roomId) || null); + client.emit(RoomEvent.MyMembership, cliDm2, "invite"); + + [dm1, dm2].forEach((d) => { + expect( + store + .getNotificationState(MetaSpace.People) + .rooms.map((r) => r.roomId) + .includes(d), + ).toBeTruthy(); + }); + }); + describe("hierarchy resolution update tests", () => { it("updates state when spaces are joined", async () => { await run();