@page "/admin/servers/nodes" @using System.Diagnostics @using MoonCore.Blazor.Tailwind.Alerts @using MoonCore.Blazor.Tailwind.MinimalCrud @using MoonCore.Helpers @using MoonCore.Models @using MoonCore.Blazor.Tailwind.DataTable @using MoonlightServers.Shared.Http.Responses.Admin.Nodes @using MoonCore.Blazor.Tailwind.Components @using MoonlightServers.Frontend.Services @using MoonlightServers.Shared.Http.Responses.Admin.Nodes.Sys @inject HttpApiClient ApiClient @inject NodeService NodeService @inject AlertService AlertService
@code { private Dictionary Responses = new(); private Task LoadNodeStatus(int node) { Task.Run(async () => { try { var status = await NodeService.GetSystemStatus(node); lock (Responses) Responses[node] = status; } catch (Exception e) { lock (Responses) Responses[node] = null; } await InvokeAsync(StateHasChanged); }); return Task.CompletedTask; } private async Task ShowErrorDetails(int id) { NodeSystemStatusResponse? data; lock (Responses) data = Responses.GetValueOrDefault(id); if (data == null) return; var message = $"Failed after {Math.Round(data.RoundtripTime.TotalSeconds, 2)} seconds: " + (data.RoundtripRemoteFailure ? "(Failed at node)" : "(Failed at api server)") + $" {data.RoundtripError}"; await AlertService.Danger("Node error details", message); } private void OnConfigure(MinimalCrudOptions options) { options.Title = "Nodes"; options.ItemLoader = async (page, pageSize) => await ApiClient.GetJson>($"api/admin/servers/nodes?page={page}&pageSize={pageSize}"); options.CreateUrl = ComponentHelper.GetRouteOfComponent(); options.UpdateUrl = item => ComponentHelper.GetRouteOfComponent(item.Id)!; options.DeleteFunction = async item => await ApiClient.Delete($"api/admin/servers/nodes/{item.Id}"); } }