mirror of https://github.com/vector-im/riot-web
Fix clicking on home all rooms space notification not working (#11337)
* Fix clicking on home all rooms space notification not working * Add testpull/28217/head
parent
e6bf67ae8b
commit
8166306e0f
|
@ -193,35 +193,32 @@ export class SpaceStoreClass extends AsyncStoreWithClient<IState> {
|
||||||
if (!isMetaSpace(space) && !this.matrixClient?.getRoom(space)?.isSpaceRoom()) return;
|
if (!isMetaSpace(space) && !this.matrixClient?.getRoom(space)?.isSpaceRoom()) return;
|
||||||
if (space !== this.activeSpace) this.setActiveSpace(space, false);
|
if (space !== this.activeSpace) this.setActiveSpace(space, false);
|
||||||
|
|
||||||
if (space) {
|
let roomId: string | undefined;
|
||||||
const roomId = this.getNotificationState(space).getFirstRoomWithNotifications();
|
if (space === MetaSpace.Home && this.allRoomsInHome) {
|
||||||
|
const hasMentions = RoomNotificationStateStore.instance.globalState.hasMentions;
|
||||||
|
const lists = RoomListStore.instance.orderedLists;
|
||||||
|
tagLoop: for (let i = 0; i < TAG_ORDER.length; i++) {
|
||||||
|
const t = TAG_ORDER[i];
|
||||||
|
if (!lists[t]) continue;
|
||||||
|
for (const room of lists[t]) {
|
||||||
|
const state = RoomNotificationStateStore.instance.getRoomState(room);
|
||||||
|
if (hasMentions ? state.hasMentions : state.isUnread) {
|
||||||
|
roomId = room.roomId;
|
||||||
|
break tagLoop;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
roomId = this.getNotificationState(space).getFirstRoomWithNotifications();
|
||||||
|
}
|
||||||
|
|
||||||
|
if (!!roomId) {
|
||||||
defaultDispatcher.dispatch<ViewRoomPayload>({
|
defaultDispatcher.dispatch<ViewRoomPayload>({
|
||||||
action: Action.ViewRoom,
|
action: Action.ViewRoom,
|
||||||
room_id: roomId,
|
room_id: roomId,
|
||||||
context_switch: true,
|
context_switch: true,
|
||||||
metricsTrigger: "WebSpacePanelNotificationBadge",
|
metricsTrigger: "WebSpacePanelNotificationBadge",
|
||||||
});
|
});
|
||||||
} else {
|
|
||||||
const lists = RoomListStore.instance.orderedLists;
|
|
||||||
for (let i = 0; i < TAG_ORDER.length; i++) {
|
|
||||||
const t = TAG_ORDER[i];
|
|
||||||
const listRooms = lists[t];
|
|
||||||
const unreadRoom = listRooms.find((r: Room) => {
|
|
||||||
if (this.showInHomeSpace(r)) {
|
|
||||||
const state = RoomNotificationStateStore.instance.getRoomState(r);
|
|
||||||
return state.isUnread;
|
|
||||||
}
|
|
||||||
});
|
|
||||||
if (unreadRoom) {
|
|
||||||
defaultDispatcher.dispatch<ViewRoomPayload>({
|
|
||||||
action: Action.ViewRoom,
|
|
||||||
room_id: unreadRoom.roomId,
|
|
||||||
context_switch: true,
|
|
||||||
metricsTrigger: "WebSpacePanelNotificationBadge",
|
|
||||||
});
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -20,7 +20,7 @@ import { EventType } from "matrix-js-sdk/src/@types/event";
|
||||||
import { RoomMember } from "matrix-js-sdk/src/models/room-member";
|
import { RoomMember } from "matrix-js-sdk/src/models/room-member";
|
||||||
import { RoomStateEvent } from "matrix-js-sdk/src/models/room-state";
|
import { RoomStateEvent } from "matrix-js-sdk/src/models/room-state";
|
||||||
import { defer } from "matrix-js-sdk/src/utils";
|
import { defer } from "matrix-js-sdk/src/utils";
|
||||||
import { ClientEvent, RoomEvent, MatrixEvent, Room } from "matrix-js-sdk/src/matrix";
|
import { ClientEvent, MatrixEvent, Room, RoomEvent } from "matrix-js-sdk/src/matrix";
|
||||||
|
|
||||||
import SpaceStore from "../../src/stores/spaces/SpaceStore";
|
import SpaceStore from "../../src/stores/spaces/SpaceStore";
|
||||||
import {
|
import {
|
||||||
|
@ -38,6 +38,10 @@ import SettingsStore from "../../src/settings/SettingsStore";
|
||||||
import { SettingLevel } from "../../src/settings/SettingLevel";
|
import { SettingLevel } from "../../src/settings/SettingLevel";
|
||||||
import { Action } from "../../src/dispatcher/actions";
|
import { Action } from "../../src/dispatcher/actions";
|
||||||
import { MatrixClientPeg } from "../../src/MatrixClientPeg";
|
import { MatrixClientPeg } from "../../src/MatrixClientPeg";
|
||||||
|
import RoomListStore from "../../src/stores/room-list/RoomListStore";
|
||||||
|
import { DefaultTagID } from "../../src/stores/room-list/models";
|
||||||
|
import { RoomNotificationStateStore } from "../../src/stores/notifications/RoomNotificationStateStore";
|
||||||
|
import { NotificationColor } from "../../src/stores/notifications/NotificationColor";
|
||||||
|
|
||||||
jest.useFakeTimers();
|
jest.useFakeTimers();
|
||||||
|
|
||||||
|
@ -1452,4 +1456,29 @@ describe("SpaceStore", () => {
|
||||||
expect(client.getVisibleRooms).not.toHaveBeenCalledWith();
|
expect(client.getVisibleRooms).not.toHaveBeenCalledWith();
|
||||||
});
|
});
|
||||||
});
|
});
|
||||||
|
|
||||||
|
describe("setActiveRoomInSpace", () => {
|
||||||
|
it("should work with Home as all rooms space", async () => {
|
||||||
|
const room = mkRoom(room1);
|
||||||
|
const state = RoomNotificationStateStore.instance.getRoomState(room);
|
||||||
|
// @ts-ignore
|
||||||
|
state._color = NotificationColor.Grey;
|
||||||
|
jest.spyOn(RoomListStore.instance, "orderedLists", "get").mockReturnValue({
|
||||||
|
[DefaultTagID.Untagged]: [room],
|
||||||
|
});
|
||||||
|
|
||||||
|
// init the store
|
||||||
|
await run();
|
||||||
|
await setShowAllRooms(true);
|
||||||
|
|
||||||
|
store.setActiveRoomInSpace(MetaSpace.Home);
|
||||||
|
|
||||||
|
expect(spyDispatcher).toHaveBeenCalledWith(
|
||||||
|
expect.objectContaining({
|
||||||
|
action: "view_room",
|
||||||
|
room_id: room.roomId,
|
||||||
|
}),
|
||||||
|
);
|
||||||
|
});
|
||||||
|
});
|
||||||
});
|
});
|
||||||
|
|
Loading…
Reference in New Issue