Skip to content

Commit 124d682

Browse files
committed
Fixed ghost navigation after locking
1 parent 12c4907 commit 124d682

File tree

7 files changed

+47
-19
lines changed

7 files changed

+47
-19
lines changed

src/Platforms/SecureFolderFS.Maui/Views/Vault/LoginPage.xaml.cs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -101,7 +101,7 @@ private async void ViewModel_NavigationRequested(object? sender, NavigationReque
101101
dashboardViewModel.DashboardNavigation.Views.Add(overviewViewModel);
102102
dashboardViewModel.DashboardNavigation.Views.Add(propertiesViewModel);
103103

104-
await ViewModel.VaultNavigation.TryNavigateAndForgetAsync(dashboardViewModel);
104+
await ViewModel.VaultNavigation.ForgetNavigateCurrentViewAsync(dashboardViewModel);
105105
}
106106

107107
public VaultLoginViewModel? ViewModel

src/Platforms/SecureFolderFS.Uno/Views/Vault/VaultLoginPage.xaml.cs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -72,7 +72,7 @@ private async void ViewModel_NavigationRequested(object? sender, NavigationReque
7272
var dashboardNavigation = DI.Service<INavigationService>();
7373
var dashboardViewModel = new VaultDashboardViewModel(args.UnlockedVaultViewModel, ViewModel.VaultNavigation, dashboardNavigation);
7474

75-
await ViewModel.VaultNavigation.TryNavigateAndForgetAsync(dashboardViewModel);
75+
await ViewModel.VaultNavigation.ForgetNavigateCurrentViewAsync(dashboardViewModel);
7676
}
7777
}
7878
}

src/Sdk/SecureFolderFS.Sdk/Extensions/NavigationExtensions.cs

Lines changed: 33 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -32,17 +32,46 @@ public static async Task<bool> TryNavigateAsync<T>(this INavigationService navig
3232
return await navigation.NavigateAsync(view);
3333
}
3434

35-
public static async Task<bool> TryNavigateAndForgetAsync(this INavigationService navigationService, IViewDesignation view)
35+
public static async Task<bool> ForgetNavigateCurrentViewAsync(this INavigationService navigationService, IViewDesignation view)
36+
{
37+
return await ForgetNavigateViewAsync(navigationService, view, () =>
38+
{
39+
if (navigationService.CurrentView is null)
40+
return null;
41+
42+
navigationService.Views.Remove(navigationService.CurrentView);
43+
return navigationService.CurrentView;
44+
});
45+
}
46+
47+
public static async Task<bool> ForgetNavigateSpecificViewAsync(this INavigationService navigationService, IViewDesignation view, Func<IViewDesignation, bool> viewFinder)
48+
{
49+
return await ForgetNavigateViewAsync(navigationService, view, () =>
50+
{
51+
var targetView = navigationService.Views.FirstOrDefault(viewFinder);
52+
if (targetView is null)
53+
return null;
54+
55+
navigationService.Views.Remove(targetView);
56+
return targetView;
57+
}, navigationService.CurrentView is null || viewFinder(navigationService.CurrentView));
58+
}
59+
60+
private static async Task<bool> ForgetNavigateViewAsync(this INavigationService navigationService, IViewDesignation view, Func<IViewDesignation?> viewForgetter, bool shouldTriggerNavigation = true)
3661
{
3762
var navigated = false;
3863
IViewDesignation? currentView = null;
3964

4065
try
4166
{
42-
if (navigationService.CurrentView is not null)
67+
currentView = viewForgetter();
68+
if (!shouldTriggerNavigation)
4369
{
44-
navigationService.Views.Remove(navigationService.CurrentView);
45-
currentView = navigationService.CurrentView;
70+
// Silently replace the removed view without triggering navigation
71+
if (currentView is not null)
72+
navigationService.Views.Add(view);
73+
74+
return false;
4675
}
4776

4877
navigated = await navigationService.NavigateAsync(view);

src/Sdk/SecureFolderFS.Sdk/ViewModels/Controls/VaultControlsViewModel.cs

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,17 +1,20 @@
11
using System;
22
using System.ComponentModel;
3+
using System.Linq;
34
using System.Threading;
45
using System.Threading.Tasks;
56
using CommunityToolkit.Mvvm.ComponentModel;
67
using CommunityToolkit.Mvvm.Input;
78
using CommunityToolkit.Mvvm.Messaging;
89
using SecureFolderFS.Sdk.Attributes;
10+
using SecureFolderFS.Sdk.Contexts;
911
using SecureFolderFS.Sdk.Extensions;
1012
using SecureFolderFS.Sdk.Messages;
1113
using SecureFolderFS.Sdk.Services;
1214
using SecureFolderFS.Sdk.ViewModels.Views.Vault;
1315
using SecureFolderFS.Shared;
1416
using SecureFolderFS.Shared.ComponentModel;
17+
using SecureFolderFS.Shared.Extensions;
1518

1619
namespace SecureFolderFS.Sdk.ViewModels.Controls
1720
{
@@ -75,7 +78,7 @@ private async Task LockVaultAsync()
7578
_ = loginPageViewModel.InitAsync();
7679

7780
// Navigate away
78-
await _vaultNavigation.TryNavigateAndForgetAsync(loginPageViewModel);
81+
await _vaultNavigation.ForgetNavigateSpecificViewAsync(loginPageViewModel, x => (x as IVaultViewContext)?.VaultViewModel.VaultModel.Equals(_unlockedVaultViewModel.VaultViewModel.VaultModel) ?? false);
7982
WeakReferenceMessenger.Default.Send(new VaultLockedMessage(_unlockedVaultViewModel.VaultViewModel.VaultModel));
8083
}
8184

src/Sdk/SecureFolderFS.Sdk/ViewModels/Controls/Widgets/WidgetsListViewModel.cs

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -70,8 +70,7 @@ public async Task InitAsync(CancellationToken cancellationToken = default)
7070
/// <inheritdoc/>
7171
public void Dispose()
7272
{
73-
foreach (var item in Widgets)
74-
item.Dispose();
73+
Widgets.DisposeAll();
7574
}
7675
}
7776
}

src/Sdk/SecureFolderFS.Sdk/ViewModels/Views/Vault/VaultHealthViewModel.Scanning.cs

Lines changed: 3 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,11 +1,10 @@
1-
using System;
2-
using System.Threading;
3-
using System.Threading.Tasks;
41
using CommunityToolkit.Mvvm.Input;
5-
using SecureFolderFS.Sdk.Enums;
62
using SecureFolderFS.Sdk.EventArguments;
73
using SecureFolderFS.Sdk.Extensions;
84
using SecureFolderFS.Shared.Extensions;
5+
using System;
6+
using System.Threading;
7+
using System.Threading.Tasks;
98

109
namespace SecureFolderFS.Sdk.ViewModels.Views.Vault
1110
{

src/Shared/SecureFolderFS.Shared/Extensions/CollectionExtensions.cs

Lines changed: 4 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -66,13 +66,11 @@ public static void AddMultiple<T>(this ICollection<T> collection, IEnumerable<T>
6666

6767
public static T? RemoveMatch<T>(this ICollection<T> list, Func<T, bool> predicate)
6868
{
69-
foreach (var item in list)
70-
{
71-
if (predicate(item))
72-
return list.Remove(item) ? item : default;
73-
}
69+
var item = list.FirstOrDefault(predicate);
70+
if (item is null)
71+
return default;
7472

75-
return default;
73+
return list.Remove(item) ? item : default;
7674
}
7775

7876
public static bool IsEmpty<T>([NotNullWhen(false)] this IEnumerable<T>? enumerable)

0 commit comments

Comments
 (0)