mirror of
https://github.com/element-hq/element-web
synced 2024-11-27 19:56:47 +03:00
Handle off-cycle filtering updates in the new room list
This commit is contained in:
parent
1175eb001f
commit
9e76a2cebf
2 changed files with 16 additions and 3 deletions
|
@ -25,7 +25,7 @@ import { IListOrderingMap, ITagMap, ITagSortingMap, ListAlgorithm, SortAlgorithm
|
|||
import { ActionPayload } from "../../dispatcher/payloads";
|
||||
import defaultDispatcher from "../../dispatcher/dispatcher";
|
||||
import { readReceiptChangeIsFor } from "../../utils/read-receipts";
|
||||
import { IFilterCondition } from "./filters/IFilterCondition";
|
||||
import { FILTER_CHANGED, IFilterCondition } from "./filters/IFilterCondition";
|
||||
import { TagWatcher } from "./TagWatcher";
|
||||
import RoomViewStore from "../RoomViewStore";
|
||||
import { Algorithm, LIST_UPDATED_EVENT } from "./algorithms/Algorithm";
|
||||
|
@ -65,6 +65,7 @@ export class RoomListStore2 extends AsyncStore<ActionPayload> {
|
|||
for (const settingName of this.watchedSettings) SettingsStore.monitorSetting(settingName, null);
|
||||
RoomViewStore.addListener(() => this.handleRVSUpdate({}));
|
||||
this.algorithm.on(LIST_UPDATED_EVENT, this.onAlgorithmListUpdated);
|
||||
this.algorithm.on(FILTER_CHANGED, this.onAlgorithmFilterUpdated);
|
||||
}
|
||||
|
||||
public get orderedLists(): ITagMap {
|
||||
|
@ -479,6 +480,11 @@ export class RoomListStore2 extends AsyncStore<ActionPayload> {
|
|||
this.updateFn.mark();
|
||||
};
|
||||
|
||||
private onAlgorithmFilterUpdated = () => {
|
||||
// The filter can happen off-cycle, so trigger an update if we need to.
|
||||
this.updateFn.triggerIfWillMark();
|
||||
};
|
||||
|
||||
/**
|
||||
* Regenerates the room whole room list, discarding any previous results.
|
||||
* @param trigger Set to false to prevent a list update from being sent. Should only
|
||||
|
|
|
@ -153,11 +153,11 @@ export class Algorithm extends EventEmitter {
|
|||
// Populate the cache of the new filter
|
||||
this.allowedByFilter.set(filterCondition, this.rooms.filter(r => filterCondition.isVisible(r)));
|
||||
this.recalculateFilteredRooms();
|
||||
filterCondition.on(FILTER_CHANGED, this.recalculateFilteredRooms.bind(this));
|
||||
filterCondition.on(FILTER_CHANGED, this.handleFilterChange.bind(this));
|
||||
}
|
||||
|
||||
public removeFilterCondition(filterCondition: IFilterCondition): void {
|
||||
filterCondition.off(FILTER_CHANGED, this.recalculateFilteredRooms.bind(this));
|
||||
filterCondition.off(FILTER_CHANGED, this.handleFilterChange.bind(this));
|
||||
if (this.allowedByFilter.has(filterCondition)) {
|
||||
this.allowedByFilter.delete(filterCondition);
|
||||
|
||||
|
@ -169,6 +169,13 @@ export class Algorithm extends EventEmitter {
|
|||
}
|
||||
}
|
||||
|
||||
private async handleFilterChange() {
|
||||
await this.recalculateFilteredRooms();
|
||||
|
||||
// re-emit the update so the list store can fire an off-cycle update if needed
|
||||
this.emit(FILTER_CHANGED);
|
||||
}
|
||||
|
||||
private async updateStickyRoom(val: Room) {
|
||||
try {
|
||||
return await this.doUpdateStickyRoom(val);
|
||||
|
|
Loading…
Reference in a new issue