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:
@@ -181,15 +181,6 @@ test.describe("Room list unread activity toast", () => {
|
|||||||
// Wait until the collapsed Chats header has been pushed offscreen (all favourites synced).
|
// Wait until the collapsed Chats header has been pushed offscreen (all favourites synced).
|
||||||
await expect(chatsHeader).not.toBeInViewport();
|
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.
|
// The collapsed Chats header is offscreen, but its hidden notification raises the toast.
|
||||||
await expect(getToast(page)).toBeVisible();
|
await expect(getToast(page)).toBeVisible();
|
||||||
|
|
||||||
|
|||||||
BIN
Binary file not shown.
|
Before Width: | Height: | Size: 9.9 KiB After Width: | Height: | Size: 6.7 KiB |
BIN
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": {
|
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;
|
const room = payload.room;
|
||||||
this.addRoomAndEmit(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);
|
this.emit(ROOM_TAGGED_EVENT);
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -13,6 +13,7 @@ import type { MatrixClient } from "matrix-js-sdk/src/matrix";
|
|||||||
import type { RoomNotificationState } from "../../../../src/stores/notifications/RoomNotificationState";
|
import type { RoomNotificationState } from "../../../../src/stores/notifications/RoomNotificationState";
|
||||||
import {
|
import {
|
||||||
LISTS_UPDATE_EVENT,
|
LISTS_UPDATE_EVENT,
|
||||||
|
ROOM_TAGGED_EVENT,
|
||||||
SECTION_CREATED_EVENT,
|
SECTION_CREATED_EVENT,
|
||||||
RoomListStoreV3Class,
|
RoomListStoreV3Class,
|
||||||
type Section,
|
type Section,
|
||||||
@@ -346,6 +347,19 @@ describe("RoomListStoreV3", () => {
|
|||||||
expect(fn).toHaveBeenCalled();
|
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 () => {
|
it("Room is re-inserted on decryption", async () => {
|
||||||
const { store, rooms, client, dispatcher } = await getRoomListStore();
|
const { store, rooms, client, dispatcher } = await getRoomListStore();
|
||||||
jest.spyOn(client, "getRoom").mockImplementation(() => rooms[10]);
|
jest.spyOn(client, "getRoom").mockImplementation(() => rooms[10]);
|
||||||
|
|||||||
Reference in New Issue
Block a user