@using Indotalent.ConfigBackEnd.Extensions @using Indotalent.Features.Setting.SystemUser @using Indotalent.Features.Setting.SystemUser.Cqrs @using Microsoft.AspNetCore.Components.Forms @using MudBlazor @using System.IO @inject SystemUserService SystemUserService @inject ISnackbar Snackbar Update Profile Picture Change avatar for user: @Data.FullName Preview Avatar @if (_isLoading) { } else if (!string.IsNullOrEmpty(_previewUrl)) { } else { @Data.FullName.ToInitial() } Allowed: JPG, JPEG, PNG. Max: 2MB. Upload New Image @(_selectedFile == null ? "Click or Drag Image Here" : _selectedFile.Name) Cancel @if (_processing) { Processing... } else { Update Avatar } @code { [Parameter] public UpdateSystemUserRequest Data { get; set; } = new(); [Parameter] public EventCallback OnCancel { get; set; } [Parameter] public EventCallback OnSuccess { get; set; } private IBrowserFile? _selectedFile; private string? _previewUrl; private bool _processing = false; private bool _isLoading = false; protected override async Task OnInitializedAsync() { if (!string.IsNullOrEmpty(Data.AvatarFile)) { _isLoading = true; try { var bytes = await SystemUserService.GetAvatarBlobAsync(Data.AvatarFile); if (bytes != null && bytes.Length > 0) { _previewUrl = $"data:image/png;base64,{Convert.ToBase64String(bytes)}"; } } finally { _isLoading = false; StateHasChanged(); } } } private async Task HandleFileSelected(IBrowserFile file) { if (file == null) return; if (file.Size > 2 * 1024 * 1024) { Snackbar.Add("File too large. Max 2MB allowed.", Severity.Warning); return; } _selectedFile = file; using var stream = file.OpenReadStream(2 * 1024 * 1024); using var ms = new MemoryStream(); await stream.CopyToAsync(ms); _previewUrl = $"data:{file.ContentType};base64,{Convert.ToBase64String(ms.ToArray())}"; StateHasChanged(); } private async Task SubmitAvatar() { if (_selectedFile == null) return; _processing = true; try { using var stream = _selectedFile.OpenReadStream(2 * 1024 * 1024); using var ms = new MemoryStream(); await stream.CopyToAsync(ms); var request = new ChangeAvatarRequest { UserId = Data.Id ?? string.Empty, FileData = ms.ToArray(), FileName = _selectedFile.Name }; var response = await SystemUserService.ChangeAvatarAsync(request); await Task.Delay(500); if (response != null && response.IsSuccess) { Snackbar.Add("Avatar updated successfully", Severity.Success); await OnSuccess.InvokeAsync(); } } catch (Exception ex) { Snackbar.Add($"Upload failed: {ex.Message}", Severity.Error); } finally { _processing = false; } } }