* Add NotificationDecoration component Add the NotificationDecoration component to shared-components. This is a leaf component that renders notification badges and indicators for rooms/items including mentions, unread counts, call indicators, etc. * Add RoomListItem component Add the RoomListItem component to shared-components. Includes context menu, hover menu, notification menu, and more options menu. * Add RoomListPrimaryFilters component Add filter chips component for filtering the room list by unread, people, rooms, favourites, mentions, invites, and low priority. * Update VirtualizedList component Update VirtualizedList to support the room list virtualization requirements. * Add RoomList component Add RoomList component that renders a virtualized list of room items. Includes story mocks for testing. * Add RoomListView component Add RoomListView component that composes RoomList with filters, empty states, and loading skeleton. * Export room-list components from shared-components Add exports for RoomListView, RoomListItem, RoomListPrimaryFilters, and RoomList. Include i18n strings for room list components. * Add RoomListItemViewModel Add view model for individual room list items. Manages per-room subscriptions and updates only when specific room data changes. * Add RoomListViewViewModel Add view model for the room list view. Manages room list state, filtering, keyboard navigation, and child view models. * Integrate shared components into RoomListView Update RoomListView to use the new ViewModels and shared components. Includes i18n string updates for element-web. * Remove old room list implementation Remove old ViewModels, hooks, and view components that are now replaced by the shared-components implementation. * Update sliding-sync playwright test Update test expectations for new room list implementation. * Add figma links * Move viewModels to the right folder * Rename to RoomListEmptyStateView * Update VirtualizedRoomListView naming * Update screenshots and snapshots * Move viewmodel tests to the right location and fix some imports * lint * Use unknown as an Opaque type rather than any. It discourages property access within shared components and can still be cast back in EW. * Update screenshots for new shared component rendering params * Make room order tests deterministic
79 lines
3.0 KiB
TypeScript
79 lines
3.0 KiB
TypeScript
/*
|
|
* Copyright 2025 New Vector Ltd.
|
|
*
|
|
* SPDX-License-Identifier: AGPL-3.0-only OR GPL-3.0-only OR LicenseRef-Element-Commercial
|
|
* Please see LICENSE files in the repository root for full details.
|
|
*/
|
|
|
|
import { mocked } from "jest-mock";
|
|
|
|
import type { MatrixClient, Room, RoomState } from "matrix-js-sdk/src/matrix";
|
|
import { createTestClient, mkStubRoom } from "../../test-utils";
|
|
import { shouldShowComponent } from "../../../src/customisations/helpers/UIComponents";
|
|
import defaultDispatcher from "../../../src/dispatcher/dispatcher";
|
|
import { Action } from "../../../src/dispatcher/actions";
|
|
import { showCreateNewRoom } from "../../../src/utils/space";
|
|
import { hasCreateRoomRights, createRoom, hasAccessToNotificationMenu } from "../../../src/viewmodels/room-list/utils";
|
|
|
|
jest.mock("../../../src/customisations/helpers/UIComponents", () => ({
|
|
shouldShowComponent: jest.fn(),
|
|
}));
|
|
|
|
jest.mock("../../../src/utils/space", () => ({
|
|
showCreateNewRoom: jest.fn(),
|
|
}));
|
|
|
|
describe("utils", () => {
|
|
let matrixClient: MatrixClient;
|
|
let space: Room;
|
|
|
|
beforeEach(() => {
|
|
matrixClient = createTestClient();
|
|
space = mkStubRoom("spaceId", "spaceName", matrixClient);
|
|
});
|
|
|
|
describe("createRoom", () => {
|
|
it("should fire Action.CreateRoom when createRoom is called without a space", async () => {
|
|
const spy = jest.spyOn(defaultDispatcher, "fire");
|
|
await createRoom();
|
|
|
|
expect(spy).toHaveBeenCalledWith(Action.CreateRoom);
|
|
});
|
|
|
|
it("should call showCreateNewRoom when createRoom is called in a space", async () => {
|
|
await createRoom(space);
|
|
expect(showCreateNewRoom).toHaveBeenCalledWith(space);
|
|
});
|
|
});
|
|
|
|
describe("hasCreateRoomRights", () => {
|
|
it("should return false when UIComponent.CreateRooms is disabled", () => {
|
|
mocked(shouldShowComponent).mockReturnValue(false);
|
|
expect(hasCreateRoomRights(matrixClient, space)).toBe(false);
|
|
});
|
|
|
|
it("should return true when UIComponent.CreateRooms is enabled and no space", () => {
|
|
mocked(shouldShowComponent).mockReturnValue(true);
|
|
expect(hasCreateRoomRights(matrixClient)).toBe(true);
|
|
});
|
|
|
|
it("should return false in space when UIComponent.CreateRooms is enabled and the user doesn't have the rights", () => {
|
|
mocked(shouldShowComponent).mockReturnValue(true);
|
|
jest.spyOn(space.getLiveTimeline(), "getState").mockReturnValue({
|
|
maySendStateEvent: jest.fn().mockReturnValue(true),
|
|
} as unknown as RoomState);
|
|
|
|
expect(hasCreateRoomRights(matrixClient)).toBe(true);
|
|
});
|
|
});
|
|
|
|
it("hasAccessToNotificationMenu", () => {
|
|
mocked(shouldShowComponent).mockReturnValue(true);
|
|
const room = mkStubRoom("roomId", "roomName", matrixClient);
|
|
const isGuest = false;
|
|
const isArchived = false;
|
|
|
|
expect(hasAccessToNotificationMenu(room, isGuest, isArchived)).toBe(true);
|
|
});
|
|
});
|