using System; using CommunityToolkit.Mvvm.ComponentModel; using Semver; using StabilityMatrix.Core.Extensions; using StabilityMatrix.Core.Helper; using StabilityMatrix.Core.Models.Update; namespace StabilityMatrix.Avalonia.Models; public partial class UpdateChannelCard : ObservableObject { public UpdateChannel UpdateChannel { get; init; } public string DisplayName => UpdateChannel.GetStringValue(); public string? Description { get; init; } [ObservableProperty] [NotifyPropertyChangedFor(nameof(LatestVersionString))] [NotifyPropertyChangedFor(nameof(IsLatestVersionUpdateable))] private SemVersion? latestVersion; public string? LatestVersionString => LatestVersion is null ? null : $"Latest: v{LatestVersion}"; [ObservableProperty] private bool isSelectable = true; /// /// Whether the is available for update. /// public bool IsLatestVersionUpdateable { get { if (LatestVersion is null) { return false; } switch (LatestVersion.ComparePrecedenceTo(Compat.AppVersion)) { case > 0: // Newer version available return true; case 0: { // Same version available, check if we both have commit hash metadata var updateHash = LatestVersion.Metadata; var appHash = Compat.AppVersion.Metadata; // Trim both to the lower length, to a minimum of 7 characters var minLength = Math.Min(7, Math.Min(updateHash.Length, appHash.Length)); updateHash = updateHash[..minLength]; appHash = appHash[..minLength]; // If different, we can update if (updateHash != appHash) { return true; } break; } } return false; } } }