@using ZB.MOM.WW.OtOpcUa.AdminUI.Clients @using ZB.MOM.WW.OtOpcUa.Commons.Messages.Admin @inject AdminProbeService Probe @implements IDisposable
@if (_result is not null) { @if (_result.Ok) { OK · @_result.LatencyMs?.ToString("F0") ms } else { Failed · @TruncatedMessage() } }
@code { /// Driver type key — must match an installed IDriverProbe.DriverType. [Parameter, EditorRequired] public string DriverType { get; set; } = ""; /// Callback that returns the current form config as JSON. Called at click time. [Parameter, EditorRequired] public Func GetConfigJson { get; set; } = () => "{}"; /// Per-probe timeout forwarded to the actor (actor clamps to [1, 60] s). Default 10 s. [Parameter] public int TimeoutSeconds { get; set; } = 10; private bool _busy; private TestDriverConnectResult? _result; private System.Timers.Timer? _clearTimer; private async Task OnClickAsync() { _busy = true; _result = null; StateHasChanged(); try { var json = GetConfigJson() ?? "{}"; _result = await Probe.TestAsync(DriverType, json, TimeoutSeconds); } catch (Exception ex) { _result = new TestDriverConnectResult(false, ex.Message, null, Guid.Empty); } finally { _busy = false; ScheduleClear(); StateHasChanged(); } } private void ScheduleClear() { _clearTimer?.Dispose(); _clearTimer = new System.Timers.Timer(30_000) { AutoReset = false }; _clearTimer.Elapsed += async (_, _) => { _result = null; await InvokeAsync(StateHasChanged); }; _clearTimer.Start(); } private string TruncatedMessage() => _result?.Message is null ? "" : (_result.Message.Length > 60 ? _result.Message[..60] + "…" : _result.Message); public void Dispose() => _clearTimer?.Dispose(); }