about summary refs log tree commit diff
path: root/MatrixUtils.Web/Shared/RoomList.razor
diff options
context:
space:
mode:
Diffstat (limited to 'MatrixUtils.Web/Shared/RoomList.razor')
-rw-r--r--MatrixUtils.Web/Shared/RoomList.razor97
1 files changed, 97 insertions, 0 deletions
diff --git a/MatrixUtils.Web/Shared/RoomList.razor b/MatrixUtils.Web/Shared/RoomList.razor
new file mode 100644
index 0000000..ed443dd
--- /dev/null
+++ b/MatrixUtils.Web/Shared/RoomList.razor
@@ -0,0 +1,97 @@
+@using MatrixUtils.Web.Shared.RoomListComponents;
+@using LibMatrix
+@using LibMatrix.Extensions
+@using ArcaneLibs.Extensions
+@using LibMatrix.EventTypes.Spec.State
+@using System.Collections.ObjectModel
+@using LibMatrix.Responses
+@using MatrixUtils.Abstractions
+@using _Imports = MatrixUtils.Web._Imports
+@if (!StillFetching) {
+    <p>Fetching room details... @RoomsWithTypes.Sum(x => x.Value.Count) out of @Rooms.Count done!</p>
+    @foreach (var category in RoomsWithTypes.OrderBy(x => x.Value.Count)) {
+        <p>@category.Key (@category.Value.Count)</p>
+    }
+}
+else {
+    @foreach (var category in RoomsWithTypes.OrderBy(x => x.Value.Count)) {
+        <RoomListCategory Category="@category" GlobalProfile="@GlobalProfile"></RoomListCategory>
+    }
+}
+
+@code {
+
+    [Parameter]
+    public ObservableCollection<RoomInfo> Rooms { get; set; }
+
+    [Parameter]
+    public UserProfileResponse? GlobalProfile { get; set; }
+
+    [Parameter]
+    public bool StillFetching { get; set; } = true;
+
+    [Parameter]
+    public EventCallback<bool> StillFetchingChanged { get; set; }
+
+    private Dictionary<string, List<RoomInfo>> RoomsWithTypes => Rooms is null ? new() : Rooms.GroupBy(x => GetRoomTypeName(x.CreationEventContent?.Type)).ToDictionary(x => x.Key, x => x.ToList());
+
+    private bool hooked;
+    protected override async Task OnParametersSetAsync() {
+        var hs = await RMUStorage.GetCurrentSessionOrNavigate();
+        if (hs is null) return;
+        if (!hooked) {
+            Rooms.CollectionChanged += (_, args) => {
+                foreach (RoomInfo item in args.NewItems) {
+                    item.PropertyChanged += (_, args2) => {
+                        // Console.WriteLine(args2);
+                        
+                        if (args2.PropertyName == nameof(item.CreationEventContent))
+                            StateHasChanged();
+                    };
+                }
+            };
+            hooked = true;
+        }
+
+        // GlobalProfile ??= await hs.GetProfileAsync(hs.WhoAmI.UserId);
+
+        await base.OnParametersSetAsync();
+    }
+
+    private string GetRoomTypeName(string? roomType) => roomType switch {
+        null => "Room",
+        "m.space" => "Space",
+        "msc3588.stories.stories-room" => "Story room",
+        "support.feline.policy.lists.msc.v1" => "MSC3784 Policy list (v1)",
+        _ => roomType
+        };
+
+    // private static SemaphoreSlim _semaphoreSlim = new(8, 8);
+
+    // private async Task ProcessRoom(RoomInfo room) {
+    //     await _semaphoreSlim.WaitAsync();
+    //     string roomType;
+    //     try {
+    //         var createEvent = (await room.GetStateEvent("m.room.create")).TypedContent as RoomCreateEventContent;
+    //         roomType = GetRoomTypeName(createEvent.Type);
+    //
+    //         if (roomType == "Room") {
+    //             var mjolnirData = await room.GetStateEvent("org.matrix.mjolnir.shortcode");
+    //             if (mjolnirData?.RawContent?.ToJson(ignoreNull: true) is not null and not "{}")
+    //                 roomType = "Legacy policy room";
+    //         }
+    //     }
+    //     catch (MatrixException e) {
+    //         roomType = $"Error: {e.ErrorCode}";
+    //     }
+    //
+    //     // if (!RoomsWithTypes.ContainsKey(roomType)) {
+    //         // RoomsWithTypes.Add(roomType, new List<RoomInfo>());
+    //     // }
+    //     // RoomsWithTypes[roomType].Add(room);
+    //
+    //     StateHasChanged();
+    //     _semaphoreSlim.Release();
+    // }
+
+}
\ No newline at end of file