Move function to a private function
This commit is contained in:
parent
a7fe7cb28d
commit
760333a0ae
1 changed files with 63 additions and 60 deletions
|
@ -65,10 +65,62 @@ export abstract class Algorithm extends EventEmitter {
|
||||||
}
|
}
|
||||||
|
|
||||||
public set stickyRoom(val: Room) {
|
public set stickyRoom(val: Room) {
|
||||||
// We wrap this in a closure because we can't use async setters.
|
// setters can't be async, so we call a private function to do the work
|
||||||
// We need async so we can wait for handleRoomUpdate() to do its thing, otherwise
|
this.updateStickyRoom(val);
|
||||||
// we risk duplicating rooms.
|
}
|
||||||
(async () => {
|
|
||||||
|
protected get hasFilters(): boolean {
|
||||||
|
return this.allowedByFilter.size > 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
protected set cachedRooms(val: ITagMap) {
|
||||||
|
this._cachedRooms = val;
|
||||||
|
this.recalculateFilteredRooms();
|
||||||
|
this.recalculateStickyRoom();
|
||||||
|
}
|
||||||
|
|
||||||
|
protected get cachedRooms(): ITagMap {
|
||||||
|
// 🐉 Here be dragons.
|
||||||
|
// Note: this is used by the underlying algorithm classes, so don't make it return
|
||||||
|
// the sticky room cache. If it ends up returning the sticky room cache, we end up
|
||||||
|
// corrupting our caches and confusing them.
|
||||||
|
return this._cachedRooms;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Sets the filter conditions the Algorithm should use.
|
||||||
|
* @param filterConditions The filter conditions to use.
|
||||||
|
*/
|
||||||
|
public setFilterConditions(filterConditions: IFilterCondition[]): void {
|
||||||
|
for (const filter of filterConditions) {
|
||||||
|
this.addFilterCondition(filter);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
public addFilterCondition(filterCondition: IFilterCondition): void {
|
||||||
|
// 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));
|
||||||
|
}
|
||||||
|
|
||||||
|
public removeFilterCondition(filterCondition: IFilterCondition): void {
|
||||||
|
filterCondition.off(FILTER_CHANGED, this.recalculateFilteredRooms.bind(this));
|
||||||
|
if (this.allowedByFilter.has(filterCondition)) {
|
||||||
|
this.allowedByFilter.delete(filterCondition);
|
||||||
|
|
||||||
|
// If we removed the last filter, tell consumers that we've "updated" our filtered
|
||||||
|
// view. This will trick them into getting the complete room list.
|
||||||
|
if (!this.hasFilters) {
|
||||||
|
this.emit(LIST_UPDATED_EVENT);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
private async updateStickyRoom(val: Room) {
|
||||||
|
// Note throughout: We need async so we can wait for handleRoomUpdate() to do its thing,
|
||||||
|
// otherwise we risk duplicating rooms.
|
||||||
|
|
||||||
// It's possible to have no selected room. In that case, clear the sticky room
|
// It's possible to have no selected room. In that case, clear the sticky room
|
||||||
if (!val) {
|
if (!val) {
|
||||||
if (this._stickyRoom) {
|
if (this._stickyRoom) {
|
||||||
|
@ -124,55 +176,6 @@ export abstract class Algorithm extends EventEmitter {
|
||||||
|
|
||||||
// Finally, trigger an update
|
// Finally, trigger an update
|
||||||
this.emit(LIST_UPDATED_EVENT);
|
this.emit(LIST_UPDATED_EVENT);
|
||||||
})();
|
|
||||||
}
|
|
||||||
|
|
||||||
protected get hasFilters(): boolean {
|
|
||||||
return this.allowedByFilter.size > 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
protected set cachedRooms(val: ITagMap) {
|
|
||||||
this._cachedRooms = val;
|
|
||||||
this.recalculateFilteredRooms();
|
|
||||||
this.recalculateStickyRoom();
|
|
||||||
}
|
|
||||||
|
|
||||||
protected get cachedRooms(): ITagMap {
|
|
||||||
// 🐉 Here be dragons.
|
|
||||||
// Note: this is used by the underlying algorithm classes, so don't make it return
|
|
||||||
// the sticky room cache. If it ends up returning the sticky room cache, we end up
|
|
||||||
// corrupting our caches and confusing them.
|
|
||||||
return this._cachedRooms;
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Sets the filter conditions the Algorithm should use.
|
|
||||||
* @param filterConditions The filter conditions to use.
|
|
||||||
*/
|
|
||||||
public setFilterConditions(filterConditions: IFilterCondition[]): void {
|
|
||||||
for (const filter of filterConditions) {
|
|
||||||
this.addFilterCondition(filter);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
public addFilterCondition(filterCondition: IFilterCondition): void {
|
|
||||||
// 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));
|
|
||||||
}
|
|
||||||
|
|
||||||
public removeFilterCondition(filterCondition: IFilterCondition): void {
|
|
||||||
filterCondition.off(FILTER_CHANGED, this.recalculateFilteredRooms.bind(this));
|
|
||||||
if (this.allowedByFilter.has(filterCondition)) {
|
|
||||||
this.allowedByFilter.delete(filterCondition);
|
|
||||||
|
|
||||||
// If we removed the last filter, tell consumers that we've "updated" our filtered
|
|
||||||
// view. This will trick them into getting the complete room list.
|
|
||||||
if (!this.hasFilters) {
|
|
||||||
this.emit(LIST_UPDATED_EVENT);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
protected recalculateFilteredRooms() {
|
protected recalculateFilteredRooms() {
|
||||||
|
|
Loading…
Reference in a new issue