3 files changed, 136 insertions, 0 deletions
diff --git a/MatrixUtils.Web/Shared/RoomListComponents/RoomListCategory.razor b/MatrixUtils.Web/Shared/RoomListComponents/RoomListCategory.razor
new file mode 100644
index 0000000..3d0070f
--- /dev/null
+++ b/MatrixUtils.Web/Shared/RoomListComponents/RoomListCategory.razor
@@ -0,0 +1,63 @@
+@using MatrixUtils.Web.Classes.Constants
+@using LibMatrix
+@using LibMatrix.EventTypes.Spec.State
+@using LibMatrix.Homeservers
+@using LibMatrix.Responses
+@using MatrixUtils.Abstractions
+<details>
+ <summary>@RoomType (@Rooms.Count)</summary>
+ @foreach (var room in Rooms) {
+ <div class="room-list-item">
+ <RoomListItem RoomInfo="@room" ShowOwnProfile="@(RoomType == "Room")"></RoomListItem>
+ @* @if (RoomVersionDangerLevel(room) != 0 && *@
+ @* (room.StateEvents.FirstOrDefault(x=>x.Type == "m.room.power_levels")?.TypedContent is RoomPowerLevelEventContent powerLevels && powerLevels.UserHasPermission(Homeserver.UserId, "m.room.tombstone"))) { *@
+ @* <MatrixUtils.Web.Shared.SimpleComponents.LinkButton Color="@(RoomVersionDangerLevel(room) == 2 ? "#ff0000" : "#ff8800")" href="@($"/Rooms/Create?Import={room.Room.RoomId}")">Upgrade room</MatrixUtils.Web.Shared.SimpleComponents.LinkButton> *@
+ @* } *@
+ <LinkButton href="@($"/Rooms/{room.Room.RoomId}/Timeline")">View timeline</LinkButton>
+ <LinkButton href="@($"/Rooms/{room.Room.RoomId}/State/View")">View state</LinkButton>
+ <LinkButton href="@($"/Rooms/{room.Room.RoomId}/State/Edit")">Edit state</LinkButton>
+
+ @if (room.CreationEventContent?.Type == "m.space") {
+ <RoomListSpace Space="@room"></RoomListSpace>
+ }
+ else if (room.CreationEventContent?.Type == "support.feline.policy.lists.msc.v1" || RoomType == "org.matrix.mjolnir.policy") {
+ <LinkButton href="@($"/Rooms/{room.Room.RoomId}/Policies")">Manage policies</LinkButton>
+ }
+ </div>
+ }
+</details>
+<br/>
+
+@code {
+
+ [Parameter]
+ public KeyValuePair<string, List<RoomInfo>> Category { get; set; }
+
+ [Parameter]
+ public UserProfileResponse? GlobalProfile { get; set; }
+
+ [CascadingParameter]
+ public AuthenticatedHomeserverGeneric Homeserver { get; set; } = null!;
+
+ private string RoomType => Category.Key;
+ private List<RoomInfo> Rooms => Category.Value;
+
+ private int RoomVersionDangerLevel(RoomInfo room) {
+ var creationEvent = room.StateEvents.FirstOrDefault(x => x?.Type == "m.room.create");
+ if (creationEvent is null) return 0;
+ return creationEvent.TypedContent is not RoomCreateEventContent roomVersionContent ? 0
+ : RoomConstants.DangerousRoomVersions.Contains(roomVersionContent.RoomVersion) ? 2
+ : roomVersionContent.RoomVersion != RoomConstants.RecommendedRoomVersion ? 1 : 0;
+ }
+
+ public static string GetRoomTypeName(string roomType) {
+ return roomType switch {
+ null => "Room",
+ "m.space" => "Space",
+ "org.matrix.mjolnir.policy" => "Policy room",
+
+ _ => roomType
+ };
+ }
+
+}
diff --git a/MatrixUtils.Web/Shared/RoomListComponents/RoomListPolicyRoom.razor b/MatrixUtils.Web/Shared/RoomListComponents/RoomListPolicyRoom.razor
new file mode 100644
index 0000000..7afdc8c
--- /dev/null
+++ b/MatrixUtils.Web/Shared/RoomListComponents/RoomListPolicyRoom.razor
@@ -0,0 +1,13 @@
+@using LibMatrix.RoomTypes
+<LinkButton href="@($"/Rooms/{Room.RoomId}/Policies")">Manage policies</LinkButton>
+
+@code {
+
+ [Parameter]
+ public GenericRoom Room { get; set; }
+
+ protected override async Task OnInitializedAsync() {
+ await base.OnInitializedAsync();
+ }
+
+}
diff --git a/MatrixUtils.Web/Shared/RoomListComponents/RoomListSpace.razor b/MatrixUtils.Web/Shared/RoomListComponents/RoomListSpace.razor
new file mode 100644
index 0000000..895d642
--- /dev/null
+++ b/MatrixUtils.Web/Shared/RoomListComponents/RoomListSpace.razor
@@ -0,0 +1,60 @@
+@using System.Collections.ObjectModel
+@using MatrixUtils.Abstractions
+<MatrixUtils.Web.Shared.SimpleComponents.LinkButton href="@($"/Rooms/{Space.Room.RoomId}/Space")">Manage space</MatrixUtils.Web.Shared.SimpleComponents.LinkButton>
+
+<br/>
+<details @ontoggle="SpaceChildrenOpened">
+ <summary>@Children.Count children</summary>
+ @if (_shouldRenderChildren) {
+ <p>Breadcrumb: @Breadcrumbs</p>
+ <div style="margin-left: 8px;">
+ <RoomList Rooms="Children"></RoomList>
+ </div>
+ }
+</details>
+
+@code {
+
+ [Parameter]
+ public RoomInfo Space { get; set; }
+
+ [Parameter, CascadingParameter]
+ public List<RoomInfo> KnownRooms { get; set; } = new();
+
+ [Parameter, CascadingParameter]
+ public string? Breadcrumbs {
+ get => _breadcrumbs + Space.Room.RoomId;
+ set => _breadcrumbs = value;
+ }
+
+ private ObservableCollection<RoomInfo> Children { get; set; } = new();
+
+ protected override async Task OnInitializedAsync() {
+ if (Breadcrumbs == null) throw new ArgumentNullException(nameof(Breadcrumbs));
+ await Task.Delay(Random.Shared.Next(1000, 10000));
+ var rooms = Space.Room.AsSpace.GetChildrenAsync();
+ await foreach (var room in rooms) {
+ if (Breadcrumbs.Contains(room.RoomId)) continue;
+ var roomInfo = KnownRooms.FirstOrDefault(x => x.Room.RoomId == room.RoomId);
+ if (roomInfo is null) {
+ roomInfo = new RoomInfo() {
+ Room = room
+ };
+ KnownRooms.Add(roomInfo);
+ }
+ Children.Add(roomInfo);
+ }
+ await base.OnInitializedAsync();
+ }
+
+ private bool _shouldRenderChildren = false;
+ private string? _breadcrumbs;
+
+ private Task SpaceChildrenOpened() {
+ if (_shouldRenderChildren) return Task.CompletedTask;
+ _shouldRenderChildren = true;
+ Console.WriteLine($"[RoomList] Rendering children of {Space.Room.RoomId}");
+ return Task.CompletedTask;
+ }
+
+}
|