From a74c18ac39ea2bc40f2aa915ba1e531b00d2dbaa Mon Sep 17 00:00:00 2001 From: estrogen elf <87099578+BlossomiShymae@users.noreply.github.com> Date: Sun, 15 Jun 2025 21:40:48 -0500 Subject: [PATCH] feat: add schemas page --- Needlework.Net/Needlework.Net.csproj | 1 + Needlework.Net/Program.cs | 2 + .../Pages/Schemas/SchemaItemViewModel.cs | 22 +++++ .../Pages/Schemas/SchemasViewModel.cs | 87 +++++++++++++++++++ .../Views/Pages/Schemas/SchemaItemView.axaml | 46 ++++++++++ .../Pages/Schemas/SchemaItemView.axaml.cs | 11 +++ .../Views/Pages/Schemas/SchemasView.axaml | 43 +++++++++ .../Views/Pages/Schemas/SchemasView.axaml.cs | 11 +++ 8 files changed, 223 insertions(+) create mode 100644 Needlework.Net/ViewModels/Pages/Schemas/SchemaItemViewModel.cs create mode 100644 Needlework.Net/ViewModels/Pages/Schemas/SchemasViewModel.cs create mode 100644 Needlework.Net/Views/Pages/Schemas/SchemaItemView.axaml create mode 100644 Needlework.Net/Views/Pages/Schemas/SchemaItemView.axaml.cs create mode 100644 Needlework.Net/Views/Pages/Schemas/SchemasView.axaml create mode 100644 Needlework.Net/Views/Pages/Schemas/SchemasView.axaml.cs diff --git a/Needlework.Net/Needlework.Net.csproj b/Needlework.Net/Needlework.Net.csproj index 9620668..7cde83f 100644 --- a/Needlework.Net/Needlework.Net.csproj +++ b/Needlework.Net/Needlework.Net.csproj @@ -29,6 +29,7 @@ + diff --git a/Needlework.Net/Program.cs b/Needlework.Net/Program.cs index cb19687..6afe695 100644 --- a/Needlework.Net/Program.cs +++ b/Needlework.Net/Program.cs @@ -10,6 +10,7 @@ using Needlework.Net.ViewModels.Pages.About; using Needlework.Net.ViewModels.Pages.Console; using Needlework.Net.ViewModels.Pages.Endpoints; using Needlework.Net.ViewModels.Pages.Home; +using Needlework.Net.ViewModels.Pages.Schemas; using Needlework.Net.ViewModels.Pages.WebSocket; using Projektanker.Icons.Avalonia; using Projektanker.Icons.Avalonia.FontAwesome; @@ -77,6 +78,7 @@ class Program builder.AddSingleton(); builder.AddSingleton(); builder.AddSingleton(); + builder.AddSingleton(); builder.AddSingleton(); } diff --git a/Needlework.Net/ViewModels/Pages/Schemas/SchemaItemViewModel.cs b/Needlework.Net/ViewModels/Pages/Schemas/SchemaItemViewModel.cs new file mode 100644 index 0000000..090625b --- /dev/null +++ b/Needlework.Net/ViewModels/Pages/Schemas/SchemaItemViewModel.cs @@ -0,0 +1,22 @@ +using CommunityToolkit.Mvvm.ComponentModel; +using Needlework.Net.ViewModels.Pages.Endpoints; +using System.Collections.Generic; + +namespace Needlework.Net.ViewModels.Pages.Schemas +{ + public partial class SchemaItemViewModel : ObservableObject + { + public SchemaItemViewModel(PropertyClassViewModel vm) + { + Id = vm.Id; + PropertyFields = vm.PropertyFields; + PropertyEnums = vm.PropertyEnums; + } + + public string Id { get; } + + public List PropertyFields { get; } = []; + + public List PropertyEnums { get; } = []; + } +} diff --git a/Needlework.Net/ViewModels/Pages/Schemas/SchemasViewModel.cs b/Needlework.Net/ViewModels/Pages/Schemas/SchemasViewModel.cs new file mode 100644 index 0000000..1a00d2f --- /dev/null +++ b/Needlework.Net/ViewModels/Pages/Schemas/SchemasViewModel.cs @@ -0,0 +1,87 @@ +using Avalonia.Threading; +using CommunityToolkit.Mvvm.ComponentModel; +using DebounceThrottle; +using Needlework.Net.Helpers; +using Needlework.Net.Models; +using Needlework.Net.ViewModels.Pages.Endpoints; +using System; +using System.Collections.Generic; +using System.Linq; +using System.Threading.Tasks; + +namespace Needlework.Net.ViewModels.Pages.Schemas +{ + public partial class SchemasViewModel : PageBase + { + private readonly DebounceDispatcher _debounceDispatcher = new(TimeSpan.FromMilliseconds(500)); + + private readonly DocumentService _documentService; + + public record SchemaTab(string Key, Tab Tab); + + private List _schemas = []; + + public SchemasViewModel(DocumentService documentService) : base("Schemas", "fa-solid fa-file-lines") + { + _documentService = documentService; + } + + [ObservableProperty] + private bool _isBusy = true; + + [ObservableProperty] + private string? _search; + + [ObservableProperty] + private List _schemaItems = []; + + partial void OnSearchChanged(string? value) + { + _debounceDispatcher.Debounce(() => + { + if (string.IsNullOrEmpty(value)) + { + SchemaItems = []; + return; + } + + Task.Run(async () => + { + var lcuSchemaDocument = await _documentService.GetLcuSchemaDocumentAsync(); + var lolClientDocument = await _documentService.GetLolClientDocumentAsync(); + var items = _schemas.Where(schema => schema.Key.Contains(value, StringComparison.OrdinalIgnoreCase)) + .Select((schema) => ToSchemaItemViewModel(schema, lcuSchemaDocument, lolClientDocument)) + .ToList(); + Dispatcher.UIThread.Invoke(() => { SchemaItems = items; }); + }); + }); + } + + private SchemaItemViewModel ToSchemaItemViewModel(SchemaTab schema, Document lcuSchemaDocument, Document lolClientDocument) + { + var document = schema.Tab switch + { + Tab.LCU => lcuSchemaDocument.OpenApiDocument, + Tab.GameClient => lolClientDocument.OpenApiDocument, + _ => throw new NotImplementedException() + }; + var vm = OpenApiHelpers.WalkSchema(document.Components.Schemas[schema.Key], document); + return new SchemaItemViewModel(vm); + + } + + public override async Task InitializeAsync() + { + var lcuSchemaDocument = await _documentService.GetLcuSchemaDocumentAsync(); + var lolClientDocument = await _documentService.GetLolClientDocumentAsync(); + Dispatcher.UIThread.Invoke(() => + { + _schemas = Enumerable.Concat( + lcuSchemaDocument.OpenApiDocument.Components.Schemas.Keys.Select(key => new SchemaTab(key, Tab.LCU)), + lolClientDocument.OpenApiDocument.Components.Schemas.Keys.Select(key => new SchemaTab(key, Tab.GameClient)) + ).ToList(); + IsBusy = false; + }); + } + } +} diff --git a/Needlework.Net/Views/Pages/Schemas/SchemaItemView.axaml b/Needlework.Net/Views/Pages/Schemas/SchemaItemView.axaml new file mode 100644 index 0000000..8143ae3 --- /dev/null +++ b/Needlework.Net/Views/Pages/Schemas/SchemaItemView.axaml @@ -0,0 +1,46 @@ + + + + + + + + + + + + + + + + + + + diff --git a/Needlework.Net/Views/Pages/Schemas/SchemaItemView.axaml.cs b/Needlework.Net/Views/Pages/Schemas/SchemaItemView.axaml.cs new file mode 100644 index 0000000..b7ffff4 --- /dev/null +++ b/Needlework.Net/Views/Pages/Schemas/SchemaItemView.axaml.cs @@ -0,0 +1,11 @@ +using Avalonia.Controls; + +namespace Needlework.Net.Views.Pages.Schemas; + +public partial class SchemaItemView : UserControl +{ + public SchemaItemView() + { + InitializeComponent(); + } +} \ No newline at end of file diff --git a/Needlework.Net/Views/Pages/Schemas/SchemasView.axaml b/Needlework.Net/Views/Pages/Schemas/SchemasView.axaml new file mode 100644 index 0000000..fbbeb84 --- /dev/null +++ b/Needlework.Net/Views/Pages/Schemas/SchemasView.axaml @@ -0,0 +1,43 @@ + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/Needlework.Net/Views/Pages/Schemas/SchemasView.axaml.cs b/Needlework.Net/Views/Pages/Schemas/SchemasView.axaml.cs new file mode 100644 index 0000000..ccc0b98 --- /dev/null +++ b/Needlework.Net/Views/Pages/Schemas/SchemasView.axaml.cs @@ -0,0 +1,11 @@ +using Avalonia.Controls; + +namespace Needlework.Net.Views.Pages.Schemas; + +public partial class SchemasView : UserControl +{ + public SchemasView() + { + InitializeComponent(); + } +} \ No newline at end of file