--- /dev/null
+import { RoomHierarchy } from 'matrix-js-sdk/lib/room-hierarchy';
+
+class RoomsHierarchy {
+ constructor(matrixClient, limit = 20, maxDepth = 1, suggestedOnly = false) {
+ this.matrixClient = matrixClient;
+ this._maxDepth = maxDepth;
+ this._suggestedOnly = suggestedOnly;
+ this._limit = limit;
+
+ this.roomIdToHierarchy = new Map();
+ }
+
+ getHierarchy(roomId) {
+ return this.roomIdToHierarchy.get(roomId);
+ }
+
+ removeHierarchy(roomId) {
+ return this.roomIdToHierarchy.delete(roomId);
+ }
+
+ canLoadMore(roomId) {
+ const roomHierarchy = this.getHierarchy(roomId);
+ if (!roomHierarchy) return true;
+ return roomHierarchy.canLoadMore;
+ }
+
+ async load(roomId, limit = this._limit) {
+ let roomHierarchy = this.getHierarchy(roomId);
+
+ if (!roomHierarchy) {
+ const room = this.matrixClient.getRoom(roomId);
+ if (!room) return null;
+ roomHierarchy = new RoomHierarchy(room, limit, this._maxDepth, this._suggestedOnly);
+ this.roomIdToHierarchy.set(roomId, roomHierarchy);
+ }
+
+ try {
+ await roomHierarchy.load(limit);
+ return roomHierarchy.rooms;
+ } catch {
+ return roomHierarchy.rooms;
+ }
+ }
+}
+
+export default RoomsHierarchy;