diff --git a/FModel/MainWindow.xaml b/FModel/MainWindow.xaml
index d4e261ab..57d1b200 100644
--- a/FModel/MainWindow.xaml
+++ b/FModel/MainWindow.xaml
@@ -151,13 +151,7 @@
@@ -803,13 +797,17 @@
+
+
+
+
diff --git a/FModel/Settings/UserSettings.cs b/FModel/Settings/UserSettings.cs
index f5f703a1..178abe5a 100644
--- a/FModel/Settings/UserSettings.cs
+++ b/FModel/Settings/UserSettings.cs
@@ -186,6 +186,20 @@ namespace FModel.Settings
set => SetProperty(ref _updateMode, value);
}
+ private DateTime _lastUpdateCheck = DateTime.MinValue;
+ public DateTime LastUpdateCheck
+ {
+ get => _lastUpdateCheck;
+ set => SetProperty(ref _lastUpdateCheck, value);
+ }
+
+ private DateTime _nextUpdateCheck = DateTime.Now;
+ public DateTime NextUpdateCheck
+ {
+ get => _nextUpdateCheck;
+ set => SetProperty(ref _nextUpdateCheck, value);
+ }
+
private string _commitHash = Constants.APP_VERSION;
public string CommitHash
{
diff --git a/FModel/ViewModels/ApiEndpoints/FModelApiEndpoint.cs b/FModel/ViewModels/ApiEndpoints/FModelApiEndpoint.cs
index 9d0e28ac..494f08e0 100644
--- a/FModel/ViewModels/ApiEndpoints/FModelApiEndpoint.cs
+++ b/FModel/ViewModels/ApiEndpoints/FModelApiEndpoint.cs
@@ -119,6 +119,8 @@ public class FModelApiEndpoint : AbstractApiProvider
public void CheckForUpdates(EUpdateMode updateMode, bool launch = false)
{
+ if (DateTime.Now < UserSettings.Default.NextUpdateCheck) return;
+
if (launch)
{
AutoUpdater.ParseUpdateInfoEvent += ParseUpdateInfoEvent;
@@ -150,6 +152,7 @@ public class FModelApiEndpoint : AbstractApiProvider
{
if (args is { CurrentVersion: { } })
{
+ UserSettings.Default.LastUpdateCheck = DateTime.Now;
var qa = (CustomMandatory) args.Mandatory;
var currentVersion = new System.Version(args.CurrentVersion);
if ((qa.Value && qa.CommitHash == UserSettings.Default.CommitHash) || // qa branch : same commit id
diff --git a/FModel/ViewModels/ApiEndpoints/GitHubApiEndpoint.cs b/FModel/ViewModels/ApiEndpoints/GitHubApiEndpoint.cs
index 7414a7ca..e6b2761d 100644
--- a/FModel/ViewModels/ApiEndpoints/GitHubApiEndpoint.cs
+++ b/FModel/ViewModels/ApiEndpoints/GitHubApiEndpoint.cs
@@ -18,9 +18,6 @@ public class GitHubApiEndpoint : AbstractApiProvider
request.AddParameter("page", page);
request.AddParameter("per_page", limit);
var response = await _client.ExecuteAsync(request).ConfigureAwait(false);
-#if DEBUG
- System.IO.File.WriteAllTextAsync(@"C:\Users\valen\Downloads\history.json", Newtonsoft.Json.JsonConvert.SerializeObject(response.Data));
-#endif
return response.Data;
}
@@ -28,9 +25,6 @@ public class GitHubApiEndpoint : AbstractApiProvider
{
var request = new FRestRequest($"{Constants.GH_RELEASES}/tags/{tag}");
var response = await _client.ExecuteAsync(request).ConfigureAwait(false);
-#if DEBUG
- System.IO.File.WriteAllTextAsync(@"C:\Users\valen\Downloads\qa.json", Newtonsoft.Json.JsonConvert.SerializeObject(response.Data));
-#endif
return response.Data;
}
}
diff --git a/FModel/ViewModels/ApiEndpoints/Models/GitHubResponse.cs b/FModel/ViewModels/ApiEndpoints/Models/GitHubResponse.cs
index b6288897..ddffba50 100644
--- a/FModel/ViewModels/ApiEndpoints/Models/GitHubResponse.cs
+++ b/FModel/ViewModels/ApiEndpoints/Models/GitHubResponse.cs
@@ -1,6 +1,13 @@
using System;
+using System.Windows;
+using AdonisUI.Controls;
+using AutoUpdaterDotNET;
using FModel.Framework;
using FModel.Settings;
+using MessageBox = AdonisUI.Controls.MessageBox;
+using MessageBoxButton = AdonisUI.Controls.MessageBoxButton;
+using MessageBoxImage = AdonisUI.Controls.MessageBoxImage;
+using MessageBoxResult = AdonisUI.Controls.MessageBoxResult;
using J = Newtonsoft.Json.JsonPropertyAttribute;
namespace FModel.ViewModels.ApiEndpoints.Models;
@@ -58,6 +65,37 @@ public class GitHubCommit : ViewModel
public bool IsCurrent => Sha == UserSettings.Default.CommitHash;
public string ShortSha => Sha[..7];
public bool IsDownloadable => Asset != null;
+
+ public void Download()
+ {
+ if (IsCurrent) return;
+
+ var messageBox = new MessageBoxModel
+ {
+ Text = $"Are you sure you want to update to version '{ShortSha}'?{(!Asset.IsLatest ? "\nThis is not the latest version." : "")}",
+ Caption = "Update FModel",
+ Icon = MessageBoxImage.Question,
+ Buttons = MessageBoxButtons.YesNo(),
+ IsSoundEnabled = false
+ };
+
+ MessageBox.Show(messageBox);
+ if (messageBox.Result != MessageBoxResult.Yes) return;
+
+ try
+ {
+ if (AutoUpdater.DownloadUpdate(new UpdateInfoEventArgs { DownloadURL = Asset.BrowserDownloadUrl }))
+ {
+ UserSettings.Default.CommitHash = Sha;
+ Application.Current.Shutdown();
+ }
+ }
+ catch (Exception exception)
+ {
+ UserSettings.Default.ShowChangelog = false;
+ MessageBox.Show(exception.Message, exception.GetType().ToString(), MessageBoxButton.OK, MessageBoxImage.Error);
+ }
+ }
}
public class Commit
diff --git a/FModel/ViewModels/Commands/RemindMeCommand.cs b/FModel/ViewModels/Commands/RemindMeCommand.cs
new file mode 100644
index 00000000..7c78a952
--- /dev/null
+++ b/FModel/ViewModels/Commands/RemindMeCommand.cs
@@ -0,0 +1,40 @@
+using System;
+using FModel.Framework;
+using FModel.Settings;
+
+namespace FModel.ViewModels.Commands;
+
+public class RemindMeCommand : ViewModelCommand
+{
+ public RemindMeCommand(UpdateViewModel contextViewModel) : base(contextViewModel)
+ {
+ }
+
+ public override void Execute(UpdateViewModel contextViewModel, object parameter)
+ {
+ switch (parameter)
+ {
+ case "Days":
+ // check for update in 3 days
+ UserSettings.Default.NextUpdateCheck = DateTime.Now.AddDays(3);
+ break;
+ case "Week":
+ // check for update next week (a week starts on Monday)
+ var delay = DayOfWeek.Monday - DateTime.Now.DayOfWeek;
+ UserSettings.Default.NextUpdateCheck = DateTime.Now.AddDays(delay);
+ break;
+ case "Month":
+ // check for update next month (if today is 31st, it will be 1st of next month)
+ UserSettings.Default.NextUpdateCheck = DateTime.Now.AddDays(1 - DateTime.Now.Day).AddMonths(1);
+ break;
+ case "Never":
+ // never check for updates
+ UserSettings.Default.NextUpdateCheck = DateTime.MaxValue;
+ break;
+ default:
+ // reset
+ UserSettings.Default.NextUpdateCheck = DateTime.Now;
+ break;
+ }
+ }
+}
diff --git a/FModel/ViewModels/UpdateViewModel.cs b/FModel/ViewModels/UpdateViewModel.cs
index 64bef9c2..429678e9 100644
--- a/FModel/ViewModels/UpdateViewModel.cs
+++ b/FModel/ViewModels/UpdateViewModel.cs
@@ -6,6 +6,7 @@ using FModel.Extensions;
using FModel.Framework;
using FModel.Services;
using FModel.ViewModels.ApiEndpoints.Models;
+using FModel.ViewModels.Commands;
using FModel.Views.Resources.Converters;
namespace FModel.ViewModels;
@@ -14,6 +15,9 @@ public class UpdateViewModel : ViewModel
{
private ApiEndpointViewModel _apiEndpointView => ApplicationService.ApiEndpointView;
+ private RemindMeCommand _remindMeCommand;
+ public RemindMeCommand RemindMeCommand => _remindMeCommand ??= new RemindMeCommand(this);
+
public RangeObservableCollection Commits { get; }
public ICollectionView CommitsView { get; }
@@ -28,15 +32,11 @@ public class UpdateViewModel : ViewModel
public async Task Load()
{
-#if DEBUG
- Commits.AddRange(Newtonsoft.Json.JsonConvert.DeserializeObject(await System.IO.File.ReadAllTextAsync(@"C:\Users\valen\Downloads\history.json")));
- var qa = Newtonsoft.Json.JsonConvert.DeserializeObject(await System.IO.File.ReadAllTextAsync(@"C:\Users\valen\Downloads\qa.json"));
-#else
Commits.AddRange(await _apiEndpointView.GitHubApi.GetCommitHistoryAsync());
- var qa = await _apiEndpointView.GitHubApi.GetReleaseAsync("qa");
-#endif
+ var qa = await _apiEndpointView.GitHubApi.GetReleaseAsync("qa");
qa.Assets.OrderByDescending(x => x.CreatedAt).First().IsLatest = true;
+
foreach (var asset in qa.Assets)
{
var commitSha = asset.Name.SubstringBeforeLast(".zip");
@@ -47,4 +47,9 @@ public class UpdateViewModel : ViewModel
}
}
}
+
+ public void DownloadLatest()
+ {
+ Commits.FirstOrDefault(x => x.Asset.IsLatest)?.Download();
+ }
}
diff --git a/FModel/Views/Resources/Controls/CommitDownloaderControl.xaml b/FModel/Views/Resources/Controls/CommitDownloaderControl.xaml
index 57faa1ed..256ce0a4 100644
--- a/FModel/Views/Resources/Controls/CommitDownloaderControl.xaml
+++ b/FModel/Views/Resources/Controls/CommitDownloaderControl.xaml
@@ -29,12 +29,12 @@
@@ -44,16 +44,16 @@
diff --git a/FModel/Views/Resources/Controls/CommitDownloaderControl.xaml.cs b/FModel/Views/Resources/Controls/CommitDownloaderControl.xaml.cs
index 89464610..b779543a 100644
--- a/FModel/Views/Resources/Controls/CommitDownloaderControl.xaml.cs
+++ b/FModel/Views/Resources/Controls/CommitDownloaderControl.xaml.cs
@@ -1,14 +1,6 @@
-using System;
-using System.Windows;
+using System.Windows;
using System.Windows.Controls;
-using AdonisUI.Controls;
-using AutoUpdaterDotNET;
-using FModel.Settings;
using FModel.ViewModels.ApiEndpoints.Models;
-using MessageBox = AdonisUI.Controls.MessageBox;
-using MessageBoxButton = AdonisUI.Controls.MessageBoxButton;
-using MessageBoxImage = AdonisUI.Controls.MessageBoxImage;
-using MessageBoxResult = AdonisUI.Controls.MessageBoxResult;
namespace FModel.Views.Resources.Controls;
@@ -30,33 +22,7 @@ public partial class CommitDownloaderControl : UserControl
private void OnDownload(object sender, RoutedEventArgs e)
{
- if (Commit.IsCurrent) return;
-
- var messageBox = new MessageBoxModel
- {
- Text = $"Are you sure you want to update to version '{Commit.ShortSha}'?{(!Commit.Asset.IsLatest ? "\nThis is not the latest version." : "")}",
- Caption = "Update FModel",
- Icon = MessageBoxImage.Question,
- Buttons = MessageBoxButtons.YesNo(),
- IsSoundEnabled = false
- };
-
- MessageBox.Show(messageBox);
- if (messageBox.Result != MessageBoxResult.Yes) return;
-
- try
- {
- if (AutoUpdater.DownloadUpdate(new UpdateInfoEventArgs { DownloadURL = Commit.Asset.BrowserDownloadUrl }))
- {
- UserSettings.Default.CommitHash = Commit.Sha;
- Application.Current.Shutdown();
- }
- }
- catch (Exception exception)
- {
- UserSettings.Default.ShowChangelog = false;
- MessageBox.Show(exception.Message, exception.GetType().ToString(), MessageBoxButton.OK, MessageBoxImage.Error);
- }
+ Commit.Download();
}
}
diff --git a/FModel/Views/Resources/Converters/RelativeDateTimeConverter.cs b/FModel/Views/Resources/Converters/RelativeDateTimeConverter.cs
index 177e22f1..ac9aaa34 100644
--- a/FModel/Views/Resources/Converters/RelativeDateTimeConverter.cs
+++ b/FModel/Views/Resources/Converters/RelativeDateTimeConverter.cs
@@ -16,6 +16,9 @@ public class RelativeDateTimeConverter : IValueConverter
int time;
string unit;
+ if (timeSpan.TotalSeconds < 30)
+ return "Just now";
+
if (timeSpan.TotalMinutes < 1)
{
time = timeSpan.Seconds;
diff --git a/FModel/Views/Resources/Resources.xaml b/FModel/Views/Resources/Resources.xaml
index d560ab09..03e061d9 100644
--- a/FModel/Views/Resources/Resources.xaml
+++ b/FModel/Views/Resources/Resources.xaml
@@ -69,6 +69,7 @@
M11.71,17.99C8.53,17.84,6,15.22,6,12c0-3.31,2.69-6,6-6c3.22,0,5.84,2.53,5.99,5.71l-2.1-0.63C15.48,9.31,13.89,8,12,8 c-2.21,0-4,1.79-4,4c0,1.89,1.31,3.48,3.08,3.89L11.71,17.99z M22,12c0,0.3-0.01,0.6-0.04,0.9l-1.97-0.59C20,12.21,20,12.1,20,12 c0-4.42-3.58-8-8-8s-8,3.58-8,8s3.58,8,8,8c0.1,0,0.21,0,0.31-0.01l0.59,1.97C12.6,21.99,12.3,22,12,22C6.48,22,2,17.52,2,12 C2,6.48,6.48,2,12,2S22,6.48,22,12z M18.23,16.26l2.27-0.76c0.46-0.15,0.45-0.81-0.01-0.95l-7.6-2.28 c-0.38-0.11-0.74,0.24-0.62,0.62l2.28,7.6c0.14,0.47,0.8,0.48,0.95,0.01l0.76-2.27l3.91,3.91c0.2,0.2,0.51,0.2,0.71,0l1.27-1.27 c0.2-0.2,0.2-0.51,0-0.71L18.23,16.26z
M1.8 6q-.525 0-.887-.35Q.55 5.3.55 4.8V4q0-1.425 1.012-2.438Q2.575.55 4 .55h.8q.5 0 .85.362.35.363.35.888 0 .5-.35.85T4.8 3H4q-.425 0-.712.287Q3 3.575 3 4v.8q0 .5-.35.85T1.8 6ZM4 23.45q-1.425 0-2.438-1.012Q.55 21.425.55 20v-.8q0-.5.363-.85.362-.35.887-.35.5 0 .85.35t.35.85v.8q0 .425.288.712Q3.575 21 4 21h.8q.5 0 .85.35t.35.85q0 .525-.35.887-.35.363-.85.363Zm15.2 0q-.5 0-.85-.363-.35-.362-.35-.887 0-.5.35-.85t.85-.35h.8q.425 0 .712-.288Q21 20.425 21 20v-.8q0-.5.35-.85t.85-.35q.525 0 .888.35.362.35.362.85v.8q0 1.425-1.012 2.438Q21.425 23.45 20 23.45ZM22.2 6q-.5 0-.85-.35T21 4.8V4q0-.425-.288-.713Q20.425 3 20 3h-.8q-.5 0-.85-.35T18 1.8q0-.525.35-.888.35-.362.85-.362h.8q1.425 0 2.438 1.012Q23.45 2.575 23.45 4v.8q0 .5-.362.85-.363.35-.888.35ZM12 17.35l1-.575v-4.1l3.55-2.075V9.425l-1-.575L12 10.925 8.45 8.85l-1 .575V10.6L11 12.675v4.1Zm-1.325 2.325-4.55-2.65q-.625-.35-.975-.963-.35-.612-.35-1.337V9.45q0-.725.35-1.337.35-.613.975-.963l4.55-2.65Q11.3 4.15 12 4.15t1.325.35l4.55 2.65q.625.35.975.963.35.612.35 1.337v5.275q0 .725-.35 1.337-.35.613-.975.963l-4.55 2.65q-.625.35-1.325.35t-1.325-.35Z
M3.5 1.75v11.5c0 .09.048.173.126.217a.75.75 0 0 1-.752 1.298A1.748 1.748 0 0 1 2 13.25V1.75C2 .784 2.784 0 3.75 0h5.586c.464 0 .909.185 1.237.513l2.914 2.914c.329.328.513.773.513 1.237v8.586A1.75 1.75 0 0 1 12.25 15h-.5a.75.75 0 0 1 0-1.5h.5a.25.25 0 0 0 .25-.25V4.664a.25.25 0 0 0-.073-.177L9.513 1.573a.25.25 0 0 0-.177-.073H7.25a.75.75 0 0 1 0 1.5h-.5a.75.75 0 0 1 0-1.5h-3a.25.25 0 0 0-.25.25Zm3.75 8.75h.5c.966 0 1.75.784 1.75 1.75v3a.75.75 0 0 1-.75.75h-2.5a.75.75 0 0 1-.75-.75v-3c0-.966.784-1.75 1.75-1.75ZM6 5.25a.75.75 0 0 1 .75-.75h.5a.75.75 0 0 1 0 1.5h-.5A.75.75 0 0 1 6 5.25Zm.75 2.25h.5a.75.75 0 0 1 0 1.5h-.5a.75.75 0 0 1 0-1.5ZM8 6.75A.75.75 0 0 1 8.75 6h.5a.75.75 0 0 1 0 1.5h-.5A.75.75 0 0 1 8 6.75ZM8.75 3h.5a.75.75 0 0 1 0 1.5h-.5a.75.75 0 0 1 0-1.5ZM8 9.75A.75.75 0 0 1 8.75 9h.5a.75.75 0 0 1 0 1.5h-.5A.75.75 0 0 1 8 9.75Zm-1 2.5v2.25h1v-2.25a.25.25 0 0 0-.25-.25h-.5a.25.25 0 0 0-.25.25Z
+ M12 0c-6.626 0-12 5.373-12 12 0 5.302 3.438 9.8 8.207 11.387.599.111.793-.261.793-.577v-2.234c-3.338.726-4.033-1.416-4.033-1.416-.546-1.387-1.333-1.756-1.333-1.756-1.089-.745.083-.729.083-.729 1.205.084 1.839 1.237 1.839 1.237 1.07 1.834 2.807 1.304 3.492.997.107-.775.418-1.305.762-1.604-2.665-.305-5.467-1.334-5.467-5.931 0-1.311.469-2.381 1.236-3.221-.124-.303-.535-1.524.117-3.176 0 0 1.008-.322 3.301 1.23.957-.266 1.983-.399 3.003-.404 1.02.005 2.047.138 3.006.404 2.291-1.552 3.297-1.23 3.297-1.23.653 1.653.242 2.874.118 3.176.77.84 1.235 1.911 1.235 3.221 0 4.609-2.807 5.624-5.479 5.921.43.372.823 1.102.823 2.222v3.293c0 .319.192.694.801.576 4.765-1.589 8.199-6.086 8.199-11.386 0-6.627-5.373-12-12-12z
-
+
-
-
-
-
-
-
-
-
-
-
-
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/FModel/Views/UpdateView.xaml.cs b/FModel/Views/UpdateView.xaml.cs
index a1c284a4..3b9ca455 100644
--- a/FModel/Views/UpdateView.xaml.cs
+++ b/FModel/Views/UpdateView.xaml.cs
@@ -1,5 +1,6 @@
using System.Windows;
using FModel.ViewModels;
+using FModel.Views.Resources.Controls;
namespace FModel.Views;
@@ -16,5 +17,11 @@ public partial class UpdateView
if (DataContext is not UpdateViewModel viewModel) return;
await viewModel.Load();
}
+
+ private void OnDownloadLatest(object sender, RoutedEventArgs e)
+ {
+ if (DataContext is not UpdateViewModel viewModel) return;
+ viewModel.DownloadLatest();
+ }
}