@using Microsoft.Extensions.Localization
@implements IDisposable
@inject DbService DbService
@inject IStringLocalizerFactory LocalizerFactory
@code {
private IStringLocalizer SharedLocalizer => LocalizerFactory.Create("SharedResources", "AliasVault.Client");
private bool IsSyncing { get; set; }
///
/// Dispose method.
///
public void Dispose()
{
DbService.GetState().StateChanged -= OnDatabaseStateChanged;
}
///
protected override async Task OnInitializedAsync()
{
await base.OnInitializedAsync();
DbService.GetState().StateChanged += OnDatabaseStateChanged;
UpdateSyncState();
}
///
/// Refresh the database.
///
private async Task OnRefreshClick()
{
await DbService.InitializeDatabaseAsync();
}
private async void OnDatabaseStateChanged(object? sender, DbServiceState.DatabaseState newState)
{
await InvokeAsync(() =>
{
UpdateSyncState();
StateHasChanged();
});
// Show loading indicator for at least 0.5 seconds when syncing to server
if (newState.Status is DbServiceState.DatabaseStatus.SavingToServer or DbServiceState.DatabaseStatus.BackgroundSyncPending)
{
await ShowSyncIndicatorAsync();
}
}
private void UpdateSyncState()
{
var currentStatus = DbService.GetState().CurrentState.Status;
IsSyncing = currentStatus is DbServiceState.DatabaseStatus.SavingToServer
or DbServiceState.DatabaseStatus.BackgroundSyncPending
or DbServiceState.DatabaseStatus.Loading;
}
private string GetStatusTitle()
{
var currentStatus = DbService.GetState().CurrentState.Status;
return currentStatus switch
{
DbServiceState.DatabaseStatus.BackgroundSyncPending => SharedLocalizer["SyncingChanges"],
DbServiceState.DatabaseStatus.SavingToServer => SharedLocalizer["SyncVaultData"],
DbServiceState.DatabaseStatus.Loading => SharedLocalizer["LoadingVault"],
_ => SharedLocalizer["SyncVaultData"],
};
}
private async Task ShowSyncIndicatorAsync()
{
IsSyncing = true;
await InvokeAsync(StateHasChanged);
await Task.Delay(800);
// Only hide if we're back to ready state
if (DbService.GetState().CurrentState.Status == DbServiceState.DatabaseStatus.Ready)
{
IsSyncing = false;
await InvokeAsync(StateHasChanged);
}
}
}