@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();
}
}