Skip to content

Commit c24a1ba

Browse files
RoomListViewModel: Reset primary and secondary filters on space change (#29672)
* Reset filters when space changes * Write test
1 parent d337106 commit c24a1ba

File tree

2 files changed

+37
-0
lines changed

2 files changed

+37
-0
lines changed

src/components/viewmodels/roomlist/useFilteredRooms.tsx

+8
Original file line numberDiff line numberDiff line change
@@ -13,6 +13,8 @@ import { _t, _td, type TranslationKey } from "../../../languageHandler";
1313
import RoomListStoreV3 from "../../../stores/room-list-v3/RoomListStoreV3";
1414
import { LISTS_UPDATE_EVENT } from "../../../stores/room-list/RoomListStore";
1515
import { useEventEmitter } from "../../../hooks/useEventEmitter";
16+
import SpaceStore from "../../../stores/spaces/SpaceStore";
17+
import { UPDATE_SELECTED_SPACE } from "../../../stores/spaces";
1618

1719
/**
1820
* Provides information about a primary filter.
@@ -119,6 +121,12 @@ export function useFilteredRooms(): FilteredRooms {
119121
setRooms(newRooms);
120122
}, []);
121123

124+
// Reset filters when active space changes
125+
useEventEmitter(SpaceStore.instance, UPDATE_SELECTED_SPACE, () => {
126+
setPrimaryFilter(undefined);
127+
activateSecondaryFilter(SecondaryFilters.AllActivity);
128+
});
129+
122130
const filterUndefined = (array: (FilterKey | undefined)[]): FilterKey[] =>
123131
array.filter((f) => f !== undefined) as FilterKey[];
124132

test/unit-tests/components/viewmodels/roomlist/RoomListViewModel-test.tsx

+29
Original file line numberDiff line numberDiff line change
@@ -22,6 +22,8 @@ import { hasCreateRoomRights, createRoom } from "../../../../../src/components/v
2222
import dispatcher from "../../../../../src/dispatcher/dispatcher";
2323
import { Action } from "../../../../../src/dispatcher/actions";
2424
import { SdkContextClass } from "../../../../../src/contexts/SDKContext";
25+
import SpaceStore from "../../../../../src/stores/spaces/SpaceStore";
26+
import { UPDATE_SELECTED_SPACE } from "../../../../../src/stores/spaces";
2527

2628
jest.mock("../../../../../src/components/viewmodels/roomlist/utils", () => ({
2729
hasCreateRoomRights: jest.fn().mockReturnValue(false),
@@ -185,6 +187,33 @@ describe("RoomListViewModel", () => {
185187
expect(fn).toHaveBeenLastCalledWith(expect.arrayContaining([FilterKey.MentionsFilter]));
186188
});
187189

190+
it("should remove all filters when active space is changed", async () => {
191+
mockAndCreateRooms();
192+
const { result: vm } = renderHook(() => useRoomListViewModel());
193+
194+
// Let's first toggle the People filter
195+
const i = vm.current.primaryFilters.findIndex((f) => f.name === "People");
196+
act(() => {
197+
vm.current.primaryFilters[i].toggle();
198+
});
199+
expect(vm.current.primaryFilters[i].active).toEqual(true);
200+
201+
// Let's say we toggle the mentions secondary filter
202+
act(() => {
203+
vm.current.activateSecondaryFilter(SecondaryFilters.MentionsOnly);
204+
});
205+
expect(vm.current.activeSecondaryFilter).toEqual(SecondaryFilters.MentionsOnly);
206+
207+
// Simulate a space change
208+
await act(() => SpaceStore.instance.emit(UPDATE_SELECTED_SPACE));
209+
210+
// Primary filer should have been unapplied
211+
expect(vm.current.activePrimaryFilter).toEqual(undefined);
212+
213+
// Secondary filter should be reset to "All Activity"
214+
expect(vm.current.activeSecondaryFilter).toEqual(SecondaryFilters.AllActivity);
215+
});
216+
188217
const testcases: Array<[string, { secondary: SecondaryFilters; filterKey: FilterKey }, string]> = [
189218
[
190219
"Mentions only",

0 commit comments

Comments
 (0)