about summary refs log tree commit diff
path: root/MatrixUtils.Web/Pages/Rooms/Space.razor
diff options
context:
space:
mode:
Diffstat (limited to 'MatrixUtils.Web/Pages/Rooms/Space.razor')
-rw-r--r--MatrixUtils.Web/Pages/Rooms/Space.razor52
1 files changed, 49 insertions, 3 deletions
diff --git a/MatrixUtils.Web/Pages/Rooms/Space.razor b/MatrixUtils.Web/Pages/Rooms/Space.razor
index 01ab1c4..088fdcd 100644
--- a/MatrixUtils.Web/Pages/Rooms/Space.razor
+++ b/MatrixUtils.Web/Pages/Rooms/Space.razor
@@ -1,12 +1,17 @@
 @page "/Rooms/{RoomId}/Space"
+@using System.Collections.ObjectModel
 @using LibMatrix.RoomTypes
 @using ArcaneLibs.Extensions
 @using LibMatrix
+@using MatrixUtils.Abstractions
 <h3>Room manager - Viewing Space</h3>
 
+<span>Add new room to space: </span>
+<FancyTextBox @bind-Value="@NewRoomId"></FancyTextBox>
+<button onclick="@AddNewRoom">Add</button>
 <button onclick="@JoinAllRooms">Join all rooms</button>
 @foreach (var room in Rooms) {
-    <RoomListItem Room="room" ShowOwnProfile="true"></RoomListItem>
+    <RoomListItem RoomInfo="room" ShowOwnProfile="true"></RoomListItem>
 }
 
 
@@ -27,8 +32,9 @@
     private GenericRoom? Room { get; set; }
 
     private StateEventResponse[] States { get; set; } = Array.Empty<StateEventResponse>();
-    private List<GenericRoom> Rooms { get; } = new();
+    private List<RoomInfo> Rooms { get; } = new();
     private List<string> ServersInSpace { get; } = new();
+    private string? NewRoomId { get; set; }
 
     protected override async Task OnInitializedAsync() {
         var hs = await RMUStorage.GetCurrentSessionOrNavigate();
@@ -43,7 +49,18 @@
                     var roomId = stateEvent.StateKey;
                     var room = hs.GetRoom(roomId);
                     if (room is not null) {
-                        Rooms.Add(room);
+                        Task.Run(async () => {
+                            try {
+                                Rooms.Add(new(Room, await room.GetFullStateAsListAsync()));
+                            }
+                            catch (MatrixException e) {
+                                if (e is { ErrorCode: MatrixException.ErrorCodes.M_FORBIDDEN }) {
+                                    Rooms.Add(new(Room) {
+                                        RoomName = "M_FORBIDDEN"
+                                    });
+                                }
+                            }
+                        });
                     }
                     break;
                 }
@@ -96,8 +113,37 @@
         // List<Task<RoomIdResponse>> tasks = Rooms.Select(room => room.JoinAsync(ServersInSpace.ToArray())).ToList();
         // await Task.WhenAll(tasks);
         foreach (var room in Rooms) {
+            await JoinRecursive(room.Room.RoomId);
+        }
+    }
+
+    private async Task JoinRecursive(string roomId) {
+        var room = Room!.Homeserver.GetRoom(roomId);
+        if (room is null) return;
+        try {
             await room.JoinAsync(ServersInSpace.ToArray());
+            var joined = false;
+            while (!joined) {
+                var ce = await room.GetCreateEventAsync();
+                if(ce is null) continue;
+                if (ce.Type == "m.space") {
+                     var children = room.AsSpace.GetChildrenAsync(false);
+                     await foreach (var child in children) {
+                         JoinRecursive(child.RoomId);
+                     }
+                }
+                joined = true;
+            }
         }
+        catch (Exception e) {
+            Console.WriteLine(e);
+        }
+
+    }
+
+    private async Task AddNewRoom() {
+        if (string.IsNullOrWhiteSpace(NewRoomId)) return;
+        await Room.AsSpace.AddChildByIdAsync(NewRoomId);
     }
 
 }