69 lines
1.6 KiB
C#
69 lines
1.6 KiB
C#
using Microsoft.JSInterop;
|
|
|
|
namespace Web.Services;
|
|
|
|
public class NetworkStatusService : IAsyncDisposable, IDisposable
|
|
{
|
|
private readonly IJSRuntime _jsRuntime;
|
|
private DotNetObjectReference<NetworkStatusService>? _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<bool>? StatusChanged;
|
|
|
|
public async Task InitializeAsync()
|
|
{
|
|
if (_initialized) return;
|
|
_initialized = true;
|
|
|
|
try
|
|
{
|
|
_dotNetRef = DotNetObjectReference.Create(this);
|
|
IsOnline = await _jsRuntime.InvokeAsync<bool>("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);
|
|
}
|
|
}
|
|
} |