using Microsoft.JSInterop; namespace Web.Services; public class NetworkStatusService : IAsyncDisposable, IDisposable { private readonly IJSRuntime _jsRuntime; private DotNetObjectReference? _dotNetRef; private bool _initialized; public NetworkStatusService(IJSRuntime jsRuntime) { _jsRuntime = jsRuntime; } public bool IsOnline { get; private set; } = true; public async ValueTask DisposeAsync() { if (_dotNetRef != null) { try { await _jsRuntime.InvokeVoidAsync("networkStatus.dispose"); } catch { // Ignore disposal errors } _dotNetRef.Dispose(); } } public void Dispose() { _dotNetRef?.Dispose(); _dotNetRef = null; } public event Action? StatusChanged; public async Task InitializeAsync() { if (_initialized) return; _initialized = true; try { _dotNetRef = DotNetObjectReference.Create(this); IsOnline = await _jsRuntime.InvokeAsync("networkStatus.initialize", _dotNetRef); StatusChanged?.Invoke(IsOnline); } catch (Exception ex) { Console.WriteLine($"[NetworkStatusService] Failed to initialize: {ex.Message}"); } } [JSInvokable] public void SetOnlineStatus(bool isOnline) { if (IsOnline != isOnline) { IsOnline = isOnline; StatusChanged?.Invoke(IsOnline); } } }