@page "/users/edit/{Id:int}" @rendermode InteractiveServer @inject ImageUrlService Img Edit User @Id

Edit User #@Id

@if (loading) {
} else if (!string.IsNullOrEmpty(error)) {
@error
} else if (data == null) {
User not found.
} else {
@if (data.Account != null && !string.IsNullOrEmpty(data.Account.ProfileImage)) { Profile }
@data.Account!.Username

@data.Account!.DisplayName

ID: @data.Account!.AccountId

@if (data.TokenBalances?.Count > 0) {
Token Balances
@foreach (var token in data.TokenBalances) {
Type @token.CurrencyType: @token.Balance
}
} @if (data.Progression != null) {
Progression
Level: @data.Progression.Level
XP: @data.Progression.Xp
}
Account Details
@if (!string.IsNullOrEmpty(data.Bio)) {
Bio

@data.Bio

} @if (data.AvatarItems?.Count > 0) {
Avatar Items (@data.AvatarItems.Count)
@foreach (var item in data.AvatarItems) { }
ID Name Type Rarity
@item.Id @item.FriendlyName @item.AvatarItemType @item.Rarity
} @if (data.Settings?.Count > 0) {
Player Settings (@data.Settings.Count)
@foreach (var setting in data.Settings) {
@setting.Key: @setting.Value
}
}
Back to Search
@if (!string.IsNullOrEmpty(saveMessage)) {
@saveMessage
}
} @code { [Parameter] public int Id { get; set; } [Inject] private IJSRuntime JSRuntime { get; set; } = default!; [Inject] private HttpClient Http { get; set; } = default!; private bool loading = true; private bool saving; private bool deleting; private string? error; private string? saveMessage; private AccountDetails? data; private string editUsername = ""; private string editDisplayName = ""; private string editProfileImage = ""; private bool editIsJunior; private int editPersonalPronouns; private int editIdentityFlags; protected override async Task OnInitializedAsync() { await LoadUser(); } private async Task LoadUser() { loading = true; error = null; try { data = await Http.GetFromJsonAsync($"/admin/api/accounts/{Id}"); if (data?.Account != null) { editUsername = data.Account.Username ?? ""; editDisplayName = data.Account.DisplayName ?? ""; editProfileImage = data.Account.ProfileImage ?? ""; editIsJunior = data.Account.IsJunior; editPersonalPronouns = data.Account.PersonalPronouns ?? 0; editIdentityFlags = data.Account.IdentityFlags ?? 0; } } catch (Exception ex) { error = $"Failed to load user: {ex.Message}"; } finally { loading = false; } } private async Task SaveChanges() { saving = true; saveMessage = null; try { var payload = new { username = editUsername, displayName = editDisplayName, profileImage = editProfileImage, isJunior = editIsJunior, personalPronouns = editPersonalPronouns, identityFlags = editIdentityFlags }; var response = await Http.PutAsJsonAsync($"/admin/api/accounts/{Id}", payload); response.EnsureSuccessStatusCode(); saveMessage = "User updated successfully!"; } catch (Exception ex) { saveMessage = $"Error: {ex.Message}"; } finally { saving = false; } } private async Task ConfirmAndDeleteUser() { var confirmed = await JSRuntime.InvokeAsync("confirm", $"Are you sure you want to delete user #{Id}? This cannot be undone."); if (!confirmed) return; deleting = true; saveMessage = null; try { var response = await Http.DeleteAsync($"/admin/api/accounts/{Id}"); response.EnsureSuccessStatusCode(); saveMessage = "User deleted successfully!"; } catch (Exception ex) { saveMessage = $"Error: {ex.Message}"; } finally { deleting = false; } } private class AccountDetails { public Account? Account { get; set; } public string? Bio { get; set; } public PlayerProgression? Progression { get; set; } public List? AvatarItems { get; set; } public List? Settings { get; set; } public List? TokenBalances { get; set; } } }