dragon-iso/src/TeamsISO.App/ViewModels/UpdateBannerViewModel.cs
2026-05-10 09:42:29 -04:00

65 lines
2 KiB
C#

using TeamsISO.App.Services;
namespace TeamsISO.App.ViewModels;
/// <summary>
/// Persistent banner shown when the launch-time update check finds a newer
/// release. Stays visible until the operator clicks "Get update" (which opens
/// the releases page) or "Dismiss" (which hides until next launch).
///
/// Distinct from <see cref="AlertBannerViewModel"/> because that one's tied to
/// engine alerts and would force us to leak update concerns into the engine
/// layer; the update banner is purely a host-shell concern.
/// </summary>
public sealed class UpdateBannerViewModel : ObservableObject
{
private bool _isVisible;
private string _latestVersion = string.Empty;
private string _currentVersion = string.Empty;
public bool IsVisible
{
get => _isVisible;
private set => SetField(ref _isVisible, value);
}
public string LatestVersion
{
get => _latestVersion;
private set => SetField(ref _latestVersion, value);
}
public string CurrentVersion
{
get => _currentVersion;
private set => SetField(ref _currentVersion, value);
}
/// <summary>Friendly composite "1.0.0 → 1.1.0" string for the banner.</summary>
public string Message => $"Update available — v{_currentVersion} → {_latestVersion}";
public RelayCommand OpenReleasePageCommand { get; }
public RelayCommand DismissCommand { get; }
public UpdateBannerViewModel()
{
OpenReleasePageCommand = new RelayCommand(() =>
{
UpdateChecker.OpenReleasesPage();
IsVisible = false;
});
DismissCommand = new RelayCommand(() => IsVisible = false);
}
/// <summary>
/// Show the banner with a "you're on X, latest is Y" message. Idempotent:
/// re-showing while already visible just refreshes the version strings.
/// </summary>
public void Show(string current, string latest)
{
CurrentVersion = current;
LatestVersion = latest;
OnPropertyChanged(nameof(Message));
IsVisible = true;
}
}