From b95d5f89ec63e5ec4c93ee7c272ac0de48989d11 Mon Sep 17 00:00:00 2001 From: Florian Duros Date: Wed, 15 Apr 2026 15:38:48 +0200 Subject: [PATCH] feat: add in skip list a method to change filters --- .../room-list-v3/skip-list/RoomSkipList.ts | 11 +++++++++ .../skip-list/RoomSkipList-test.ts | 23 +++++++++++++++++++ 2 files changed, 34 insertions(+) diff --git a/apps/web/src/stores/room-list-v3/skip-list/RoomSkipList.ts b/apps/web/src/stores/room-list-v3/skip-list/RoomSkipList.ts index 93c898ee21..dfa5b678e0 100644 --- a/apps/web/src/stores/room-list-v3/skip-list/RoomSkipList.ts +++ b/apps/web/src/stores/room-list-v3/skip-list/RoomSkipList.ts @@ -76,6 +76,17 @@ export class RoomSkipList implements Iterable { this.seed(rooms); } + /** + * Change the filters used by the skip list. + * This will apply the new filters to all existing nodes. + */ + public useNewFilters(filters: Filter[]): void { + this.filters = filters; + for (const node of this.roomNodeMap.values()) { + node.applyFilters(this.filters); + } + } + /** * Removes a given room from the skip list. */ diff --git a/apps/web/test/unit-tests/stores/room-list-v3/skip-list/RoomSkipList-test.ts b/apps/web/test/unit-tests/stores/room-list-v3/skip-list/RoomSkipList-test.ts index a742e56370..8640f3491e 100644 --- a/apps/web/test/unit-tests/stores/room-list-v3/skip-list/RoomSkipList-test.ts +++ b/apps/web/test/unit-tests/stores/room-list-v3/skip-list/RoomSkipList-test.ts @@ -18,6 +18,9 @@ import { getMockedRooms } from "./getMockedRooms"; import SpaceStore from "../../../../../src/stores/spaces/SpaceStore"; import { MetaSpace } from "../../../../../src/stores/spaces"; import { RoomNotificationStateStore } from "../../../../../src/stores/notifications/RoomNotificationStateStore"; +import { FavouriteFilter } from "../../../../../src/stores/room-list-v3/skip-list/filters/FavouriteFilter"; +import { FilterEnum } from "../../../../../src/stores/room-list-v3/skip-list/filters"; +import { DefaultTagID } from "../../../../../src/stores/room-list-v3/skip-list/tag"; describe("RoomSkipList", () => { function generateSkipList(roomCount?: number): { @@ -99,6 +102,26 @@ describe("RoomSkipList", () => { expect(() => skipList.addNewRoom(room)).toThrow("Can't add room to skiplist"); }); + it("Filters are applied to existing nodes when useNewFilters is called", () => { + const { skipList, rooms } = generateSkipList(10); + + // Mark some rooms as favourite + const favouriteRooms = [rooms[2], rooms[5], rooms[8]]; + for (const room of favouriteRooms) { + room.tags = { [DefaultTagID.Favourite]: { order: 0 } }; + } + + // No filters yet — all rooms are in the list + expect(skipList.size).toEqual(10); + + // Apply the favourite filter + skipList.useNewFilters([new FavouriteFilter()]); + + // Only favourite rooms should be returned when filtering by favourite + const filteredRooms = Array.from(skipList.getRoomsInActiveSpace([FilterEnum.FavouriteFilter])); + expect(filteredRooms).toHaveLength(favouriteRooms.length); + }); + it("Re-sort works when sorter is swapped", () => { const { skipList, rooms, sorter } = generateSkipList(); const sortedByRecency = [...rooms].sort((a, b) => sorter.comparator(a, b));