@using ShadcnBlazor.Cards @inject IJSRuntime JsRuntime @implements IAsyncDisposable @typeparam T @if (!string.IsNullOrEmpty(Title)) { @Title } @if (CurrentValue != null) { @DisplayField.Invoke(CurrentValue) } else { - } @code { [Parameter] public IEnumerable? DefaultItems { get; set; } [Parameter] public Func DisplayField { get; set; } [Parameter] public Func ValueField { get; set; } [Parameter] public string Title { get; set; } [Parameter] public int Min { get; set; } = 0; [Parameter] public int Max { get; set; } = 100; [Parameter] public int VisibleDataPoints { get; set; } = 30; [Parameter] public string ClassName { get; set; } private string Identifier; private T? CurrentValue; private int Counter; protected override void OnInitialized() { Identifier = $"realtimeChart{GetHashCode()}"; } protected override async Task OnAfterRenderAsync(bool firstRender) { if (!firstRender) return; var items = DefaultItems?.ToArray() ?? []; var labels = items.Select(x => { Counter++; return Counter.ToString(); }); var dataPoints = items.Select(ValueField); await JsRuntime.InvokeVoidAsync( "moonlightServersRealtimeChart.init", Identifier, Identifier, VisibleDataPoints, Min, Max, labels, dataPoints ); } public async Task PushAsync(T value) { Counter++; var label = Counter.ToString(); var dataPoint = ValueField.Invoke(value); CurrentValue = value; await JsRuntime.InvokeVoidAsync("moonlightServersRealtimeChart.pushValue", Identifier, label, dataPoint); await InvokeAsync(StateHasChanged); } public async ValueTask DisposeAsync() => await JsRuntime.InvokeVoidAsync("moonlightServersRealtimeChart.destroy", Identifier); }