@rendermode InteractiveServer @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.Text.RegularExpressions @using System.ComponentModel.DataAnnotations @inherits LayoutComponentBase @inject RobotNet.IdentityServer.Services.UserImageService UserImageService @inject RobotNet.IdentityServer.Services.UserInfoService UserInfoService @inject AuthenticationStateProvider AuthenticationStateProvider @inject UserManager UserManager @inject RoleManager RoleManager @inject ISnackbar Snackbar @inject IDialogService DialogService @inject NavigationManager NavigationManager
@if (userInfo != null) { Thông tin cá nhân Quản lý thông tin hồ sơ của bạn @string.Join(", ", userRoles)
@userInfo.FullName ID: @(userInfo.Id.Length > 10 ? userInfo.Id.Substring(0, 10) + "..." : userInfo.Id)
@if (!isButtonDisabled) { Hủy Lưu thay đổi }
} else { Vui lòng đăng nhập Bạn cần đăng nhập để xem và chỉnh sửa thông tin cá nhân. Đăng nhập ngay }
Thay đổi ảnh hồ sơ
Ảnh hồ sơ giúp người khác nhận ra bạn và xác nhận rằng bạn đã đăng nhập.
Thay đổi
Xác nhận Hủy
@code { MudForm? form; private string? avatarPreview; private string? avatarUrl; private IBrowserFile? selectedFile; private bool ChangeAvatarVisible = false; private bool isButtonDisabled = true; private string originalFullName = ""; private string originalEmail = ""; private string originalPhoneNumber = ""; private string originalUserName = ""; private ApplicationUser? userInfo; private List userRoles = new List(); private void EnableButtons() { isButtonDisabled = false; } private void ChangeAvatar() { ChangeAvatarVisible = true; } protected override async Task OnInitializedAsync() { await base.OnInitializedAsync(); var authenticationState = await AuthenticationStateProvider.GetAuthenticationStateAsync(); var user = authenticationState.User; if (user?.Identity?.IsAuthenticated == true) { userInfo = await UserManager.GetUserAsync(user); if (userInfo != null) { userRoles = (await UserManager.GetRolesAsync(userInfo)).ToList(); originalUserName = userInfo.UserName?? string.Empty; originalFullName = userInfo.FullName?? string.Empty; originalEmail = userInfo.Email?? string.Empty; originalPhoneNumber = userInfo.PhoneNumber ?? string.Empty; if (userInfo.AvatarImage != null) { avatarUrl = $"data:{userInfo.AvatarContentType};base64,{Convert.ToBase64String(userInfo.AvatarImage)}"; avatarPreview = avatarUrl; } else { avatarUrl = "/uploads/avatars/anh.jpg"; avatarPreview = avatarUrl; } } } else { Snackbar.Add("Vui lòng đăng nhập để tiếp tục", Severity.Error); } } private async Task HandleSelected(InputFileChangeEventArgs e) { selectedFile = e.File; const long maxSize = 5 * 1024 * 1024; if (selectedFile.Size > maxSize) { Snackbar.Add("⚠️ Ảnh bạn chọn vượt quá 5MB. Vui lòng chọn ảnh nhỏ hơn.", Severity.Warning); avatarPreview = avatarUrl; selectedFile = null; return; } try { (byte[] buffer, string contentType) = await UserImageService.ResizeAndConvertAsync(selectedFile.OpenReadStream()); avatarPreview = $"data:{contentType};base64,{Convert.ToBase64String(buffer)}"; if (userInfo != null) { userInfo.AvatarImage = buffer; userInfo.AvatarContentType = selectedFile.ContentType; } } catch (Exception ex) { Snackbar.Add($"❌ Lỗi khi đọc ảnh: {ex.Message}", Severity.Error); avatarPreview = avatarUrl; } } private async Task ConfirmChangeAvatar() { if (userInfo != null && userInfo.AvatarImage != null) { var result = await UserManager.UpdateAsync(userInfo); if (result.Succeeded) { avatarUrl = avatarPreview; ChangeAvatarVisible = false; await Task.Delay(200); await UserInfoService.NotifyUserInfoChanged(); StateHasChanged(); NavigationManager.NavigateTo(NavigationManager.Uri, forceLoad: true); Snackbar.Add("Cập nhật ảnh đại diện thành công!", Severity.Success); } else { Snackbar.Add("Lỗi khi cập nhật avatar.", Severity.Error); } } } private void ResetFields() { if (userInfo == null) return; userInfo.FullName = originalFullName; userInfo.Email = originalEmail; userInfo.PhoneNumber = originalPhoneNumber; userInfo.UserName = originalUserName; isButtonDisabled = true; } private async Task SaveUserInfo() { if (userInfo != null) { try { var result = await UserManager.UpdateAsync(userInfo); if (result.Succeeded) { var authState = await AuthenticationStateProvider.GetAuthenticationStateAsync(); var userInfo = await UserManager.GetUserAsync(authState.User); if(userInfo != null) { originalFullName = userInfo.FullName ?? string.Empty; originalEmail = userInfo.Email ?? string.Empty; originalPhoneNumber = userInfo.PhoneNumber ?? string.Empty; originalUserName = userInfo.UserName ?? string.Empty; } isButtonDisabled = true; await Task.Delay(200); await UserInfoService.NotifyUserInfoChanged(); StateHasChanged(); Snackbar.Add("Thông tin đã được cập nhật!", Severity.Success); } else { Snackbar.Add("Lỗi khi cập nhật thông tin.", Severity.Error); } } catch (Exception ex) { Snackbar.Add($"Error while saving user information: {ex.Message}", Severity.Error); } } } }