diff --git a/src/client/state/RoomsHierarchy.js b/src/client/state/RoomsHierarchy.js new file mode 100644 index 00000000..ce1036c0 --- /dev/null +++ b/src/client/state/RoomsHierarchy.js @@ -0,0 +1,46 @@ +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;