Trigger lazy loading when filtering using spaces

so that the filtered DMs are correct
This commit is contained in:
Michael Telatynski 2021-04-19 16:15:24 +01:00
parent 50dd9da913
commit 344e4b6c5b
2 changed files with 33 additions and 3 deletions

View file

@ -525,6 +525,26 @@ export class SpaceStoreClass extends AsyncStoreWithClient<IState> {
this.notificationStateMap.set(key, state);
return state;
}
// traverse space tree with DFS calling fn on each space including the given root one
public traverseSpace(
spaceId: string,
fn: (roomId: string) => void,
includeRooms = false,
parentPath?: Set<string>,
) {
if (parentPath && parentPath.has(spaceId)) return; // prevent cycles
fn(spaceId);
const newPath = new Set(parentPath).add(spaceId);
const [childSpaces, childRooms] = partitionSpacesAndRooms(this.getChildren(spaceId));
if (includeRooms) {
childRooms.forEach(r => fn(r.roomId));
}
childSpaces.forEach(s => this.traverseSpace(s.roomId, fn, includeRooms, newPath));
}
}
export default class SpaceStore {

View file

@ -28,12 +28,22 @@ export class SpaceWatcher {
private activeSpace: Room = SpaceStore.instance.activeSpace;
constructor(private store: RoomListStoreClass) {
this.filter.updateSpace(this.activeSpace); // get the filter into a consistent state
this.updateFilter(); // get the filter into a consistent state
store.addFilter(this.filter);
SpaceStore.instance.on(UPDATE_SELECTED_SPACE, this.onSelectedSpaceUpdated);
}
private onSelectedSpaceUpdated = (activeSpace) => {
this.filter.updateSpace(this.activeSpace = activeSpace);
private onSelectedSpaceUpdated = (activeSpace: Room) => {
this.activeSpace = activeSpace;
this.updateFilter();
};
private updateFilter = () => {
if (this.activeSpace) {
SpaceStore.instance.traverseSpace(this.activeSpace.roomId, roomId => {
this.store.matrixClient?.getRoom(roomId)?.loadMembersIfNeeded();
});
}
this.filter.updateSpace(this.activeSpace);
};
}