using System; using System.IO; using System.Net.Http; using System.Windows.Controls; using System.Windows.Media.Imaging; using ytLive.Helpers; using ytLive.ViewModels; namespace ytLive.Controls; public partial class TopBar : UserControl { private static readonly HttpClient AvatarHttp = new() { Timeout = TimeSpan.FromSeconds(15) }; private string? _loadedAvatarUrl; public TopBar() { InitializeComponent(); AvatarImage.Source = null; AvatarInitial.Visibility = System.Windows.Visibility.Collapsed; } public void RefreshAvatar() { _ = LoadAvatarImageAsync(); } private async System.Threading.Tasks.Task LoadAvatarImageAsync() { var vm = DataContext as MainViewModel; var url = vm?.AccountAvatarUrl; if (vm is not { IsConnected: true }) { ShowAvatarFallback(null); return; } if (string.IsNullOrWhiteSpace(url)) { AppLog.Write("Avatar: connected but no profile image URL on the session"); ShowAvatarFallback(null); return; } if (url == _loadedAvatarUrl && AvatarImage.Source != null) return; try { var bytes = await AvatarHttp.GetByteArrayAsync(url); using var ms = new MemoryStream(bytes); var bitmap = new BitmapImage(); bitmap.BeginInit(); bitmap.CacheOption = BitmapCacheOption.OnLoad; bitmap.StreamSource = ms; bitmap.EndInit(); bitmap.Freeze(); _loadedAvatarUrl = url; AvatarImage.Source = bitmap; AvatarInitial.Visibility = System.Windows.Visibility.Collapsed; } catch (Exception ex) { AppLog.Write($"Avatar load failed ({url}): {ex.Message}"); ShowAvatarFallback(vm?.AccountDisplayName); } } private void ShowAvatarFallback(string? name) { _loadedAvatarUrl = null; AvatarImage.Source = null; AvatarInitial.Text = string.IsNullOrWhiteSpace(name) ? "?" : name.Substring(0, 1).ToUpperInvariant(); AvatarInitial.Visibility = System.Windows.Visibility.Visible; } }