@page "/User/Profile" @using LibMatrix @using LibMatrix.EventTypes.Spec.State.RoomInfo @using LibMatrix.Responses @using MatrixUtils.Abstractions

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...

}

} //
} @code { private string? _status; 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 sessionStore.GetCurrentHomeserver(navigateOnFailure: true); 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(); List roomInfoTasks = []; await foreach (var (roomId, roomProfile) in roomProfiles) { var task = Task.Run(async () => { 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 { RoomNames[roomId] = 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(); }); roomInfoTasks.Add(task); } await Task.WhenAll(roomInfoTasks); 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(); } }