namespace Web.Services; using Microsoft.JSInterop; public class NetworkStatusService : IAsyncDisposable, IDisposable { private readonly IJSRuntime _jsRuntime; private DotNetObjectReference? _dotNetRef; private bool _isOnline = true; private bool _initialized; public event Action? StatusChanged; public bool IsOnline => _isOnline; public NetworkStatusService(IJSRuntime jsRuntime) { _jsRuntime = jsRuntime; } 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); } } public void Dispose() { _dotNetRef?.Dispose(); _dotNetRef = null; } public async ValueTask DisposeAsync() { if (_dotNetRef != null) { try { await _jsRuntime.InvokeVoidAsync("networkStatus.dispose"); } catch { // Ignore disposal errors } _dotNetRef.Dispose(); } } }