@using Microsoft.AspNetCore.Identity @using RobotNet.IdentityServer.Data @using MudBlazor @using System.Net.Http.Json @using Microsoft.AspNetCore.Components @using Microsoft.EntityFrameworkCore @using System.Threading @using RobotNet.IdentityServer.Services @using System.Security.Claims @implements IDisposable @inherits LayoutComponentBase @inject RobotNet.IdentityServer.Services.IdentityService IdentityService @inject RobotNet.IdentityServer.Services.UserInfoService UserInfoService @inject NavigationManager NavigationManager @inject AuthenticationStateProvider AuthenticationStateProvider @inject RoleManager RoleManager
User Management
@code { private Func? _userInfoChangedHandler; private string cacheBuster = ""; private string? currentUrl; private ApplicationUser? currentUser; @inject UserManager UserManager @inject AuthenticationStateProvider AuthenticationStateProvider private string userName = string.Empty; private string userEmail = string.Empty; private string userImageUrl = string.Empty; protected override async Task OnInitializedAsync() { currentUrl = NavigationManager.ToBaseRelativePath(NavigationManager.Uri); NavigationManager.LocationChanged += OnLocationChanged; _userInfoChangedHandler = async () => { await InvokeAsync(async () => { await LoadUserInfoAsync(); StateHasChanged(); }); }; UserInfoService.RegisterHandler(_userInfoChangedHandler); await LoadUserInfoAsync(); } private async Task UserInfoChangedHandler() { await LoadUserInfoAsync(); await InvokeAsync(() => { cacheBuster = $"?v={DateTime.Now.Ticks}"; StateHasChanged(); }); } private async Task LoadUserInfoAsync() { try { var authState = await AuthenticationStateProvider.GetAuthenticationStateAsync(); var user = authState.User; if (user?.Identity?.IsAuthenticated == true) { var userId = user.FindFirstValue(ClaimTypes.NameIdentifier); if (!string.IsNullOrEmpty(userId)) { currentUser = await IdentityService.GetUserByIdAsync(userId); if (currentUser != null) { userName = currentUser.UserName ?? string.Empty; ; userEmail = currentUser.Email ?? string.Empty; ; if (currentUser.AvatarImage != null) { userImageUrl = $"data:{currentUser.AvatarContentType ?? "image/jpeg"};base64,{Convert.ToBase64String(currentUser.AvatarImage)}"; } else { userImageUrl = "/uploads/avatars/anh.jpg"; } } } } } catch (Exception ex) { Console.WriteLine($"Error loading user info: {ex.Message}"); } } private void OnLocationChanged(object? sender, LocationChangedEventArgs e) { InvokeAsync(() => { currentUrl = NavigationManager.ToBaseRelativePath(e.Location); StateHasChanged(); return Task.CompletedTask; }); } public void Dispose() { NavigationManager.LocationChanged -= OnLocationChanged; if (UserInfoService != null && _userInfoChangedHandler != null) { UserInfoService.UnregisterHandler(_userInfoChangedHandler); } } }