diff --git a/samples/CommunityToolkit.Maui.Sample/Pages/Views/Popup/PopupsPage.xaml.cs b/samples/CommunityToolkit.Maui.Sample/Pages/Views/Popup/PopupsPage.xaml.cs index 076ef8e8b5..9bc18a4cd2 100644 --- a/samples/CommunityToolkit.Maui.Sample/Pages/Views/Popup/PopupsPage.xaml.cs +++ b/samples/CommunityToolkit.Maui.Sample/Pages/Views/Popup/PopupsPage.xaml.cs @@ -33,6 +33,15 @@ protected override async void OnNavigatedFrom(NavigatedFromEventArgs args) { base.OnNavigatedFrom(args); if (args.IsDestinationPageACommunityToolkitPopupPage()) + { + await Toast.Make("Popup Opened").Show(); + } + } + + protected override async void OnNavigatingFrom(NavigatingFromEventArgs args) + { + base.OnNavigatingFrom(args); + if (args.IsDestinationPageACommunityToolkitPopupPage()) { await Toast.Make("Opening Popup").Show(); } diff --git a/src/CommunityToolkit.Maui.UnitTests/Extensions/NavigatedFromEventArgsExtensionsTests.cs b/src/CommunityToolkit.Maui.UnitTests/Extensions/NavigatedFromEventArgsExtensionsTests.cs index 61b83d5f5a..3bb9277845 100644 --- a/src/CommunityToolkit.Maui.UnitTests/Extensions/NavigatedFromEventArgsExtensionsTests.cs +++ b/src/CommunityToolkit.Maui.UnitTests/Extensions/NavigatedFromEventArgsExtensionsTests.cs @@ -36,6 +36,7 @@ public async Task NavigatedFromEventArgsExtensions_IsDestinationPageACommunityTo void HandleNavigatedFromEventArgsReceived(object? sender, NavigatedFromEventArgs e) { + shellContentPage.NavigatedFromEventArgsReceived -= HandleNavigatedFromEventArgsReceived; isDestinationPageACommunityToolkitPopupPageTCS.SetResult(e.IsDestinationPageACommunityToolkitPopupPage()); } } diff --git a/src/CommunityToolkit.Maui.UnitTests/Extensions/NavigatedToEventArgsExtensionsTests.cs b/src/CommunityToolkit.Maui.UnitTests/Extensions/NavigatedToEventArgsExtensionsTests.cs index dcdc34a086..2ffc7c1460 100644 --- a/src/CommunityToolkit.Maui.UnitTests/Extensions/NavigatedToEventArgsExtensionsTests.cs +++ b/src/CommunityToolkit.Maui.UnitTests/Extensions/NavigatedToEventArgsExtensionsTests.cs @@ -38,6 +38,7 @@ void HandleNavigatedToEventArgsReceived(object? sender, NavigatedToEventArgs e) { if (e.PreviousPage != mainPage) { + shellContentPage.NavigatedToEventArgsReceived -= HandleNavigatedToEventArgsReceived; wasPreviousPageACommunityToolkitPopupPageTCS.SetResult(e.WasPreviousPageACommunityToolkitPopupPage()); } } diff --git a/src/CommunityToolkit.Maui.UnitTests/Extensions/NavigatingFromEventArgsExtensionsTests.cs b/src/CommunityToolkit.Maui.UnitTests/Extensions/NavigatingFromEventArgsExtensionsTests.cs new file mode 100644 index 0000000000..023f5cb6ce --- /dev/null +++ b/src/CommunityToolkit.Maui.UnitTests/Extensions/NavigatingFromEventArgsExtensionsTests.cs @@ -0,0 +1,90 @@ +using CommunityToolkit.Maui.Extensions; +using CommunityToolkit.Maui.UnitTests.Mocks; +using Xunit; + +namespace CommunityToolkit.Maui.UnitTests.Extensions; + +public class NavigatingFromEventArgsExtensionsTests : BaseViewTest +{ + [Fact] + public async Task NavigatingFromEventArgsExtensions_IsDestinationPageACommunityToolkitPopupPage_ShouldReturnTrue() + { + // Arrange + TaskCompletionSource isDestinationPageACommunityToolkitPopupPageTCS = new(); + var application = (MockApplication)ServiceProvider.GetRequiredService(); + var popupService = ServiceProvider.GetRequiredService(); + + var shell = (Shell)(application.Windows[0].Page ?? throw new InvalidOperationException("Unable to retrieve Shell")); + var mainPage = shell.CurrentPage; + var shellContentPage = new ShellContentPage(); + shellContentPage.NavigatingFromEventArgsReceived += HandleNavigatingFromEventArgsReceived; + + var shellParameters = new Dictionary + { + { nameof(ContentPage.BackgroundColor), Colors.Orange } + }; + + // Act + await mainPage.Navigation.PushAsync(shellContentPage); + await popupService.ShowPopupAsync(shell, null, shellParameters, TestContext.Current.CancellationToken); + bool? isDestinationPageACommunityToolkitPopupPage = await isDestinationPageACommunityToolkitPopupPageTCS.Task; + + // Assert + Assert.True(isDestinationPageACommunityToolkitPopupPage); + + void HandleNavigatingFromEventArgsReceived(object? sender, NavigatingFromEventArgs e) + { + ArgumentNullException.ThrowIfNull(sender); + + if (sender is not ShellContentPage) + { + shellContentPage.NavigatingFromEventArgsReceived -= HandleNavigatingFromEventArgsReceived; + isDestinationPageACommunityToolkitPopupPageTCS.SetResult(e.IsDestinationPageACommunityToolkitPopupPage()); + } + } + } + + [Fact] + public async Task NavigatingFromEventArgsExtensions_IsDestinationPageACommunityToolkitPopupPage_ShouldReturnFalse() + { + // Arrange + MockApplication application = (MockApplication)ServiceProvider.GetRequiredService(); + IPopupService popupService = ServiceProvider.GetRequiredService(); + + Shell shell = (Shell)(application.Windows[0].Page ?? throw new InvalidOperationException("Unable to retrieve Shell")); + Page mainPage = shell.CurrentPage; + + ShellContentPage shellContentPage = new(); + ShellContentPage anotherShellContentPage = new(); + + TaskCompletionSource isDestinationPageACommunityToolkitPopupPageTCS = new(); + shellContentPage.NavigatingFromEventArgsReceived += HandleNavigatingFromEventArgsReceived; + + // Act + await mainPage.Navigation.PushAsync(shellContentPage); + await mainPage.Navigation.PushAsync(anotherShellContentPage); + bool? isDestinationPageACommunityToolkitPopupPage = await isDestinationPageACommunityToolkitPopupPageTCS.Task; + + // Assert + Assert.False(isDestinationPageACommunityToolkitPopupPage); + + void HandleNavigatingFromEventArgsReceived(object? sender, NavigatingFromEventArgs e) + { + ArgumentNullException.ThrowIfNull(sender); + + shellContentPage.NavigatingFromEventArgsReceived -= HandleNavigatingFromEventArgsReceived; + isDestinationPageACommunityToolkitPopupPageTCS.SetResult(e.IsDestinationPageACommunityToolkitPopupPage()); + } + } + + sealed class ShellContentPage : ContentPage + { + public event EventHandler? NavigatingFromEventArgsReceived; + + protected override void OnNavigatingFrom(NavigatingFromEventArgs args) + { + base.OnNavigatingFrom(args); + NavigatingFromEventArgsReceived?.Invoke(this, args); + } + } +} \ No newline at end of file diff --git a/src/CommunityToolkit.Maui/Extensions/NavigatedFromEventArgsExtensions.shared.cs b/src/CommunityToolkit.Maui/Extensions/NavigatedFromEventArgsExtensions.shared.cs deleted file mode 100644 index 174cadc492..0000000000 --- a/src/CommunityToolkit.Maui/Extensions/NavigatedFromEventArgsExtensions.shared.cs +++ /dev/null @@ -1,16 +0,0 @@ -using CommunityToolkit.Maui.Views; - -namespace CommunityToolkit.Maui.Extensions; - -/// -/// Extension methods for . -/// -public static class NavigatedFromEventArgsExtensions -{ - /// - /// Determines whether the previous page was a Community Toolkit . - /// - /// The current . - /// A boolean indicating whether the previous page was a Community Toolkit . - public static bool IsDestinationPageACommunityToolkitPopupPage(this NavigatedFromEventArgs args) => args.DestinationPage is PopupPage; -} \ No newline at end of file diff --git a/src/CommunityToolkit.Maui/Extensions/NavigatedToEventArgsExtensions.shared.cs b/src/CommunityToolkit.Maui/Extensions/NavigatedToEventArgsExtensions.shared.cs deleted file mode 100644 index 961bed55a2..0000000000 --- a/src/CommunityToolkit.Maui/Extensions/NavigatedToEventArgsExtensions.shared.cs +++ /dev/null @@ -1,16 +0,0 @@ -using CommunityToolkit.Maui.Views; - -namespace CommunityToolkit.Maui.Extensions; - -/// -/// Extension methods for . -/// -public static class NavigatedToEventArgsExtensions -{ - /// - /// Determines whether the previous page was a Community Toolkit . - /// - /// The current . - /// A boolean indicating whether the previous page was a Community Toolkit . - public static bool WasPreviousPageACommunityToolkitPopupPage(this NavigatedToEventArgs args) => args.PreviousPage is PopupPage; -} \ No newline at end of file diff --git a/src/CommunityToolkit.Maui/Extensions/NavigationEventArgsExtensions.cs b/src/CommunityToolkit.Maui/Extensions/NavigationEventArgsExtensions.cs new file mode 100644 index 0000000000..041c520a9d --- /dev/null +++ b/src/CommunityToolkit.Maui/Extensions/NavigationEventArgsExtensions.cs @@ -0,0 +1,30 @@ +using CommunityToolkit.Maui.Views; + +namespace CommunityToolkit.Maui.Extensions; + +/// +/// Extension methods for , , and . +/// +public static class NavigationEventArgsExtensions +{ + /// + /// Determines if the destination page is a Community Toolkit . + /// + /// The current . + /// A boolean indicating if the destination page is a Community Toolkit . + public static bool IsDestinationPageACommunityToolkitPopupPage(this NavigatedFromEventArgs args) => args.DestinationPage is PopupPage; + + /// + /// Determines whether the previous page was a Community Toolkit . + /// + /// The current . + /// A boolean indicating whether the previous page was a Community Toolkit . + public static bool WasPreviousPageACommunityToolkitPopupPage(this NavigatedToEventArgs args) => args.PreviousPage is PopupPage; + + /// + /// Determines if the destination page will be a Community Toolkit . + /// + /// The current . + /// A boolean indicating if the destination page will be a Community Toolkit . + public static bool IsDestinationPageACommunityToolkitPopupPage(this NavigatingFromEventArgs args) => args.DestinationPage is PopupPage; +} \ No newline at end of file