From 3cf4c5749036e7be2365ab5de20df1ccfac35685 Mon Sep 17 00:00:00 2001 From: Florian Duros Date: Tue, 4 Mar 2025 16:12:48 +0100 Subject: [PATCH] filter test --- .../rooms/RoomListPanel/_RoomListPanel.pcss | 4 ++ .../viewmodels/roomlist/RoomListViewModel.tsx | 19 +++++++++- .../rooms/RoomListPanel/RoomListView.tsx | 37 ++++++++++++++++++- 3 files changed, 56 insertions(+), 4 deletions(-) diff --git a/res/css/views/rooms/RoomListPanel/_RoomListPanel.pcss b/res/css/views/rooms/RoomListPanel/_RoomListPanel.pcss index eb1f6e5fe5..5337c39119 100644 --- a/res/css/views/rooms/RoomListPanel/_RoomListPanel.pcss +++ b/res/css/views/rooms/RoomListPanel/_RoomListPanel.pcss @@ -10,3 +10,7 @@ height: 100%; border-right: 1px solid var(--cpd-color-bg-subtle-primary); } + +.mx_RoomFilters { + padding: var(--cpd-space-2x) var(--cpd-space-3x); +} diff --git a/src/components/viewmodels/roomlist/RoomListViewModel.tsx b/src/components/viewmodels/roomlist/RoomListViewModel.tsx index 9422676cf8..1ca62395ae 100644 --- a/src/components/viewmodels/roomlist/RoomListViewModel.tsx +++ b/src/components/viewmodels/roomlist/RoomListViewModel.tsx @@ -5,7 +5,7 @@ SPDX-License-Identifier: AGPL-3.0-only OR GPL-3.0-only OR LicenseRef-Element-Com Please see LICENSE files in the repository root for full details. */ -import { useCallback, useState } from "react"; +import { useCallback, useMemo, useState } from "react"; import type { Room } from "matrix-js-sdk/src/matrix"; import type { ViewRoomPayload } from "../../../dispatcher/payloads/ViewRoomPayload"; @@ -25,6 +25,8 @@ export interface RoomListViewState { * Open the room having given roomId. */ openRoom: (roomId: string) => void; + filter: "test" | "without test" | undefined; + setFilter: (filter: "test" | "without test" | undefined) => void; } /** @@ -33,6 +35,19 @@ export interface RoomListViewState { */ export function useRoomListViewModel(): RoomListViewState { const [rooms, setRooms] = useState(RoomListStoreV3.instance.getSortedRoomInActiveSpace()); + const [filter, setFilter] = useState<"test" | "without test" | undefined>(); + + const filterRooms = useMemo(() => { + return rooms.filter((room) => { + if (!filter) return true; + + if (filter === "test") { + return room.name.toLowerCase().includes("test"); + } else if (filter === "without test") { + return !room.name.toLowerCase().includes("test"); + } + }); + }, [rooms, filter]); useEventEmitter(RoomListStoreV3.instance, LISTS_UPDATE_EVENT, () => { const newRooms = RoomListStoreV3.instance.getSortedRoomInActiveSpace(); @@ -47,5 +62,5 @@ export function useRoomListViewModel(): RoomListViewState { }); }, []); - return { rooms, openRoom }; + return { rooms: filterRooms, openRoom, filter, setFilter }; } diff --git a/src/components/views/rooms/RoomListPanel/RoomListView.tsx b/src/components/views/rooms/RoomListPanel/RoomListView.tsx index 6e7734c91a..b240179982 100644 --- a/src/components/views/rooms/RoomListPanel/RoomListView.tsx +++ b/src/components/views/rooms/RoomListPanel/RoomListView.tsx @@ -6,12 +6,45 @@ */ import React, { type JSX } from "react"; +import { ChatFilter } from "@vector-im/compound-web"; -import { useRoomListViewModel } from "../../../viewmodels/roomlist/RoomListViewModel"; +import { type RoomListViewState, useRoomListViewModel } from "../../../viewmodels/roomlist/RoomListViewModel"; import { RoomList } from "./RoomList"; +import { Flex } from "../../../utils/Flex"; export function RoomListView(): JSX.Element { const vm = useRoomListViewModel(); // Room filters will be added soon - return ; + return ( + <> + + ; + + ); +} + +interface RoomFiltersProps { + /** + * The view model state for the room list. + */ + vm: RoomListViewState; +} + +function RoomFilters({ vm }: RoomFiltersProps): JSX.Element { + return ( + + vm.setFilter(vm.filter === "test" ? undefined : "test")} + > + With "Test" + + vm.setFilter(vm.filter === "without test" ? undefined : "without test")} + > + Without "Test" + + + ); }