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 2dd43e382..321b98428 100644 --- a/samples/CommunityToolkit.Maui.Sample/Pages/Views/Popup/PopupsPage.xaml.cs +++ b/samples/CommunityToolkit.Maui.Sample/Pages/Views/Popup/PopupsPage.xaml.cs @@ -29,7 +29,16 @@ protected override async void OnNavigatedTo(NavigatedToEventArgs args) } } - async void HandleSimplePopupButtonClicked(object? sender, EventArgs e) + protected override async void OnNavigatedFrom(NavigatedFromEventArgs args) + { + base.OnNavigatedFrom(args); + if (args.IsDestinationPageACommunityToolkitPopupPage()) + { + await Toast.Make("Opening Popup").Show(); + } + } + + async void HandleSimplePopupButtonClicked(object sender, EventArgs e) { var queryAttributes = new Dictionary { diff --git a/src/CommunityToolkit.Maui.UnitTests/Extensions/NavigatedFromEventArgsExtensionsTests.cs b/src/CommunityToolkit.Maui.UnitTests/Extensions/NavigatedFromEventArgsExtensionsTests.cs new file mode 100644 index 000000000..61b83d5f5 --- /dev/null +++ b/src/CommunityToolkit.Maui.UnitTests/Extensions/NavigatedFromEventArgsExtensionsTests.cs @@ -0,0 +1,82 @@ +using CommunityToolkit.Maui.Extensions; +using CommunityToolkit.Maui.UnitTests.Mocks; +using CommunityToolkit.Maui.UnitTests.Services; +using Xunit; + +namespace CommunityToolkit.Maui.UnitTests.Extensions; + +public class NavigatedFromEventArgsExtensionsTests : BaseViewTest +{ + [Fact] + public async Task NavigatedFromEventArgsExtensions_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.NavigatedFromEventArgsReceived += HandleNavigatedFromEventArgsReceived; + + var shellParameters = new Dictionary + { + { nameof(ContentPage.BackgroundColor), Colors.Orange } + }; + + + // Act + await mainPage.Navigation.PushAsync(shellContentPage); + await popupService.ShowPopupAsync(shell, null, shellParameters, TestContext.Current.CancellationToken); + var isDestinationPageACommunityToolkitPopupPage = await isDestinationPageACommunityToolkitPopupPageTCS.Task; + + // Assert + Assert.True(isDestinationPageACommunityToolkitPopupPage); + + void HandleNavigatedFromEventArgsReceived(object? sender, NavigatedFromEventArgs e) + { + isDestinationPageACommunityToolkitPopupPageTCS.SetResult(e.IsDestinationPageACommunityToolkitPopupPage()); + } + } + + [Fact] + public async Task NavigatedFromEventArgsExtensions_IsDestinationPageACommunityToolkitPopupPage_ShouldReturnFalse() + { + // Arrange + TaskCompletionSource isDestinationPageACommunityToolkitPopupPageTCS = new(); + var application = (MockApplication)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.NavigatedFromEventArgsReceived += HandleNavigatedFromEventArgsReceived; + var newShellContentPage = new ShellContentPage(); + + + // Act + await mainPage.Navigation.PushAsync(shellContentPage); + //push a new content page on top to make sure the navigation handler doesn't think we're navigating to a popup page + await mainPage.Navigation.PushAsync(newShellContentPage); + var isDestinationPageACommunityToolkitPopupPage = await isDestinationPageACommunityToolkitPopupPageTCS.Task; + + // Assert + Assert.False(isDestinationPageACommunityToolkitPopupPage); + + void HandleNavigatedFromEventArgsReceived(object? sender, NavigatedFromEventArgs e) + { + isDestinationPageACommunityToolkitPopupPageTCS.SetResult(e.IsDestinationPageACommunityToolkitPopupPage()); + } + } + + sealed class ShellContentPage : ContentPage + { + public event EventHandler? NavigatedFromEventArgsReceived; + + protected override void OnNavigatedFrom(NavigatedFromEventArgs args) + { + base.OnNavigatedFrom(args); + NavigatedFromEventArgsReceived?.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 new file mode 100644 index 000000000..174cadc49 --- /dev/null +++ b/src/CommunityToolkit.Maui/Extensions/NavigatedFromEventArgsExtensions.shared.cs @@ -0,0 +1,16 @@ +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