Skip to content

Commit 3cf4c57

Browse files
committed
filter test
1 parent e329640 commit 3cf4c57

File tree

3 files changed

+56
-4
lines changed

3 files changed

+56
-4
lines changed

res/css/views/rooms/RoomListPanel/_RoomListPanel.pcss

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -10,3 +10,7 @@
1010
height: 100%;
1111
border-right: 1px solid var(--cpd-color-bg-subtle-primary);
1212
}
13+
14+
.mx_RoomFilters {
15+
padding: var(--cpd-space-2x) var(--cpd-space-3x);
16+
}

src/components/viewmodels/roomlist/RoomListViewModel.tsx

Lines changed: 17 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,7 @@ SPDX-License-Identifier: AGPL-3.0-only OR GPL-3.0-only OR LicenseRef-Element-Com
55
Please see LICENSE files in the repository root for full details.
66
*/
77

8-
import { useCallback, useState } from "react";
8+
import { useCallback, useMemo, useState } from "react";
99

1010
import type { Room } from "matrix-js-sdk/src/matrix";
1111
import type { ViewRoomPayload } from "../../../dispatcher/payloads/ViewRoomPayload";
@@ -25,6 +25,8 @@ export interface RoomListViewState {
2525
* Open the room having given roomId.
2626
*/
2727
openRoom: (roomId: string) => void;
28+
filter: "test" | "without test" | undefined;
29+
setFilter: (filter: "test" | "without test" | undefined) => void;
2830
}
2931

3032
/**
@@ -33,6 +35,19 @@ export interface RoomListViewState {
3335
*/
3436
export function useRoomListViewModel(): RoomListViewState {
3537
const [rooms, setRooms] = useState(RoomListStoreV3.instance.getSortedRoomInActiveSpace());
38+
const [filter, setFilter] = useState<"test" | "without test" | undefined>();
39+
40+
const filterRooms = useMemo(() => {
41+
return rooms.filter((room) => {
42+
if (!filter) return true;
43+
44+
if (filter === "test") {
45+
return room.name.toLowerCase().includes("test");
46+
} else if (filter === "without test") {
47+
return !room.name.toLowerCase().includes("test");
48+
}
49+
});
50+
}, [rooms, filter]);
3651

3752
useEventEmitter(RoomListStoreV3.instance, LISTS_UPDATE_EVENT, () => {
3853
const newRooms = RoomListStoreV3.instance.getSortedRoomInActiveSpace();
@@ -47,5 +62,5 @@ export function useRoomListViewModel(): RoomListViewState {
4762
});
4863
}, []);
4964

50-
return { rooms, openRoom };
65+
return { rooms: filterRooms, openRoom, filter, setFilter };
5166
}

src/components/views/rooms/RoomListPanel/RoomListView.tsx

Lines changed: 35 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -6,12 +6,45 @@
66
*/
77

88
import React, { type JSX } from "react";
9+
import { ChatFilter } from "@vector-im/compound-web";
910

10-
import { useRoomListViewModel } from "../../../viewmodels/roomlist/RoomListViewModel";
11+
import { type RoomListViewState, useRoomListViewModel } from "../../../viewmodels/roomlist/RoomListViewModel";
1112
import { RoomList } from "./RoomList";
13+
import { Flex } from "../../../utils/Flex";
1214

1315
export function RoomListView(): JSX.Element {
1416
const vm = useRoomListViewModel();
1517
// Room filters will be added soon
16-
return <RoomList vm={vm} />;
18+
return (
19+
<>
20+
<RoomFilters vm={vm} />
21+
<RoomList vm={vm} />;
22+
</>
23+
);
24+
}
25+
26+
interface RoomFiltersProps {
27+
/**
28+
* The view model state for the room list.
29+
*/
30+
vm: RoomListViewState;
31+
}
32+
33+
function RoomFilters({ vm }: RoomFiltersProps): JSX.Element {
34+
return (
35+
<Flex className="mx_RoomFilters" align="center" gap="var(--cpd-space-2x)">
36+
<ChatFilter
37+
selected={vm.filter === "test"}
38+
onClick={() => vm.setFilter(vm.filter === "test" ? undefined : "test")}
39+
>
40+
With "Test"
41+
</ChatFilter>
42+
<ChatFilter
43+
selected={vm.filter === "without test"}
44+
onClick={() => vm.setFilter(vm.filter === "without test" ? undefined : "without test")}
45+
>
46+
Without "Test"
47+
</ChatFilter>
48+
</Flex>
49+
);
1750
}

0 commit comments

Comments
 (0)