Room list: fix *Chat moved* toast appearing when room list is loaded (#34305)

* Fix Chat moved toast appearing when room list is loaded

* Update e2e tests
This commit is contained in:
Florian Duros
2026-07-16 18:20:42 +00:00
committed by GitHub
parent 7ad619e693
commit 377534e6e9
5 changed files with 22 additions and 9 deletions
@@ -181,15 +181,6 @@ test.describe("Room list unread activity toast", () => {
// Wait until the collapsed Chats header has been pushed offscreen (all favourites synced).
await expect(chatsHeader).not.toBeInViewport();
// Tagging rooms into the Favourites section raises a transient "Chat moved" toast, which
// shares the single toast slot with — and takes precedence over — the unread-activity toast
// (see RoomListView). Dismiss it via its close button so the unread toast can surface; by now
// all favourites have synced, so it will not re-appear.
const chatMovedToast = page.getByText("Chat moved");
await expect(chatMovedToast).toBeVisible();
await page.getByRole("button", { name: "Close" }).click();
await expect(chatMovedToast).not.toBeVisible();
// The collapsed Chats header is offscreen, but its hidden notification raises the toast.
await expect(getToast(page)).toBeVisible();
Binary file not shown.

Before

Width:  |  Height:  |  Size: 9.9 KiB

After

Width:  |  Height:  |  Size: 6.7 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 18 KiB

After

Width:  |  Height:  |  Size: 14 KiB

@@ -272,8 +272,16 @@ export class RoomListStoreV3Class extends AsyncStoreWithClient<EmptyObject> {
}
case "MatrixActions.Room.tags": {
// Re-sort on any tag change, but don't emit ROOM_TAGGED_EVENT here: the js-sdk
// re-emits RoomEvent.Tags for every m.tag on every sync, which would show a spurious
// "chat moved" toast on load. It is emitted from tagRoom.success below instead.
const room = payload.room;
this.addRoomAndEmit(room);
break;
}
case "RoomListActions.tagRoom.success": {
// Tag change initiated by the local user, so surface the "chat moved" toast.
this.emit(ROOM_TAGGED_EVENT);
break;
}
@@ -13,6 +13,7 @@ import type { MatrixClient } from "matrix-js-sdk/src/matrix";
import type { RoomNotificationState } from "../../../../src/stores/notifications/RoomNotificationState";
import {
LISTS_UPDATE_EVENT,
ROOM_TAGGED_EVENT,
SECTION_CREATED_EVENT,
RoomListStoreV3Class,
type Section,
@@ -346,6 +347,19 @@ describe("RoomListStoreV3", () => {
expect(fn).toHaveBeenCalled();
});
it("emits ROOM_TAGGED_EVENT on a local user tag action", async () => {
const { store, dispatcher } = await getRoomListStore();
const fn = jest.fn();
store.on(ROOM_TAGGED_EVENT, fn);
dispatcher.dispatch(
{
action: "RoomListActions.tagRoom.success",
},
true,
);
expect(fn).toHaveBeenCalled();
});
it("Room is re-inserted on decryption", async () => {
const { store, rooms, client, dispatcher } = await getRoomListStore();
jest.spyOn(client, "getRoom").mockImplementation(() => rooms[10]);