@using LibMatrix.Homeservers @using LibMatrix.RoomTypes @using LibMatrix @using LibMatrix.EventTypes.Spec.State @using LibMatrix.Responses @using MatrixUtils.LibDMSpace @using MatrixUtils.LibDMSpace.StateEvents @using ArcaneLibs.Extensions @using System.Text.Json.Serialization @using MatrixUtils.Abstractions DM Space setup tool - stage 3: Preview space layout

This gives you a preview of how your settings would impact layout!

@if (!string.IsNullOrWhiteSpace(Status)) {

@Status

} @if (SetupData is not null) { @if (SetupData.DMSpaceRoomInfo is not null) {

Create sub-spaces per user

@if (!SetupData.DmSpaceInfo.LayerByUser) { @foreach (var (userId, room) in SetupData.DMRooms.OrderBy(x => x.Key.DisplayName)) { @foreach (var roomInfo in room) {
} } } else { @foreach (var (user, room) in SetupData.DMRooms.OrderBy(x => x.Key.DisplayName)) {
@{ RoomInfo fakeRoom = new(SetupData.DMSpaceRoomInfo.Room) { RoomName = user.DisplayName ?? user.Id, RoomIcon = user.AvatarUrl }; }
@foreach (var roomInfo in room) {
} } } } else { Error: SetupData.DMSpaceRoomInfo is null! } } else { Error: DMSpaceRootPageConfiguration is null! }
Next @code { private string? Status { get => _status; set { _status = value; StateHasChanged(); } } private string? _status; [CascadingParameter] public DMSpace.DMSpaceSetupData SetupData { get; set; } SemaphoreSlim _semaphore = new(1, 1); protected override async Task OnInitializedAsync() { if (SetupData is null) return; await _semaphore.WaitAsync(); var hs = SetupData.Homeserver; // var dmSpaceRoom = new DMSpaceRoom(hs, SetupData.DmSpaceConfiguration.DMSpaceId); // SetupData. // dmSpaceRoomInfo = new() { // RoomName = await dmSpaceRoom.GetNameAsync(), // CreationEventContent = await dmSpaceRoom.GetCreateEventAsync(), // RoomIcon = "mxc://feline.support/uUxBwaboPkMGtbZcAGZaIzpK", // Room = dmSpaceRoom // }; // dmSpaceInfo = await dmSpaceRoom.GetDMSpaceInfo(); // Status = "Loading DM list from account data..."; // var dms = await SetupData.Homeserver.GetAccountDataAsync>>("m.direct"); Status = "DM list optimised, fetching info..."; // var results = dms.Select(async x => { // var (userId, rooms) = x; // UserProfileWithId userProfile; // try { // var profile = await SetupData.Homeserver.GetProfileAsync(userId); // userProfile = new() { // AvatarUrl = profile.AvatarUrl, // Id = userId, // DisplayName = profile.DisplayName // }; // } // catch { // userProfile = new() { // AvatarUrl = "mxc://feline.support/uUxBwaboPkMGtbZcAGZaIzpK", // DisplayName = userId, // Id = userId // }; // } // var roomList = new List(); // var tasks = rooms.Select(x => GetRoomInfo(hs.GetRoom(x))).ToAsyncEnumerable(); // await foreach (var result in tasks) // roomList.Add(result); // return (userProfile, roomList); // }).ToAsyncEnumerable(); // await foreach (var res in results) { // dmRooms.Add(new RoomInfo() { // Room = dmSpaceRoom, // RoomIcon = res.userProfile.AvatarUrl, // RoomName = res.userProfile.DisplayName, // CreationEventContent = await dmSpaceRoom.GetCreateEventAsync() // }, res.roomList); // } await SetupData.DMSpaceRoomInfo!.FetchAllStateAsync(); _semaphore.Release(); Status = null; await base.OnParametersSetAsync(); } private async Task Execute() { var hs = SetupData.Homeserver; var dmSpaceRoom = new DMSpaceRoom(hs, SetupData.DmSpaceConfiguration!.DMSpaceId!); await dmSpaceRoom.ImportNativeDMs(); NavigationManager.NavigateTo("/User/DMSpace/Setup?stage=3"); } private async Task GetRoomInfo(GenericRoom room) { var roomInfo = new RoomInfo(room); var roomMembers = new List(); roomInfo.CreationEventContent = await room.GetCreateEventAsync(); try { roomInfo.RoomName = await room.GetNameAsync(); } catch { } var membersEnum = room.GetMembersEnumerableAsync(true); await foreach (var member in membersEnum) if (member.TypedContent is RoomMemberEventContent memberEvent) roomMembers.Add(new() { DisplayName = memberEvent.DisplayName, AvatarUrl = memberEvent.AvatarUrl, Id = member.StateKey }); if (string.IsNullOrWhiteSpace(roomInfo.RoomName) || roomInfo.RoomName == room.RoomId) { List displayNames = new List(); foreach (var member in roomMembers) if (!string.IsNullOrWhiteSpace(member.DisplayName)) displayNames.Add(member.DisplayName); roomInfo.RoomName = string.Join(", ", displayNames); } try { string? roomIcon = (await room.GetAvatarUrlAsync())?.Url; if (room is not null) roomInfo.RoomIcon = roomIcon; } catch { } return roomInfo; } private async Task> GetRoomInfoForRooms(List rooms) { var tasks = rooms.Select(GetRoomInfo).ToList(); await Task.WhenAll(tasks); return tasks.Select(x => x.Result).ToList(); } private class UserProfileWithId : UserProfileResponse { [JsonIgnore] public string Id { get; set; } } }