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