Skip to content
This repository has been archived by the owner on Feb 16, 2023. It is now read-only.

Add AddTabbedSegment with segment name #96

Merged
merged 1 commit into from
Aug 9, 2022
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
1 change: 1 addition & 0 deletions src/Prism.Maui/Navigation/Builder/INavigationBuilder.cs
Original file line number Diff line number Diff line change
Expand Up @@ -5,6 +5,7 @@ public interface INavigationBuilder
Uri Uri { get; }
INavigationBuilder AddSegment(string segmentName, Action<ISegmentBuilder> configureSegment);
INavigationBuilder AddTabbedSegment(Action<ITabbedSegmentBuilder> configuration);
INavigationBuilder AddTabbedSegment(string segmentName, Action<ITabbedSegmentBuilder> configureSegment);
INavigationBuilder WithParameters(INavigationParameters parameters);
INavigationBuilder AddParameter(string key, object value);

Expand Down
8 changes: 8 additions & 0 deletions src/Prism.Maui/Navigation/Builder/NavigationBuilder.cs
Original file line number Diff line number Diff line change
Expand Up @@ -39,6 +39,14 @@ public INavigationBuilder AddTabbedSegment(Action<ITabbedSegmentBuilder> configu
return this;
}

public INavigationBuilder AddTabbedSegment(string segmentName, Action<ITabbedSegmentBuilder> configureSegment)
{
var builder = new TabbedSegmentBuilder(this, segmentName);
configureSegment?.Invoke(builder);
_uriSegments.Add(builder);
return this;
}

public INavigationBuilder AddParameter(string key, object value)
{
_navigationParameters.Add(key, value);
Expand Down
15 changes: 15 additions & 0 deletions src/Prism.Maui/Navigation/Builder/TabbedSegmentBuilder.cs
Original file line number Diff line number Diff line change
Expand Up @@ -24,6 +24,21 @@ public TabbedSegmentBuilder(INavigationBuilder builder)
SegmentName = registration.Name;
}

public TabbedSegmentBuilder(INavigationBuilder builder, string segmentName)
{
_builder = builder;
_parameters = new NavigationParameters();

if (builder is not IRegistryAware registryAware)
throw new Exception("The builder does not implement IRegistryAware");

var registration = registryAware.Registry.ViewsOfType(typeof(TabbedPage)).FirstOrDefault(x => x.Name == segmentName);
if (registration == null)
throw new NavigationException(NavigationException.NoPageIsRegistered, nameof(TabbedPage));

SegmentName = registration.Name;
}

IViewRegistry IRegistryAware.Registry => ((IRegistryAware)_builder).Registry;

public string SegmentName { get; set; }
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -4,6 +4,7 @@
using Moq;
using Prism.Common;
using Prism.Maui.Tests.Mocks.Ioc;
using Prism.Maui.Tests.Navigation.Mocks.Views;

namespace Prism.Maui.Tests.Fixtures.Navigation;

Expand Down Expand Up @@ -114,6 +115,63 @@ public void GeneratesTabbedPageUriWithCreatedTabsWithParameters()
Assert.Contains(parameters, x => HttpUtility.UrlDecode(x.Value.ToString()) == "ViewB?foo=bar");
}

[Fact]
public void GeneratesCustomTabbedPageUriWithCreatedTabs()
{
var container = new TestContainer();
container.RegisterForNavigation<TabbedPage>();
container.RegisterForNavigation<TabbedPageEmptyMock>();

var navigationService = new Mock<INavigationService>();
navigationService
.As<IRegistryAware>()
.Setup(x => x.Registry)
.Returns(container.Resolve<NavigationRegistry>());
var uri = navigationService.Object
.CreateBuilder()
.AddTabbedSegment("TabbedPageEmptyMock", b =>
{
b.CreateTab("ViewA")
.CreateTab("ViewB")
.CreateTab("ViewC");
})
.Uri;

Assert.Equal("TabbedPageEmptyMock?createTab=ViewA&createTab=ViewB&createTab=ViewC", uri.ToString());
}

[Fact]
public void GeneratesCustomTabbedPageUriWithCreatedTabsWithParameters()
{
var container = new TestContainer();
container.RegisterForNavigation<TabbedPage>();
container.RegisterForNavigation<TabbedPageEmptyMock>();

var navigationService = new Mock<INavigationService>();
navigationService
.As<IRegistryAware>()
.Setup(x => x.Registry)
.Returns(container.Resolve<NavigationRegistry>());
var uri = navigationService.Object
.CreateBuilder()
.AddTabbedSegment("TabbedPageEmptyMock", b =>
{
b.CreateTab("ViewA", t => t.AddParameter("id", 5))
.CreateTab("ViewB", t => t.AddParameter("foo", "bar"))
.CreateTab("ViewC");
})
.Uri;

Assert.Equal("TabbedPageEmptyMock?createTab=ViewA%3Fid%3D5&createTab=ViewB%3Ffoo%3Dbar&createTab=ViewC", uri.ToString());

var parameters = UriParsingHelper.GetSegmentParameters(uri.ToString());
Assert.Equal(3, parameters.Count);
Assert.True(parameters.All(x => x.Key == KnownNavigationParameters.CreateTab));

Assert.Contains(parameters, x => HttpUtility.UrlDecode(x.Value.ToString()) == "ViewA?id=5");
Assert.Contains(parameters, x => HttpUtility.UrlDecode(x.Value.ToString()) == "ViewB?foo=bar");
}

[Fact]
public void GeneratesDeepLinkTabCreation()
{
Expand Down