@using MatrixRoomUtils.Web.Shared.RoomListComponents; @using LibMatrix @using LibMatrix.Extensions @using ArcaneLibs.Extensions @using LibMatrix.EventTypes.Spec.State @using System.Collections.ObjectModel @using _Imports = MatrixRoomUtils.Web._Imports @if (!StillFetching) {

Fetching room details... @RoomsWithTypes.Sum(x => x.Value.Count) out of @Rooms.Count done!

@foreach (var category in RoomsWithTypes.OrderBy(x => x.Value.Count)) {

@category.Key (@category.Value.Count)

} } else { @foreach (var category in RoomsWithTypes.OrderBy(x => x.Value.Count)) { } } @code { [Parameter] public ObservableCollection Rooms { get; set; } [Parameter] public ProfileResponseEventContent? GlobalProfile { get; set; } [Parameter] public bool StillFetching { get; set; } = true; [Parameter] public EventCallback StillFetchingChanged { get; set; } private Dictionary> RoomsWithTypes => Rooms is null ? new() : Rooms.GroupBy(x => GetRoomTypeName(x.CreationEventContent?.Type)).ToDictionary(x => x.Key, x => x.ToList()); protected override async Task OnParametersSetAsync() { var hs = await MRUStorage.GetCurrentSessionOrNavigate(); if (hs is null) return; Rooms.CollectionChanged += (_, args) => { foreach (RoomInfo item in args.NewItems) { item.PropertyChanged += (_, args2) => { Console.WriteLine(args2); if(args2.PropertyName == nameof(item.CreationEventContent)) StateHasChanged(); }; } }; // GlobalProfile ??= await hs.GetProfileAsync(hs.WhoAmI.UserId); await base.OnParametersSetAsync(); } private string GetRoomTypeName(string? roomType) => roomType switch { "m.space" => "Space", "msc3588.stories.stories-room" => "Story room", "support.feline.policy.lists.msc.v1" => "MSC3784 Policy list (v1)", null => "Room", _ => 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()); // // } // // RoomsWithTypes[roomType].Add(room); // // StateHasChanged(); // _semaphoreSlim.Release(); // } }