From c24a1baf38948147198fe6e8821ae4f53f9562ca Mon Sep 17 00:00:00 2001 From: R Midhun Suresh Date: Fri, 4 Apr 2025 14:10:25 +0530 Subject: [PATCH] RoomListViewModel: Reset primary and secondary filters on space change (#29672) * Reset filters when space changes * Write test --- .../viewmodels/roomlist/useFilteredRooms.tsx | 8 +++++ .../roomlist/RoomListViewModel-test.tsx | 29 +++++++++++++++++++ 2 files changed, 37 insertions(+) diff --git a/src/components/viewmodels/roomlist/useFilteredRooms.tsx b/src/components/viewmodels/roomlist/useFilteredRooms.tsx index 5e1554fcdc..4b4b9c0ec8 100644 --- a/src/components/viewmodels/roomlist/useFilteredRooms.tsx +++ b/src/components/viewmodels/roomlist/useFilteredRooms.tsx @@ -13,6 +13,8 @@ import { _t, _td, type TranslationKey } from "../../../languageHandler"; import RoomListStoreV3 from "../../../stores/room-list-v3/RoomListStoreV3"; import { LISTS_UPDATE_EVENT } from "../../../stores/room-list/RoomListStore"; import { useEventEmitter } from "../../../hooks/useEventEmitter"; +import SpaceStore from "../../../stores/spaces/SpaceStore"; +import { UPDATE_SELECTED_SPACE } from "../../../stores/spaces"; /** * Provides information about a primary filter. @@ -119,6 +121,12 @@ export function useFilteredRooms(): FilteredRooms { setRooms(newRooms); }, []); + // Reset filters when active space changes + useEventEmitter(SpaceStore.instance, UPDATE_SELECTED_SPACE, () => { + setPrimaryFilter(undefined); + activateSecondaryFilter(SecondaryFilters.AllActivity); + }); + const filterUndefined = (array: (FilterKey | undefined)[]): FilterKey[] => array.filter((f) => f !== undefined) as FilterKey[]; diff --git a/test/unit-tests/components/viewmodels/roomlist/RoomListViewModel-test.tsx b/test/unit-tests/components/viewmodels/roomlist/RoomListViewModel-test.tsx index 50d0fc4518..6ee1f5e3e4 100644 --- a/test/unit-tests/components/viewmodels/roomlist/RoomListViewModel-test.tsx +++ b/test/unit-tests/components/viewmodels/roomlist/RoomListViewModel-test.tsx @@ -22,6 +22,8 @@ import { hasCreateRoomRights, createRoom } from "../../../../../src/components/v 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"; jest.mock("../../../../../src/components/viewmodels/roomlist/utils", () => ({ hasCreateRoomRights: jest.fn().mockReturnValue(false), @@ -185,6 +187,33 @@ describe("RoomListViewModel", () => { expect(fn).toHaveBeenLastCalledWith(expect.arrayContaining([FilterKey.MentionsFilter])); }); + it("should remove all filters when active space is changed", async () => { + mockAndCreateRooms(); + const { result: vm } = renderHook(() => useRoomListViewModel()); + + // Let's first toggle the People filter + const i = vm.current.primaryFilters.findIndex((f) => f.name === "People"); + act(() => { + vm.current.primaryFilters[i].toggle(); + }); + expect(vm.current.primaryFilters[i].active).toEqual(true); + + // Let's say we toggle the mentions secondary filter + act(() => { + vm.current.activateSecondaryFilter(SecondaryFilters.MentionsOnly); + }); + expect(vm.current.activeSecondaryFilter).toEqual(SecondaryFilters.MentionsOnly); + + // Simulate a space change + await act(() => SpaceStore.instance.emit(UPDATE_SELECTED_SPACE)); + + // Primary filer should have been unapplied + expect(vm.current.activePrimaryFilter).toEqual(undefined); + + // Secondary filter should be reset to "All Activity" + expect(vm.current.activeSecondaryFilter).toEqual(SecondaryFilters.AllActivity); + }); + const testcases: Array<[string, { secondary: SecondaryFilters; filterKey: FilterKey }, string]> = [ [ "Mentions only",