74 lines
2.0 KiB
C#
74 lines
2.0 KiB
C#
using ClaudeDo.Releases;
|
|
using CommunityToolkit.Mvvm.ComponentModel;
|
|
|
|
namespace ClaudeDo.Ui.Services;
|
|
|
|
public enum UpdateCheckStatus
|
|
{
|
|
NeverChecked,
|
|
CheckFailed,
|
|
UpToDate,
|
|
UpdateAvailable,
|
|
}
|
|
|
|
public sealed partial class UpdateCheckService : ObservableObject
|
|
{
|
|
private readonly IReleaseClient _releases;
|
|
|
|
[ObservableProperty] private bool _isUpdateAvailable;
|
|
[ObservableProperty] private string? _latestVersion;
|
|
[ObservableProperty] private string _currentVersion;
|
|
[ObservableProperty] private bool _isChecking;
|
|
[ObservableProperty] private UpdateCheckStatus _lastCheckStatus = UpdateCheckStatus.NeverChecked;
|
|
|
|
public UpdateCheckService(IReleaseClient releases, string currentVersion)
|
|
{
|
|
_releases = releases;
|
|
_currentVersion = currentVersion;
|
|
}
|
|
|
|
public async Task CheckNowAsync(CancellationToken ct)
|
|
{
|
|
IsChecking = true;
|
|
try
|
|
{
|
|
GiteaRelease? rel;
|
|
try
|
|
{
|
|
rel = await _releases.GetLatestReleaseAsync(ct);
|
|
}
|
|
catch
|
|
{
|
|
LastCheckStatus = UpdateCheckStatus.CheckFailed;
|
|
IsUpdateAvailable = false;
|
|
return;
|
|
}
|
|
|
|
if (rel is null)
|
|
{
|
|
LastCheckStatus = UpdateCheckStatus.CheckFailed;
|
|
IsUpdateAvailable = false;
|
|
return;
|
|
}
|
|
|
|
var latest = (rel.TagName ?? "").TrimStart('v', 'V');
|
|
var cmp = VersionComparer.Compare(latest, CurrentVersion);
|
|
if (cmp.IsNewer)
|
|
{
|
|
LatestVersion = latest;
|
|
IsUpdateAvailable = true;
|
|
LastCheckStatus = UpdateCheckStatus.UpdateAvailable;
|
|
}
|
|
else
|
|
{
|
|
IsUpdateAvailable = false;
|
|
LastCheckStatus = UpdateCheckStatus.UpToDate;
|
|
}
|
|
}
|
|
finally
|
|
{
|
|
IsChecking = false;
|
|
}
|
|
}
|
|
}
|