diff --git a/src/AliasVault.Client/Main/Components/Widgets/CreateNewIdentityWidget.razor b/src/AliasVault.Client/Main/Components/Widgets/CreateNewIdentityWidget.razor index e4e1735bb..d5a9a92f0 100644 --- a/src/AliasVault.Client/Main/Components/Widgets/CreateNewIdentityWidget.razor +++ b/src/AliasVault.Client/Main/Components/Widgets/CreateNewIdentityWidget.razor @@ -17,7 +17,7 @@
- +
diff --git a/src/AliasVault.Client/Main/Pages/Credentials/AddEdit.razor b/src/AliasVault.Client/Main/Pages/Credentials/AddEdit.razor index d7204481f..890019d0f 100644 --- a/src/AliasVault.Client/Main/Pages/Credentials/AddEdit.razor +++ b/src/AliasVault.Client/Main/Pages/Credentials/AddEdit.razor @@ -35,7 +35,7 @@ else

Service

- +
diff --git a/src/AliasVault.Client/Main/Pages/Credentials/Home.razor b/src/AliasVault.Client/Main/Pages/Credentials/Home.razor index 2023e6336..ec4df3326 100644 --- a/src/AliasVault.Client/Main/Pages/Credentials/Home.razor +++ b/src/AliasVault.Client/Main/Pages/Credentials/Home.razor @@ -53,7 +53,7 @@ GlobalNotificationService.AddErrorMessage("Failed to load credentials.", true); return; } - if (credentialListEntries.Count == 0) + if (credentialListEntries.Count == 0 && !DbService.Settings.TutorialDone) { // Redirect to welcome page. NavigationManager.NavigateTo("/welcome"); diff --git a/src/AliasVault.Client/Main/Pages/Settings/General.razor b/src/AliasVault.Client/Main/Pages/Settings/General.razor index 4143b4898..e651985f7 100644 --- a/src/AliasVault.Client/Main/Pages/Settings/General.razor +++ b/src/AliasVault.Client/Main/Pages/Settings/General.razor @@ -91,27 +91,27 @@ /// /// Updates the default email domain. /// - private void UpdateDefaultEmailDomain() + private async Task UpdateDefaultEmailDomain() { - DbService.Settings.DefaultEmailDomain = DefaultEmailDomain; + await DbService.Settings.SetDefaultEmailDomain(DefaultEmailDomain); StateHasChanged(); } /// /// Updates the auto email refresh setting. /// - private void UpdateAutoEmailRefresh() + private async Task UpdateAutoEmailRefresh() { - DbService.Settings.AutoEmailRefresh = AutoEmailRefresh; + await DbService.Settings.SetAutoEmailRefresh(AutoEmailRefresh); StateHasChanged(); } /// /// Updates the auto email refresh setting. /// - private void UpdateDefaultIdentityLanguage() + private async Task UpdateDefaultIdentityLanguage() { - DbService.Settings.DefaultIdentityLanguage = DefaultIdentityLanguage; + await DbService.Settings.SetDefaultIdentityLanguage(DefaultIdentityLanguage); StateHasChanged(); } } diff --git a/src/AliasVault.Client/Main/Pages/Welcome.razor b/src/AliasVault.Client/Main/Pages/Welcome.razor index d828f7669..8986c7ffd 100644 --- a/src/AliasVault.Client/Main/Pages/Welcome.razor +++ b/src/AliasVault.Client/Main/Pages/Welcome.razor @@ -48,20 +48,6 @@
break; - case TutorialStep.SecureEnvironment: -
-

- AliasVault is built with security and privacy in mind: -

-
    -
  1. All your data is encrypted in your browser with your master password
  2. -
  3. Emails are stored encrypted on the server and are only readable by you
  4. -
  5. Your master password never leaves your device
  6. -
  7. The source-code is open-source and available on GitHub
  8. -
-
- break; - case TutorialStep.SecurityTips:

Privacy & Security Tips

@@ -144,7 +130,6 @@ { TutorialStep.Welcome => "Welcome to AliasVault", TutorialStep.HowAliasVaultWorks => "How AliasVault Works", - TutorialStep.SecureEnvironment => "Secure Environment", TutorialStep.SecurityTips => "Security Tips", TutorialStep.CreateFirstIdentity => "Get Started", _ => "Tutorial" @@ -173,8 +158,7 @@ _currentStep = _currentStep switch { TutorialStep.Welcome => TutorialStep.HowAliasVaultWorks, - TutorialStep.HowAliasVaultWorks => TutorialStep.SecureEnvironment, - TutorialStep.SecureEnvironment => TutorialStep.SecurityTips, + TutorialStep.HowAliasVaultWorks => TutorialStep.SecurityTips, TutorialStep.SecurityTips => TutorialStep.CreateFirstIdentity, _ => _currentStep }; @@ -185,9 +169,9 @@ NavigationManager.NavigateTo("credentials/create"); } - private void FinishTutorial() + private async Task FinishTutorial() { - DbService.Settings.TutorialDone = true; + await DbService.Settings.SetTutorialDoneAsync(true); NavigationManager.NavigateTo("credentials"); } diff --git a/src/AliasVault.Client/Services/Database/DbService.cs b/src/AliasVault.Client/Services/Database/DbService.cs index 98af7df11..4fd30eb8e 100644 --- a/src/AliasVault.Client/Services/Database/DbService.cs +++ b/src/AliasVault.Client/Services/Database/DbService.cs @@ -28,9 +28,9 @@ public sealed class DbService : IDisposable private readonly HttpClient _httpClient; private readonly DbServiceState _state = new(); private readonly Config _config; - private readonly SettingsService _settingsService = new(); private readonly ILogger _logger; private readonly GlobalNotificationService _globalNotificationService; + private SettingsService _settingsService = new(); private SqliteConnection? _sqlConnection; private AliasClientDbContext _dbContext; private long _vaultRevisionNumber; @@ -412,6 +412,9 @@ public sealed class DbService : IDisposable _state.UpdateState(DbServiceState.DatabaseStatus.Uninitialized); _isSuccessfullyInitialized = false; + // Reset settings. + _settingsService = new(); + return (_sqlConnection, _dbContext); } diff --git a/src/AliasVault.Client/Services/SettingsService.cs b/src/AliasVault.Client/Services/SettingsService.cs index 3b7f372ca..350c47c12 100644 --- a/src/AliasVault.Client/Services/SettingsService.cs +++ b/src/AliasVault.Client/Services/SettingsService.cs @@ -27,40 +27,55 @@ public sealed class SettingsService private bool _initialized; /// - /// Gets or sets a value indicating whether the tutorial has been completed. + /// Gets the DefaultEmailDomain setting. /// - public bool TutorialDone - { - get => GetSetting("TutorialDone", false); - set => SetSettingAsync("TutorialDone", value).GetAwaiter().GetResult(); - } + /// Default email domain as string. + public string DefaultEmailDomain => GetSetting("DefaultEmailDomain"); /// - /// Gets or sets the DefaultEmailDomain setting. + /// Gets a value indicating whether email refresh should be done automatically on the credentials page. /// - public string DefaultEmailDomain - { - get => GetSetting("DefaultEmailDomain"); - set => SetSettingAsync("DefaultEmailDomain", value).GetAwaiter().GetResult(); - } + /// AutoEmailRefresh setting as string. + public bool AutoEmailRefresh => GetSetting("AutoEmailRefresh", true); /// - /// Gets or sets a value indicating whether email refresh should be done automatically on the credentials page. + /// Gets the DefaultIdentityLanguage setting. /// - public bool AutoEmailRefresh - { - get => GetSetting("AutoEmailRefresh", true); - set => SetSettingAsync("AutoEmailRefresh", value).GetAwaiter().GetResult(); - } + /// Default identity language as two-letter code. + public string DefaultIdentityLanguage => GetSetting("DefaultIdentityLanguage", "en")!; /// - /// Gets or sets the DefaultIdentityLanguage setting. + /// Gets a value indicating whether the tutorial has been completed. /// - public string DefaultIdentityLanguage - { - get => GetSetting("DefaultIdentityLanguage", "en")!; - set => SetSettingAsync("DefaultIdentityLanguage", value).GetAwaiter().GetResult(); - } + public bool TutorialDone => GetSetting("TutorialDone", false); + + /// + /// Sets the DefaultEmailDomain setting. + /// + /// The new DefaultEmailDomain setting. + /// Task. + public Task SetDefaultEmailDomain(string value) => SetSettingAsync("DefaultEmailDomain", value); + + /// + /// Sets the AutoEmailRefresh setting as a string. + /// + /// The new value. + /// Task. + public Task SetAutoEmailRefresh(bool value) => SetSettingAsync("AutoEmailRefresh", value); + + /// + /// Sets the DefaultIdentityLanguage setting. + /// + /// The new value. + /// Task. + public Task SetDefaultIdentityLanguage(string value) => SetSettingAsync("DefaultIdentityLanguage", value); + + /// + /// Sets the TutorialDone setting. + /// + /// Value to set. + /// Task. + public Task SetTutorialDoneAsync(bool value) => SetSettingAsync("TutorialDone", value); /// /// Initializes the settings service asynchronously.