@page "/User/Profile" @using LibMatrix.Homeservers @using LibMatrix.EventTypes.Spec.State @using ArcaneLibs.Extensions @using LibMatrix.Responses

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 (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 Dictionary RoomProfiles { get; set; } = new(); private Dictionary RoomNames { get; set; } = new(); protected override async Task OnInitializedAsync() { Homeserver = await MRUStorage.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) { // 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(); } }