@page "/User/Profile" @using LibMatrix.EventTypes.Spec.State @using ArcaneLibs.Extensions @using LibMatrix @using LibMatrix.Responses @using MatrixUtils.Abstractions @using Microsoft.AspNetCore.Components.Forms

Manage Profile - @Homeserver?.WhoAmI?.UserId


@if (NewProfile is not null) {

Profile


Display name:
Avatar URL:
Update profile Update profile (restore room overrides)
@if (!string.IsNullOrWhiteSpace(Status)) {

@Status

}
@*
*@

Room profiles

@foreach (var room in Rooms) {
@if (room.OwnMembership is not null) {
Display name:
Avatar URL:
Update profile

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

@Status

} } else {

Something went wrong, own membership is missing...

}

} @foreach (var (roomId, roomProfile) in RoomProfiles.OrderBy(x => RoomNames.TryGetValue(x.Key, out var _name) ? _name : x.Key)) {
@(RoomNames.TryGetValue(roomId, out var name) ? name : roomId)
Display name:
Avatar URL:
Update profile

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

@Status

}

} //
} @code { private string? _status = null; private AuthenticatedHomeserverGeneric? Homeserver { get; set; } private UserProfileResponse? NewProfile { get; set; } private UserProfileResponse? OldProfile { get; set; } private string? Status { get => _status; set { _status = value; StateHasChanged(); } } private List Rooms { get; set; } = new(); private Dictionary RoomProfiles { get; set; } = new(); private Dictionary RoomNames { get; set; } = new(); protected override async Task OnInitializedAsync() { Homeserver = await RMUStorage.GetCurrentSessionOrNavigate(); if (Homeserver is null) return; Status = "Loading global profile..."; if (Homeserver.WhoAmI?.UserId is null) return; NewProfile = (await Homeserver.GetProfileAsync(Homeserver.WhoAmI.UserId)); //.DeepClone(); OldProfile = (await Homeserver.GetProfileAsync(Homeserver.WhoAmI.UserId)); //.DeepClone(); Status = "Loading room profiles..."; var roomProfiles = Homeserver.GetRoomProfilesAsync(); await foreach (var (roomId, roomProfile) in roomProfiles) { var room = Homeserver.GetRoom(roomId); var roomNameTask = room.GetNameOrFallbackAsync(); var roomIconTask = room.GetAvatarUrlAsync(); var roomInfo = new RoomInfo(room) { OwnMembership = roomProfile }; try { roomInfo.RoomIcon = (await roomIconTask).Url; } catch (MatrixException e) { if (e is not { ErrorCode: "M_NOT_FOUND" }) throw; } try { roomInfo.RoomName = await roomNameTask; } catch (MatrixException e) { if (e is not { ErrorCode: "M_NOT_FOUND" }) throw; } Rooms.Add(roomInfo); // Status = $"Got profile for {roomId}..."; RoomProfiles[roomId] = roomProfile; //.DeepClone(); } StateHasChanged(); Status = "Room profiles loaded, loading room names..."; var roomNameTasks = RoomProfiles.Keys.Select(x => Homeserver.GetRoom(x)).Select(async x => { var name = await x.GetNameOrFallbackAsync(); return new KeyValuePair(x.RoomId, name); }).ToAsyncEnumerable(); await foreach (var (roomId, roomName) in roomNameTasks) { // Status = $"Got room name for {roomId}: {roomName}"; RoomNames[roomId] = roomName; } StateHasChanged(); Status = null; await base.OnInitializedAsync(); } private async Task AvatarChanged(InputFileChangeEventArgs arg) { var res = await Homeserver.UploadFile(arg.File.Name, arg.File.OpenReadStream(Int64.MaxValue), arg.File.ContentType); Console.WriteLine(res); NewProfile.AvatarUrl = res; StateHasChanged(); } private async Task UpdateProfile(bool restoreRoomProfiles = false) { Status = "Busy processing global profile update, please do not leave this page..."; StateHasChanged(); await Homeserver.UpdateProfileAsync(NewProfile, restoreRoomProfiles); Status = null; StateHasChanged(); await OnInitializedAsync(); } private async Task RoomAvatarChanged(InputFileChangeEventArgs arg, string roomId) { var res = await Homeserver.UploadFile(arg.File.Name, arg.File.OpenReadStream(Int64.MaxValue), arg.File.ContentType); Console.WriteLine(res); RoomProfiles[roomId].AvatarUrl = res; StateHasChanged(); } private async Task UpdateRoomProfile(string roomId) { Status = "Busy processing room profile update, please do not leave this page..."; StateHasChanged(); var room = Homeserver.GetRoom(roomId); await room.SendStateEventAsync("m.room.member", Homeserver.WhoAmI.UserId, RoomProfiles[roomId]); Status = null; StateHasChanged(); } }