@page "/profile/avatar" @using System.ComponentModel.DataAnnotations @using Microsoft.AspNetCore.Components.Forms @using MudBlazor @using System.IO @using Indotalent.Features.Profile.Avatar @using Indotalent.Features.Profile.Avatar.Cqrs @using Indotalent.ConfigBackEnd.Interfaces @inject ISnackbar Snackbar @inject AvatarService AvatarService @inject ICurrentUserService CurrentUserService
Profile Picture Update your avatar and how you appear to other members.
/ Profile / Avatar
Your Avatar Recommended size: 200x200px. Supported formats: JPG, JPEG, PNG. (max 2MB).
@if (_isLoading) { } else if (!string.IsNullOrEmpty(_previewUrl)) {
} else { @(CurrentUserService.FullName?.Substring(0, 1).ToUpper() ?? "U") }
Avatar Preview This is how your photo will look.
@(_selectedFile == null ? "Browse File" : _selectedFile.Name)
@if (_processing) { Processing... } else { Save Changes }
@code { private IBrowserFile? _selectedFile; private string? _previewUrl; private bool _processing = false; private bool _isLoading = false; private string? _fullName; protected override async Task OnInitializedAsync() { await LoadExistingAvatar(); } private async Task LoadExistingAvatar() { var userId = CurrentUserService.UserId; if (string.IsNullOrEmpty(userId)) return; _isLoading = true; try { var response = await AvatarService.GetAvatarInfoAsync(userId); if (response != null && response.IsSuccess && response.Value != null) { _fullName = response.Value.FullName; if (!string.IsNullOrEmpty(response.Value.AvatarFile)) { var bytes = await AvatarService.GetAvatarBlobAsync(response.Value.AvatarFile); if (bytes != null && bytes.Length > 0) { _previewUrl = $"data:image/png;base64,{Convert.ToBase64String(bytes)}"; } } } } catch (Exception) { } 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; var userId = CurrentUserService.UserId; if (string.IsNullOrEmpty(userId)) 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 = userId, FileData = ms.ToArray(), FileName = _selectedFile.Name }; var response = await AvatarService.ChangeAvatarAsync(request); await Task.Delay(500); if (response != null && response.IsSuccess) { Snackbar.Add("Avatar updated successfully", Severity.Success); _selectedFile = null; await LoadExistingAvatar(); } } catch (Exception ex) { Snackbar.Add($"Upload failed: {ex.Message}", Severity.Error); } finally { _processing = false; StateHasChanged(); } } }