diff options
Diffstat (limited to 'MatrixUtils.Web/Shared/RoomList.razor')
-rw-r--r-- | MatrixUtils.Web/Shared/RoomList.razor | 97 |
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 |