diff --git a/playwright/snapshots/left-panel/room-list-panel/room-list-filter-sort.spec.ts/room-panel-empty-room-list-linux.png b/playwright/snapshots/left-panel/room-list-panel/room-list-filter-sort.spec.ts/room-panel-empty-room-list-linux.png index a0f4fbffdf..9061362a49 100644 Binary files a/playwright/snapshots/left-panel/room-list-panel/room-list-filter-sort.spec.ts/room-panel-empty-room-list-linux.png and b/playwright/snapshots/left-panel/room-list-panel/room-list-filter-sort.spec.ts/room-panel-empty-room-list-linux.png differ diff --git a/playwright/snapshots/left-panel/room-list-panel/room-list-header.spec.ts/room-list-header-linux.png b/playwright/snapshots/left-panel/room-list-panel/room-list-header.spec.ts/room-list-header-linux.png index 6c871b6b9c..46ff1a53be 100644 Binary files a/playwright/snapshots/left-panel/room-list-panel/room-list-header.spec.ts/room-list-header-linux.png and b/playwright/snapshots/left-panel/room-list-panel/room-list-header.spec.ts/room-list-header-linux.png differ diff --git a/playwright/snapshots/left-panel/room-list-panel/room-list-header.spec.ts/room-list-space-header-linux.png b/playwright/snapshots/left-panel/room-list-panel/room-list-header.spec.ts/room-list-space-header-linux.png index bdb7f8fa2a..3a4aea566e 100644 Binary files a/playwright/snapshots/left-panel/room-list-panel/room-list-header.spec.ts/room-list-space-header-linux.png and b/playwright/snapshots/left-panel/room-list-panel/room-list-header.spec.ts/room-list-space-header-linux.png differ diff --git a/playwright/snapshots/left-panel/room-list-panel/room-list-panel.spec.ts/room-list-panel-linux.png b/playwright/snapshots/left-panel/room-list-panel/room-list-panel.spec.ts/room-list-panel-linux.png index 3e36789db6..fc680e424e 100644 Binary files a/playwright/snapshots/left-panel/room-list-panel/room-list-panel.spec.ts/room-list-panel-linux.png and b/playwright/snapshots/left-panel/room-list-panel/room-list-panel.spec.ts/room-list-panel-linux.png differ diff --git a/playwright/snapshots/left-panel/room-list-panel/room-list-panel.spec.ts/room-list-panel-smallscreen-linux.png b/playwright/snapshots/left-panel/room-list-panel/room-list-panel.spec.ts/room-list-panel-smallscreen-linux.png index d502271435..94e3f00732 100644 Binary files a/playwright/snapshots/left-panel/room-list-panel/room-list-panel.spec.ts/room-list-panel-smallscreen-linux.png and b/playwright/snapshots/left-panel/room-list-panel/room-list-panel.spec.ts/room-list-panel-smallscreen-linux.png differ diff --git a/playwright/snapshots/left-panel/room-list-panel/room-list.spec.ts/room-list-item-open-more-options-linux.png b/playwright/snapshots/left-panel/room-list-panel/room-list.spec.ts/room-list-item-open-more-options-linux.png index 2c301ea37c..0eb95d0c0c 100644 Binary files a/playwright/snapshots/left-panel/room-list-panel/room-list.spec.ts/room-list-item-open-more-options-linux.png and b/playwright/snapshots/left-panel/room-list-panel/room-list.spec.ts/room-list-item-open-more-options-linux.png differ diff --git a/playwright/snapshots/left-panel/room-list-panel/room-list.spec.ts/room-list-item-open-notification-options-linux.png b/playwright/snapshots/left-panel/room-list-panel/room-list.spec.ts/room-list-item-open-notification-options-linux.png index e8a3e6098f..3db9fd680d 100644 Binary files a/playwright/snapshots/left-panel/room-list-panel/room-list.spec.ts/room-list-item-open-notification-options-linux.png and b/playwright/snapshots/left-panel/room-list-panel/room-list.spec.ts/room-list-item-open-notification-options-linux.png differ diff --git a/playwright/snapshots/left-panel/room-list-panel/room-list.spec.ts/room-list-item-open-notification-options-selection-linux.png b/playwright/snapshots/left-panel/room-list-panel/room-list.spec.ts/room-list-item-open-notification-options-selection-linux.png index 2013389235..60f62ef572 100644 Binary files a/playwright/snapshots/left-panel/room-list-panel/room-list.spec.ts/room-list-item-open-notification-options-selection-linux.png and b/playwright/snapshots/left-panel/room-list-panel/room-list.spec.ts/room-list-item-open-notification-options-selection-linux.png differ diff --git a/res/css/views/rooms/RoomListPanel/_RoomListSecondaryFilters.pcss b/res/css/views/rooms/RoomListPanel/_RoomListSecondaryFilters.pcss index c94fb54007..0fa8dc12ae 100644 --- a/res/css/views/rooms/RoomListPanel/_RoomListSecondaryFilters.pcss +++ b/res/css/views/rooms/RoomListPanel/_RoomListSecondaryFilters.pcss @@ -10,16 +10,3 @@ margin: var(--cpd-space-2x); margin-left: var(--cpd-space-1x); } - -.mx_RoomListSecondaryFilters_roomOptionsButton { - /* Size the button appropriately (should this be in em, maybe, - * so it gets bigger with font size? These values taken from the figma. - */ - width: 28px; - height: 28px; - margin-left: auto; - - svg { - color: var(--cpd-color-icon-primary); - } -} diff --git a/src/components/viewmodels/roomlist/RoomListHeaderViewModel.tsx b/src/components/viewmodels/roomlist/RoomListHeaderViewModel.tsx index 66b44e0086..d6f54fcae7 100644 --- a/src/components/viewmodels/roomlist/RoomListHeaderViewModel.tsx +++ b/src/components/viewmodels/roomlist/RoomListHeaderViewModel.tsx @@ -31,6 +31,8 @@ import { import { useMatrixClientContext } from "../../../contexts/MatrixClientContext"; import type { ViewRoomPayload } from "../../../dispatcher/payloads/ViewRoomPayload"; import { createRoom, hasCreateRoomRights } from "./utils"; +import { type SortOption, useSorter } from "./useSorter"; +import { useMessagePreviewToggle } from "./useMessagePreviewToggle"; /** * Hook to get the active space and its title. @@ -117,6 +119,22 @@ export interface RoomListHeaderViewState { * Open the space settings */ openSpaceSettings: () => void; + /** + * Change the sort order of the room-list. + */ + sort: (option: SortOption) => void; + /** + * The currently active sort option. + */ + activeSortOption: SortOption; + /** + * Whether message previews must be shown or not. + */ + shouldShowMessagePreview: boolean; + /** + * A function to turn on/off message previews. + */ + toggleMessagePreview: () => void; } /** @@ -138,6 +156,9 @@ export function useRoomListHeaderViewModel(): RoomListHeaderViewState { /* Actions */ + const { activeSortOption, sort } = useSorter(); + const { shouldShowMessagePreview, toggleMessagePreview } = useMessagePreviewToggle(); + const createChatRoom = useCallback((e: Event) => { defaultDispatcher.fire(Action.CreateChat); PosthogTrackers.trackInteraction("WebRoomListHeaderPlusMenuCreateChatItem", e); @@ -207,5 +228,9 @@ export function useRoomListHeaderViewModel(): RoomListHeaderViewState { inviteInSpace, openSpacePreferences, openSpaceSettings, + activeSortOption, + sort, + shouldShowMessagePreview, + toggleMessagePreview, }; } diff --git a/src/components/viewmodels/roomlist/RoomListViewModel.tsx b/src/components/viewmodels/roomlist/RoomListViewModel.tsx index ddc38e17de..bdc78caf15 100644 --- a/src/components/viewmodels/roomlist/RoomListViewModel.tsx +++ b/src/components/viewmodels/roomlist/RoomListViewModel.tsx @@ -9,8 +9,6 @@ import { useCallback } from "react"; import type { Room } from "matrix-js-sdk/src/matrix"; import { type PrimaryFilter, type SecondaryFilters, useFilteredRooms } from "./useFilteredRooms"; -import { type SortOption, useSorter } from "./useSorter"; -import { useMessagePreviewToggle } from "./useMessagePreviewToggle"; import { createRoom as createRoomFunc, hasCreateRoomRights } from "./utils"; import { useEventEmitterState } from "../../../hooks/useEventEmitter"; import { UPDATE_SELECTED_SPACE } from "../../../stores/spaces"; @@ -71,26 +69,6 @@ export interface RoomListViewState { */ activeSecondaryFilter: SecondaryFilters; - /** - * Change the sort order of the room-list. - */ - sort: (option: SortOption) => void; - - /** - * The currently active sort option. - */ - activeSortOption: SortOption; - - /** - * Whether message previews must be shown or not. - */ - shouldShowMessagePreview: boolean; - - /** - * A function to turn on/off message previews. - */ - toggleMessagePreview: () => void; - /** * The index of the active room in the room list. */ @@ -122,9 +100,6 @@ export function useRoomListViewModel(): RoomListViewState { ); const canCreateRoom = hasCreateRoomRights(matrixClient, currentSpace); - const { activeSortOption, sort } = useSorter(); - const { shouldShowMessagePreview, toggleMessagePreview } = useMessagePreviewToggle(); - const createChatRoom = useCallback(() => dispatcher.fire(Action.CreateChat), []); const createRoom = useCallback(() => createRoomFunc(currentSpace), [currentSpace]); @@ -138,10 +113,6 @@ export function useRoomListViewModel(): RoomListViewState { activePrimaryFilter, activateSecondaryFilter, activeSecondaryFilter, - activeSortOption, - sort, - shouldShowMessagePreview, - toggleMessagePreview, activeIndex, }; } diff --git a/src/components/views/rooms/RoomListPanel/RoomListHeaderView.tsx b/src/components/views/rooms/RoomListPanel/RoomListHeaderView.tsx index ba4fdc5ca4..752f065fd4 100644 --- a/src/components/views/rooms/RoomListPanel/RoomListHeaderView.tsx +++ b/src/components/views/rooms/RoomListPanel/RoomListHeaderView.tsx @@ -21,6 +21,7 @@ import { type RoomListHeaderViewState, useRoomListHeaderViewModel, } from "../../../viewmodels/roomlist/RoomListHeaderViewModel"; +import { RoomListOptionsMenu } from "./RoomListOptionsMenu"; /** * The header view for the room list @@ -42,14 +43,17 @@ export function RoomListHeaderView(): JSX.Element {

{vm.title}

{vm.displaySpaceMenu && } - {/* If we don't display the compose menu, it means that the user can only send DM */} - {vm.displayComposeMenu ? ( - - ) : ( - vm.createChatRoom(e.nativeEvent)}> - - - )} + + + {/* If we don't display the compose menu, it means that the user can only send DM */} + {vm.displayComposeMenu ? ( + + ) : ( + vm.createChatRoom(e.nativeEvent)}> + + + )} + ); } diff --git a/src/components/views/rooms/RoomListPanel/RoomListOptionsMenu.tsx b/src/components/views/rooms/RoomListPanel/RoomListOptionsMenu.tsx index 9917f713fc..a78c1dd994 100644 --- a/src/components/views/rooms/RoomListPanel/RoomListOptionsMenu.tsx +++ b/src/components/views/rooms/RoomListPanel/RoomListOptionsMenu.tsx @@ -7,11 +7,11 @@ import { IconButton, Menu, MenuTitle, CheckboxMenuItem, Tooltip, RadioMenuItem } from "@vector-im/compound-web"; import React, { type Ref, type JSX, useState, useCallback } from "react"; -import OverflowHorizontalIcon from "@vector-im/compound-design-tokens/assets/web/icons/overflow-horizontal"; +import FilterIcon from "@vector-im/compound-design-tokens/assets/web/icons/filter"; import { _t } from "../../../../languageHandler"; -import { type RoomListViewState } from "../../../viewmodels/roomlist/RoomListViewModel"; import { SortOption } from "../../../viewmodels/roomlist/useSorter"; +import { type RoomListHeaderViewState } from "../../../viewmodels/roomlist/RoomListHeaderViewModel"; interface MenuTriggerProps extends React.ComponentProps { ref?: Ref; @@ -19,13 +19,8 @@ interface MenuTriggerProps extends React.ComponentProps { const MenuTrigger = ({ ref, ...props }: MenuTriggerProps): JSX.Element => ( - - + + ); @@ -34,7 +29,7 @@ interface Props { /** * The view model for the room list view */ - vm: RoomListViewState; + vm: RoomListHeaderViewState; } export function RoomListOptionsMenu({ vm }: Props): JSX.Element { diff --git a/src/components/views/rooms/RoomListPanel/RoomListSecondaryFilters.tsx b/src/components/views/rooms/RoomListPanel/RoomListSecondaryFilters.tsx index 6326fe6d7c..5747f9df84 100644 --- a/src/components/views/rooms/RoomListPanel/RoomListSecondaryFilters.tsx +++ b/src/components/views/rooms/RoomListPanel/RoomListSecondaryFilters.tsx @@ -10,7 +10,6 @@ import React, { type JSX } from "react"; import type { RoomListViewState } from "../../../viewmodels/roomlist/RoomListViewModel"; import { Flex } from "../../../utils/Flex"; import { _t } from "../../../../languageHandler"; -import { RoomListOptionsMenu } from "./RoomListOptionsMenu"; import { RoomListFilterMenu } from "./RoomListFilterMenu"; import { textForSecondaryFilter } from "./textForFilter"; @@ -36,7 +35,6 @@ export function RoomListSecondaryFilters({ vm }: Props): JSX.Element { > {activeFilterText} - ); } diff --git a/test/unit-tests/components/viewmodels/roomlist/RoomListHeaderViewModel-test.tsx b/test/unit-tests/components/viewmodels/roomlist/RoomListHeaderViewModel-test.tsx index 729ab02836..09109366cf 100644 --- a/test/unit-tests/components/viewmodels/roomlist/RoomListHeaderViewModel-test.tsx +++ b/test/unit-tests/components/viewmodels/roomlist/RoomListHeaderViewModel-test.tsx @@ -5,14 +5,15 @@ * Please see LICENSE files in the repository root for full details. */ -import { renderHook } from "jest-matrix-react"; +import { renderHook, act } from "jest-matrix-react"; import { JoinRule, type MatrixClient, type Room, RoomType } from "matrix-js-sdk/src/matrix"; import { mocked } from "jest-mock"; +import { range } from "lodash"; import { useRoomListHeaderViewModel } from "../../../../../src/components/viewmodels/roomlist/RoomListHeaderViewModel"; import SpaceStore from "../../../../../src/stores/spaces/SpaceStore"; import { mkStubRoom, stubClient, withClientContextRenderOptions } from "../../../../test-utils"; -import SettingsStore from "../../../../../src/settings/SettingsStore"; +import SettingsStore, { type CallbackFn } from "../../../../../src/settings/SettingsStore"; import defaultDispatcher from "../../../../../src/dispatcher/dispatcher"; import { Action } from "../../../../../src/dispatcher/actions"; import { @@ -23,6 +24,10 @@ import { showSpaceSettings, } from "../../../../../src/utils/space"; import { createRoom, hasCreateRoomRights } from "../../../../../src/components/viewmodels/roomlist/utils"; +import { SettingLevel } from "../../../../../src/settings/SettingLevel"; +import RoomListStoreV3 from "../../../../../src/stores/room-list-v3/RoomListStoreV3"; +import { SortOption } from "../../../../../src/components/viewmodels/roomlist/useSorter"; +import { SortingAlgorithm } from "../../../../../src/stores/room-list-v3/skip-list/sorters"; jest.mock("../../../../../src/components/viewmodels/roomlist/utils", () => ({ hasCreateRoomRights: jest.fn().mockReturnValue(false), @@ -199,4 +204,72 @@ describe("useRoomListHeaderViewModel", () => { expect(showSpaceSettings).toHaveBeenCalledWith(space); }); + + describe("Sorting", () => { + function mockAndCreateRooms() { + const rooms = range(10).map((i) => mkStubRoom(`foo${i}:matrix.org`, `Foo ${i}`, undefined)); + const fn = jest + .spyOn(RoomListStoreV3.instance, "getSortedRoomsInActiveSpace") + .mockImplementation(() => [...rooms]); + return { rooms, fn }; + } + + it("should change sort order", () => { + mockAndCreateRooms(); + const { result: vm } = render(); + + const resort = jest.spyOn(RoomListStoreV3.instance, "resort").mockImplementation(() => {}); + + // Change the sort option + act(() => { + vm.current.sort(SortOption.AToZ); + }); + + // Resort method in RLS must have been called + expect(resort).toHaveBeenCalledWith(SortingAlgorithm.Alphabetic); + }); + + it("should set activeSortOption based on value from settings", () => { + // Let's say that the user's preferred sorting is alphabetic + jest.spyOn(SettingsStore, "getValue").mockImplementation(() => SortingAlgorithm.Alphabetic); + + mockAndCreateRooms(); + const { result: vm } = render(); + expect(vm.current.activeSortOption).toEqual(SortOption.AToZ); + }); + }); + + describe("message preview toggle", () => { + it("should return shouldShowMessagePreview based on setting", () => { + jest.spyOn(SettingsStore, "getValue").mockImplementation(() => true); + const { result: vm } = render(); + expect(vm.current.shouldShowMessagePreview).toEqual(true); + }); + + it("should update when setting changes", async () => { + jest.spyOn(SettingsStore, "getValue").mockImplementation(() => true); + + let watchFn: CallbackFn; + jest.spyOn(SettingsStore, "watchSetting").mockImplementation((settingName, _roomId, fn) => { + if (settingName === "RoomList.showMessagePreview") watchFn = fn; + return ""; + }); + const { result: vm } = render(); + expect(vm.current.shouldShowMessagePreview).toEqual(true); + + jest.spyOn(SettingsStore, "getValue").mockImplementation(() => false); + act(() => watchFn("RoomList.showMessagePreview", "", SettingLevel.DEVICE, false, false)); + expect(vm.current.shouldShowMessagePreview).toEqual(false); + }); + + it("should change setting on toggle", () => { + jest.spyOn(SettingsStore, "getValue").mockImplementation(() => true); + const fn = jest.spyOn(SettingsStore, "setValue").mockImplementation(async () => {}); + + const { result: vm } = render(); + expect(vm.current.shouldShowMessagePreview).toEqual(true); + act(() => vm.current.toggleMessagePreview()); + expect(fn).toHaveBeenCalledWith("RoomList.showMessagePreview", null, "device", false); + }); + }); }); diff --git a/test/unit-tests/components/viewmodels/roomlist/RoomListViewModel-test.tsx b/test/unit-tests/components/viewmodels/roomlist/RoomListViewModel-test.tsx index 31b77c4522..47fe5f216e 100644 --- a/test/unit-tests/components/viewmodels/roomlist/RoomListViewModel-test.tsx +++ b/test/unit-tests/components/viewmodels/roomlist/RoomListViewModel-test.tsx @@ -14,16 +14,12 @@ import { mkStubRoom } from "../../../../test-utils"; import { useRoomListViewModel } from "../../../../../src/components/viewmodels/roomlist/RoomListViewModel"; import { FilterKey } from "../../../../../src/stores/room-list-v3/skip-list/filters"; import { SecondaryFilters } from "../../../../../src/components/viewmodels/roomlist/useFilteredRooms"; -import { SortingAlgorithm } from "../../../../../src/stores/room-list-v3/skip-list/sorters"; -import { SortOption } from "../../../../../src/components/viewmodels/roomlist/useSorter"; -import SettingsStore, { type CallbackFn } from "../../../../../src/settings/SettingsStore"; import { hasCreateRoomRights, createRoom } from "../../../../../src/components/viewmodels/roomlist/utils"; import dispatcher from "../../../../../src/dispatcher/dispatcher"; import { Action } from "../../../../../src/dispatcher/actions"; import { SdkContextClass } from "../../../../../src/contexts/SDKContext"; import SpaceStore from "../../../../../src/stores/spaces/SpaceStore"; import { UPDATE_SELECTED_SPACE } from "../../../../../src/stores/spaces"; -import { SettingLevel } from "../../../../../src/settings/SettingLevel"; jest.mock("../../../../../src/components/viewmodels/roomlist/utils", () => ({ hasCreateRoomRights: jest.fn().mockReturnValue(false), @@ -59,7 +55,7 @@ describe("RoomListViewModel", () => { const newRoom = mkStubRoom("bar:matrix.org", "Bar", undefined); rooms.push(newRoom); - act(() => RoomListStoreV3.instance.emit(LISTS_UPDATE_EVENT)); + await act(() => RoomListStoreV3.instance.emit(LISTS_UPDATE_EVENT)); await waitFor(() => { expect(vm.current.rooms).toContain(newRoom); @@ -253,72 +249,6 @@ describe("RoomListViewModel", () => { }); }); - describe("Sorting", () => { - it("should change sort order", () => { - mockAndCreateRooms(); - const { result: vm } = renderHook(() => useRoomListViewModel()); - - const resort = jest.spyOn(RoomListStoreV3.instance, "resort").mockImplementation(() => {}); - - // Change the sort option - act(() => { - vm.current.sort(SortOption.AToZ); - }); - - // Resort method in RLS must have been called - expect(resort).toHaveBeenCalledWith(SortingAlgorithm.Alphabetic); - }); - - it("should set activeSortOption based on value from settings", () => { - // Let's say that the user's preferred sorting is alphabetic - jest.spyOn(SettingsStore, "getValue").mockImplementation(() => SortingAlgorithm.Alphabetic); - - mockAndCreateRooms(); - const { result: vm } = renderHook(() => useRoomListViewModel()); - expect(vm.current.activeSortOption).toEqual(SortOption.AToZ); - }); - }); - - describe("message preview toggle", () => { - it("should return shouldShowMessagePreview based on setting", () => { - jest.spyOn(SettingsStore, "getValue").mockImplementation(() => true); - mockAndCreateRooms(); - const { result: vm } = renderHook(() => useRoomListViewModel()); - expect(vm.current.shouldShowMessagePreview).toEqual(true); - }); - - it("should update when setting changes", () => { - jest.spyOn(SettingsStore, "getValue").mockImplementation(() => true); - - let watchFn: CallbackFn; - jest.spyOn(SettingsStore, "watchSetting").mockImplementation((_settingname, _roomId, fn) => { - watchFn = fn; - return ""; - }); - mockAndCreateRooms(); - const { result: vm } = renderHook(() => useRoomListViewModel()); - expect(vm.current.shouldShowMessagePreview).toEqual(true); - - jest.spyOn(SettingsStore, "getValue").mockImplementation(() => false); - act(() => { - watchFn("RoomList.showMessagePreview", "", SettingLevel.DEVICE, false, false); - }); - expect(vm.current.shouldShowMessagePreview).toEqual(false); - }); - - it("should change setting on toggle", () => { - jest.spyOn(SettingsStore, "getValue").mockImplementation(() => true); - const fn = jest.spyOn(SettingsStore, "setValue").mockImplementation(async () => {}); - mockAndCreateRooms(); - const { result: vm } = renderHook(() => useRoomListViewModel()); - expect(vm.current.shouldShowMessagePreview).toEqual(true); - act(() => { - vm.current.toggleMessagePreview(); - }); - expect(fn).toHaveBeenCalledWith("RoomList.showMessagePreview", null, "device", false); - }); - }); - describe("Create room and chat", () => { it("should be canCreateRoom=false if hasCreateRoomRights=false", () => { mocked(hasCreateRoomRights).mockReturnValue(false); diff --git a/test/unit-tests/components/views/rooms/RoomListPanel/EmptyRoomList-test.tsx b/test/unit-tests/components/views/rooms/RoomListPanel/EmptyRoomList-test.tsx index 1483797778..89b14c1680 100644 --- a/test/unit-tests/components/views/rooms/RoomListPanel/EmptyRoomList-test.tsx +++ b/test/unit-tests/components/views/rooms/RoomListPanel/EmptyRoomList-test.tsx @@ -11,7 +11,6 @@ import userEvent from "@testing-library/user-event"; import { type RoomListViewState } from "../../../../../../src/components/viewmodels/roomlist/RoomListViewModel"; import { SecondaryFilters } from "../../../../../../src/components/viewmodels/roomlist/useFilteredRooms"; -import { SortOption } from "../../../../../../src/components/viewmodels/roomlist/useSorter"; import { EmptyRoomList } from "../../../../../../src/components/views/rooms/RoomListPanel/EmptyRoomList"; import { FilterKey } from "../../../../../../src/stores/room-list-v3/skip-list/filters"; @@ -25,13 +24,9 @@ describe("", () => { primaryFilters: [], activateSecondaryFilter: jest.fn().mockReturnValue({}), activeSecondaryFilter: SecondaryFilters.AllActivity, - sort: jest.fn(), - activeSortOption: SortOption.Activity, createRoom: jest.fn(), createChatRoom: jest.fn(), canCreateRoom: true, - shouldShowMessagePreview: false, - toggleMessagePreview: jest.fn(), activeIndex: undefined, }; }); diff --git a/test/unit-tests/components/views/rooms/RoomListPanel/RoomList-test.tsx b/test/unit-tests/components/views/rooms/RoomListPanel/RoomList-test.tsx index 61a0ec46aa..b4f9925fde 100644 --- a/test/unit-tests/components/views/rooms/RoomListPanel/RoomList-test.tsx +++ b/test/unit-tests/components/views/rooms/RoomListPanel/RoomList-test.tsx @@ -15,7 +15,6 @@ import { type RoomListViewState } from "../../../../../../src/components/viewmod import { RoomList } from "../../../../../../src/components/views/rooms/RoomListPanel/RoomList"; import DMRoomMap from "../../../../../../src/utils/DMRoomMap"; import { SecondaryFilters } from "../../../../../../src/components/viewmodels/roomlist/useFilteredRooms"; -import { SortOption } from "../../../../../../src/components/viewmodels/roomlist/useSorter"; import { Landmark, LandmarkNavigation } from "../../../../../../src/accessibility/LandmarkNavigation"; describe("", () => { @@ -36,10 +35,6 @@ describe("", () => { primaryFilters: [], activateSecondaryFilter: () => {}, activeSecondaryFilter: SecondaryFilters.AllActivity, - sort: jest.fn(), - activeSortOption: SortOption.Activity, - shouldShowMessagePreview: false, - toggleMessagePreview: jest.fn(), createRoom: jest.fn(), createChatRoom: jest.fn(), canCreateRoom: true, diff --git a/test/unit-tests/components/views/rooms/RoomListPanel/RoomListFilterMenu-test.tsx b/test/unit-tests/components/views/rooms/RoomListPanel/RoomListFilterMenu-test.tsx index e93d69052e..8d549e5e26 100644 --- a/test/unit-tests/components/views/rooms/RoomListPanel/RoomListFilterMenu-test.tsx +++ b/test/unit-tests/components/views/rooms/RoomListPanel/RoomListFilterMenu-test.tsx @@ -12,7 +12,6 @@ import { TooltipProvider } from "@vector-im/compound-web"; import { type RoomListViewState } from "../../../../../../src/components/viewmodels/roomlist/RoomListViewModel"; import { SecondaryFilters } from "../../../../../../src/components/viewmodels/roomlist/useFilteredRooms"; -import { SortOption } from "../../../../../../src/components/viewmodels/roomlist/useSorter"; import { RoomListFilterMenu } from "../../../../../../src/components/views/rooms/RoomListPanel/RoomListFilterMenu"; function getRenderOptions(): RenderOptions { @@ -34,10 +33,6 @@ describe("", () => { primaryFilters: [], activateSecondaryFilter: () => {}, activeSecondaryFilter: SecondaryFilters.AllActivity, - sort: jest.fn(), - activeSortOption: SortOption.Activity, - shouldShowMessagePreview: false, - toggleMessagePreview: jest.fn(), activeIndex: undefined, }; }); diff --git a/test/unit-tests/components/views/rooms/RoomListPanel/RoomListHeaderView-test.tsx b/test/unit-tests/components/views/rooms/RoomListPanel/RoomListHeaderView-test.tsx index a2422283c8..4840808fe4 100644 --- a/test/unit-tests/components/views/rooms/RoomListPanel/RoomListHeaderView-test.tsx +++ b/test/unit-tests/components/views/rooms/RoomListPanel/RoomListHeaderView-test.tsx @@ -15,6 +15,7 @@ import { useRoomListHeaderViewModel, } from "../../../../../../src/components/viewmodels/roomlist/RoomListHeaderViewModel"; import { RoomListHeaderView } from "../../../../../../src/components/views/rooms/RoomListPanel/RoomListHeaderView"; +import { SortOption } from "../../../../../../src/components/viewmodels/roomlist/useSorter"; jest.mock("../../../../../../src/components/viewmodels/roomlist/RoomListHeaderViewModel", () => ({ useRoomListHeaderViewModel: jest.fn(), @@ -29,6 +30,10 @@ describe("", () => { canCreateVideoRoom: true, canInviteInSpace: true, canAccessSpaceSettings: true, + sort: jest.fn(), + activeSortOption: SortOption.Activity, + shouldShowMessagePreview: false, + toggleMessagePreview: jest.fn(), createRoom: jest.fn(), createVideoRoom: jest.fn(), createChatRoom: jest.fn(), @@ -42,6 +47,13 @@ describe("", () => { jest.resetAllMocks(); }); + it("should render 'room options' button", async () => { + mocked(useRoomListHeaderViewModel).mockReturnValue(defaultValue); + const { asFragment } = render(); + expect(screen.getByRole("button", { name: "Room Options" })).toBeInTheDocument(); + expect(asFragment()).toMatchSnapshot(); + }); + describe("compose menu", () => { it("should display the compose menu", () => { mocked(useRoomListHeaderViewModel).mockReturnValue(defaultValue); diff --git a/test/unit-tests/components/views/rooms/RoomListPanel/RoomListOptionsMenu-test.tsx b/test/unit-tests/components/views/rooms/RoomListPanel/RoomListOptionsMenu-test.tsx index 0e2de64c4f..c476bda0d1 100644 --- a/test/unit-tests/components/views/rooms/RoomListPanel/RoomListOptionsMenu-test.tsx +++ b/test/unit-tests/components/views/rooms/RoomListPanel/RoomListOptionsMenu-test.tsx @@ -10,13 +10,13 @@ import { render, screen } from "jest-matrix-react"; import userEvent from "@testing-library/user-event"; import { RoomListOptionsMenu } from "../../../../../../src/components/views/rooms/RoomListPanel/RoomListOptionsMenu"; -import { type RoomListViewState } from "../../../../../../src/components/viewmodels/roomlist/RoomListViewModel"; +import { type RoomListHeaderViewState } from "../../../../../../src/components/viewmodels/roomlist/RoomListHeaderViewModel"; describe("", () => { it("should match snapshot", () => { const vm = { sort: jest.fn(), - } as unknown as RoomListViewState; + } as unknown as RoomListHeaderViewState; const { asFragment } = render(); @@ -29,7 +29,7 @@ describe("", () => { const vm = { sort: jest.fn(), activeSortOption: "Alphabetic", - } as unknown as RoomListViewState; + } as unknown as RoomListHeaderViewState; render(); @@ -47,7 +47,7 @@ describe("", () => { const vm = { sort: jest.fn(), activeSortOption: "Recency", - } as unknown as RoomListViewState; + } as unknown as RoomListHeaderViewState; render(); @@ -64,7 +64,7 @@ describe("", () => { const vm = { sort: jest.fn(), - } as unknown as RoomListViewState; + } as unknown as RoomListHeaderViewState; render(); @@ -81,7 +81,7 @@ describe("", () => { const vm = { sort: jest.fn(), activeSortOption: "Alphabetic", - } as unknown as RoomListViewState; + } as unknown as RoomListHeaderViewState; render(); @@ -97,7 +97,7 @@ describe("", () => { const vm = { shouldShowMessagePreview: false, - } as unknown as RoomListViewState; + } as unknown as RoomListHeaderViewState; render(); @@ -111,7 +111,7 @@ describe("", () => { const vm = { shouldShowMessagePreview: true, - } as unknown as RoomListViewState; + } as unknown as RoomListHeaderViewState; render(); @@ -125,7 +125,7 @@ describe("", () => { const vm = { toggleMessagePreview: jest.fn(), - } as unknown as RoomListViewState; + } as unknown as RoomListHeaderViewState; render(); diff --git a/test/unit-tests/components/views/rooms/RoomListPanel/RoomListPrimaryFilters-test.tsx b/test/unit-tests/components/views/rooms/RoomListPanel/RoomListPrimaryFilters-test.tsx index 4a80ea068e..ec8a60a395 100644 --- a/test/unit-tests/components/views/rooms/RoomListPanel/RoomListPrimaryFilters-test.tsx +++ b/test/unit-tests/components/views/rooms/RoomListPanel/RoomListPrimaryFilters-test.tsx @@ -12,7 +12,6 @@ import userEvent from "@testing-library/user-event"; import { type RoomListViewState } from "../../../../../../src/components/viewmodels/roomlist/RoomListViewModel"; import { SecondaryFilters } from "../../../../../../src/components/viewmodels/roomlist/useFilteredRooms"; import { RoomListPrimaryFilters } from "../../../../../../src/components/views/rooms/RoomListPanel/RoomListPrimaryFilters"; -import { SortOption } from "../../../../../../src/components/viewmodels/roomlist/useSorter"; import { FilterKey } from "../../../../../../src/stores/room-list-v3/skip-list/filters"; describe("", () => { @@ -31,10 +30,6 @@ describe("", () => { ], activateSecondaryFilter: () => {}, activeSecondaryFilter: SecondaryFilters.AllActivity, - sort: jest.fn(), - activeSortOption: SortOption.Activity, - shouldShowMessagePreview: false, - toggleMessagePreview: jest.fn(), activeIndex: undefined, }; }); diff --git a/test/unit-tests/components/views/rooms/RoomListPanel/RoomListSecondaryFilters-test.tsx b/test/unit-tests/components/views/rooms/RoomListPanel/RoomListSecondaryFilters-test.tsx deleted file mode 100644 index c2f6ef2cd8..0000000000 --- a/test/unit-tests/components/views/rooms/RoomListPanel/RoomListSecondaryFilters-test.tsx +++ /dev/null @@ -1,42 +0,0 @@ -/* - * 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 React from "react"; -import { render, screen } from "jest-matrix-react"; - -import { type RoomListViewState } from "../../../../../../src/components/viewmodels/roomlist/RoomListViewModel"; -import { SecondaryFilters } from "../../../../../../src/components/viewmodels/roomlist/useFilteredRooms"; -import { SortOption } from "../../../../../../src/components/viewmodels/roomlist/useSorter"; -import { RoomListSecondaryFilters } from "../../../../../../src/components/views/rooms/RoomListPanel/RoomListSecondaryFilters"; - -describe("", () => { - let vm: RoomListViewState; - - beforeEach(() => { - vm = { - isLoadingRooms: false, - rooms: [], - canCreateRoom: true, - createRoom: jest.fn(), - createChatRoom: jest.fn(), - primaryFilters: [], - activateSecondaryFilter: () => {}, - activeSecondaryFilter: SecondaryFilters.AllActivity, - sort: jest.fn(), - activeSortOption: SortOption.Activity, - shouldShowMessagePreview: false, - toggleMessagePreview: jest.fn(), - activeIndex: undefined, - }; - }); - - it("should render 'room options' button", async () => { - const { asFragment } = render(); - expect(screen.getByRole("button", { name: "Room Options" })).toBeInTheDocument(); - expect(asFragment()).toMatchSnapshot(); - }); -}); diff --git a/test/unit-tests/components/views/rooms/RoomListPanel/RoomListView-test.tsx b/test/unit-tests/components/views/rooms/RoomListPanel/RoomListView-test.tsx index b1bfe914e5..78cc3f5084 100644 --- a/test/unit-tests/components/views/rooms/RoomListPanel/RoomListView-test.tsx +++ b/test/unit-tests/components/views/rooms/RoomListPanel/RoomListView-test.tsx @@ -14,7 +14,6 @@ import { useRoomListViewModel, } from "../../../../../../src/components/viewmodels/roomlist/RoomListViewModel"; import { SecondaryFilters } from "../../../../../../src/components/viewmodels/roomlist/useFilteredRooms"; -import { SortOption } from "../../../../../../src/components/viewmodels/roomlist/useSorter"; import { RoomListView } from "../../../../../../src/components/views/rooms/RoomListPanel/RoomListView"; import { mkRoom, stubClient } from "../../../../../test-utils"; @@ -29,13 +28,9 @@ describe("", () => { primaryFilters: [], activateSecondaryFilter: jest.fn().mockReturnValue({}), activeSecondaryFilter: SecondaryFilters.AllActivity, - sort: jest.fn(), - activeSortOption: SortOption.Activity, createRoom: jest.fn(), createChatRoom: jest.fn(), canCreateRoom: true, - toggleMessagePreview: jest.fn(), - shouldShowMessagePreview: false, activeIndex: undefined, }; const matrixClient = stubClient(); diff --git a/test/unit-tests/components/views/rooms/RoomListPanel/__snapshots__/RoomListHeaderView-test.tsx.snap b/test/unit-tests/components/views/rooms/RoomListPanel/__snapshots__/RoomListHeaderView-test.tsx.snap index 8cef8f43ed..8a3caa1587 100644 --- a/test/unit-tests/components/views/rooms/RoomListPanel/__snapshots__/RoomListHeaderView-test.tsx.snap +++ b/test/unit-tests/components/views/rooms/RoomListPanel/__snapshots__/RoomListHeaderView-test.tsx.snap @@ -1,6 +1,252 @@ // Jest Snapshot v1, https://goo.gl/fbAQLP exports[` compose menu should display the compose menu 1`] = ` + +
+
+

+ title +

+ +
+
+ + +
+
+
+`; + +exports[` compose menu should not display the compose menu 1`] = ` + +
+
+

+ title +

+ +
+
+ + +
+
+
+`; + +exports[` should render 'room options' button 1`] = `
compose menu should display the compose menu 1`] - -
-
-`; - -exports[` compose menu should not display the compose menu 1`] = ` - -
-

- title -

+ + -
`; @@ -196,7 +396,7 @@ exports[` space menu should display the space menu 1`] = ` aria-label="Open space menu" class="_icon-button_m2erp_8 mx_SpaceMenu_button" data-state="closed" - id="radix-«rs»" + id="radix-«r28»" role="button" style="--cpd-icon-button-size: 20px;" tabindex="0" @@ -221,42 +421,79 @@ exports[` space menu should display the space menu 1`] = ` - + + + + + + + `; @@ -279,42 +516,79 @@ exports[` space menu should not display the space menu 1`] title - + + + + + + + `; diff --git a/test/unit-tests/components/views/rooms/RoomListPanel/__snapshots__/RoomListOptionsMenu-test.tsx.snap b/test/unit-tests/components/views/rooms/RoomListPanel/__snapshots__/RoomListOptionsMenu-test.tsx.snap index 9bc7a88508..aafcede2ad 100644 --- a/test/unit-tests/components/views/rooms/RoomListPanel/__snapshots__/RoomListOptionsMenu-test.tsx.snap +++ b/test/unit-tests/components/views/rooms/RoomListPanel/__snapshots__/RoomListOptionsMenu-test.tsx.snap @@ -8,7 +8,7 @@ exports[` should match snapshot 1`] = ` aria-haspopup="menu" aria-label="Room Options" aria-labelledby="«r2»" - class="_icon-button_m2erp_8 mx_RoomListSecondaryFilters_roomOptionsButton" + class="_icon-button_m2erp_8" data-state="closed" id="radix-«r0»" role="button" @@ -21,6 +21,7 @@ exports[` should match snapshot 1`] = ` style="--cpd-icon-button-size: 100%;" > should match snapshot 1`] = ` xmlns="http://www.w3.org/2000/svg" > diff --git a/test/unit-tests/components/views/rooms/RoomListPanel/__snapshots__/RoomListPanel-test.tsx.snap b/test/unit-tests/components/views/rooms/RoomListPanel/__snapshots__/RoomListPanel-test.tsx.snap index b11fb34819..c382698d49 100644 --- a/test/unit-tests/components/views/rooms/RoomListPanel/__snapshots__/RoomListPanel-test.tsx.snap +++ b/test/unit-tests/components/views/rooms/RoomListPanel/__snapshots__/RoomListPanel-test.tsx.snap @@ -23,36 +23,73 @@ exports[` should not render the RoomListSearch component when U Home - + + + + + + +
    should not render the RoomListSearch component when U aria-expanded="false" aria-haspopup="menu" aria-label="Filter" - aria-labelledby="«rk»" + aria-labelledby="«rr»" class="_icon-button_m2erp_8" data-state="closed" - id="radix-«ri»" + id="radix-«rp»" role="button" style="--cpd-icon-button-size: 28px;" tabindex="0" @@ -150,37 +187,6 @@ exports[` should not render the RoomListSearch component when U All activity -
    should render the RoomListSearch component when UICom Home
    - + + + + + + +
      should render the RoomListSearch component when UICom aria-expanded="false" aria-haspopup="menu" aria-label="Filter" - aria-labelledby="«r4»" + aria-labelledby="«rb»" class="_icon-button_m2erp_8" data-state="closed" - id="radix-«r2»" + id="radix-«r9»" role="button" style="--cpd-icon-button-size: 28px;" tabindex="0" @@ -405,37 +448,6 @@ exports[` should render the RoomListSearch component when UICom All activity -
      should render 'room options' button 1`] = ` - -
      - - All activity - -
      -
      -`;