From 7e35306b0174a99e2ebd1020d7fc38c4a48dd287 Mon Sep 17 00:00:00 2001 From: Asval Date: Sat, 28 Sep 2024 20:10:08 +0200 Subject: [PATCH] history ui done --- FModel/Constants.cs | 4 +- .../ApiEndpoints/FModelApiEndpoint.cs | 9 ++- .../ApiEndpoints/Models/FModelResponse.cs | 30 +++++++- FModel/ViewModels/UpdateViewModel.cs | 31 +++++++- .../Resources/Controls/CommitControl.xaml | 46 ++++++------ .../Controls/CommitDownloaderControl.xaml | 53 ++++++++++++++ .../Controls/CommitDownloaderControl.xaml.cs | 23 ++++++ FModel/Views/UpdateView.xaml | 72 ++++++++++--------- 8 files changed, 210 insertions(+), 58 deletions(-) create mode 100644 FModel/Views/Resources/Controls/CommitDownloaderControl.xaml create mode 100644 FModel/Views/Resources/Controls/CommitDownloaderControl.xaml.cs diff --git a/FModel/Constants.cs b/FModel/Constants.cs index 409ddba4..94911598 100644 --- a/FModel/Constants.cs +++ b/FModel/Constants.cs @@ -21,7 +21,9 @@ public static class Constants public const string BLUE = "#528BCC"; public const string ISSUE_LINK = "https://github.com/4sval/FModel/discussions/categories/q-a"; - public const string COMMITS_LINK = "https://api.github.com/repos/4sval/FModel/commits"; + public const string GH_REPO = "https://api.github.com/repos/4sval/FModel"; + public const string GH_COMMITS_HISTORY = GH_REPO + "/commits"; + public const string GH_RELEASES = GH_REPO + "/releases"; public const string DONATE_LINK = "https://fmodel.app/donate"; public const string DISCORD_LINK = "https://fmodel.app/discord"; diff --git a/FModel/ViewModels/ApiEndpoints/FModelApiEndpoint.cs b/FModel/ViewModels/ApiEndpoints/FModelApiEndpoint.cs index 99a695f9..2d5fdc07 100644 --- a/FModel/ViewModels/ApiEndpoints/FModelApiEndpoint.cs +++ b/FModel/ViewModels/ApiEndpoints/FModelApiEndpoint.cs @@ -35,7 +35,7 @@ public class FModelApiEndpoint : AbstractApiProvider public async Task GetGitHubCommitHistoryAsync(string branch = "dev", int page = 1, int limit = 20) { - var request = new FRestRequest(Constants.COMMITS_LINK); + var request = new FRestRequest(Constants.GH_COMMITS_HISTORY); request.AddParameter("sha", branch); request.AddParameter("page", page); request.AddParameter("per_page", limit); @@ -43,6 +43,13 @@ public class FModelApiEndpoint : AbstractApiProvider return response.Data; } + public async Task GetGitHubReleaseAsync(string tag) + { + var request = new FRestRequest($"{Constants.GH_RELEASES}/tags/{tag}"); + var response = await _client.ExecuteAsync(request).ConfigureAwait(false); + return response.Data; + } + public async Task GetNewsAsync(CancellationToken token, string game) { var request = new FRestRequest($"https://api.fmodel.app/v1/news/{Constants.APP_VERSION}"); diff --git a/FModel/ViewModels/ApiEndpoints/Models/FModelResponse.cs b/FModel/ViewModels/ApiEndpoints/Models/FModelResponse.cs index bb5900e5..bae4f4b2 100644 --- a/FModel/ViewModels/ApiEndpoints/Models/FModelResponse.cs +++ b/FModel/ViewModels/ApiEndpoints/Models/FModelResponse.cs @@ -4,16 +4,44 @@ using System.Diagnostics; using CUE4Parse.UE4.Versions; using FModel.Creator; using FModel.Extensions; +using FModel.Framework; using SkiaSharp; using J = Newtonsoft.Json.JsonPropertyAttribute; namespace FModel.ViewModels.ApiEndpoints.Models; -public class GitHubCommit +public class GitHubRelease +{ + [J("assets")] public GitHubAsset[] Assets { get; private set; } +} + +public class GitHubAsset +{ + [J("name")] public string Name { get; private set; } + [J("size")] public int Size { get; private set; } + [J("download_count")] public int DownloadCount { get; private set; } + [J("browser_download_url")] public string BrowserDownloadUrl { get; private set; } +} + +public class GitHubCommit : ViewModel { [J("sha")] public string Sha { get; private set; } [J("commit")] public Commit Commit { get; private set; } [J("author")] public Author Author { get; private set; } + + private GitHubAsset _asset; + public GitHubAsset Asset + { + get => _asset; + set + { + SetProperty(ref _asset, value); + RaisePropertyChanged(nameof(IsDownloadable)); + } + } + + public string ShortSha => Sha[..7]; + public bool IsDownloadable => Asset != null; } public class Commit diff --git a/FModel/ViewModels/UpdateViewModel.cs b/FModel/ViewModels/UpdateViewModel.cs index 4a287efa..876a4558 100644 --- a/FModel/ViewModels/UpdateViewModel.cs +++ b/FModel/ViewModels/UpdateViewModel.cs @@ -1,15 +1,21 @@ using System.ComponentModel; +using System.IO; +using System.Linq; using System.Threading.Tasks; using System.Windows.Data; +using FModel.Extensions; using FModel.Framework; using FModel.Services; using FModel.ViewModels.ApiEndpoints.Models; using FModel.Views.Resources.Converters; +using Newtonsoft.Json; namespace FModel.ViewModels; public class UpdateViewModel : ViewModel { + private ApiEndpointViewModel _apiEndpointView => ApplicationService.ApiEndpointView; + public RangeObservableCollection Commits { get; } public ICollectionView CommitsView { get; } @@ -24,6 +30,29 @@ public class UpdateViewModel : ViewModel public async Task Load() { - Commits.AddRange(await ApplicationService.ApiEndpointView.FModelApi.GetGitHubCommitHistoryAsync()); +#if DEBUG + Commits.AddRange(JsonConvert.DeserializeObject(await File.ReadAllTextAsync(@"C:\Users\valen\Downloads\history.json"))); +#else + Commits.AddRange(await _apiEndpointView.FModelApi.GetGitHubCommitHistoryAsync()); +#endif + _ = PostLoad(); + } + + private async Task PostLoad() + { +#if DEBUG + var qa = JsonConvert.DeserializeObject(await File.ReadAllTextAsync(@"C:\Users\valen\Downloads\qa.json")); +#else + var qa = await _apiEndpointView.FModelApi.GetGitHubReleaseAsync("qa"); +#endif + foreach (var asset in qa.Assets) + { + var commitSha = asset.Name.SubstringBeforeLast(".zip"); + var commit = Commits.FirstOrDefault(x => x.Sha == commitSha); + if (commit != null) + { + commit.Asset = asset; + } + } } } diff --git a/FModel/Views/Resources/Controls/CommitControl.xaml b/FModel/Views/Resources/Controls/CommitControl.xaml index 97b6b4be..33d288bd 100644 --- a/FModel/Views/Resources/Controls/CommitControl.xaml +++ b/FModel/Views/Resources/Controls/CommitControl.xaml @@ -2,7 +2,8 @@ xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" xmlns:converters="clr-namespace:FModel.Views.Resources.Converters" - xmlns:adonisUi="clr-namespace:AdonisUI;assembly=AdonisUI"> + xmlns:adonisUi="clr-namespace:AdonisUI;assembly=AdonisUI" + xmlns:controls="clr-namespace:FModel.Views.Resources.Controls"> @@ -10,17 +11,15 @@ - - - - - - + + + + + + - - + @@ -65,17 +64,20 @@ - - - + + + + + + + diff --git a/FModel/Views/Resources/Controls/CommitDownloaderControl.xaml b/FModel/Views/Resources/Controls/CommitDownloaderControl.xaml new file mode 100644 index 00000000..71082c8f --- /dev/null +++ b/FModel/Views/Resources/Controls/CommitDownloaderControl.xaml @@ -0,0 +1,53 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/FModel/Views/Resources/Controls/CommitDownloaderControl.xaml.cs b/FModel/Views/Resources/Controls/CommitDownloaderControl.xaml.cs new file mode 100644 index 00000000..c3e950e0 --- /dev/null +++ b/FModel/Views/Resources/Controls/CommitDownloaderControl.xaml.cs @@ -0,0 +1,23 @@ +using System.Windows; +using System.Windows.Controls; +using FModel.ViewModels.ApiEndpoints.Models; + +namespace FModel.Views.Resources.Controls; + +public partial class CommitDownloaderControl : UserControl +{ + public CommitDownloaderControl() + { + InitializeComponent(); + } + + public static readonly DependencyProperty CommitAssetProperty = + DependencyProperty.Register("CommitAsset", typeof(GitHubAsset), typeof(CommitDownloaderControl), new PropertyMetadata(null)); + + public GitHubAsset CommitAsset + { + get { return (GitHubAsset)GetValue(CommitAssetProperty); } + set { SetValue(CommitAssetProperty, value); } + } +} + diff --git a/FModel/Views/UpdateView.xaml b/FModel/Views/UpdateView.xaml index a149194a..c9d2567e 100644 --- a/FModel/Views/UpdateView.xaml +++ b/FModel/Views/UpdateView.xaml @@ -2,11 +2,10 @@ xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" xmlns:converters="clr-namespace:FModel.Views.Resources.Converters" - xmlns:adonisUi="clr-namespace:AdonisUI;assembly=AdonisUI" + xmlns:adonisExtensions="clr-namespace:AdonisUI.Extensions;assembly=AdonisUI" xmlns:adonisControls="clr-namespace:AdonisUI.Controls;assembly=AdonisUI" xmlns:controls="clr-namespace:FModel.Views.Resources.Controls" MinHeight="{Binding Source={x:Static SystemParameters.MaximizedPrimaryScreenHeight}, Converter={converters:RatioConverter}, ConverterParameter='0.20'}" - MaxHeight="{Binding Source={x:Static SystemParameters.MaximizedPrimaryScreenHeight}, Converter={converters:RatioConverter}, ConverterParameter='0.80'}" Width="{Binding Source={x:Static SystemParameters.MaximizedPrimaryScreenWidth}, Converter={converters:RatioConverter}, ConverterParameter='0.50'}" Loaded="OnLoaded"> @@ -31,36 +30,45 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + + + + + + + +