@using Microsoft.Extensions.Localization @implements IDisposable @inject DbService DbService @inject IStringLocalizerFactory LocalizerFactory
@if (!IsSyncing) { }
@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); } } }