Skip to content

Commit

Permalink
no message
Browse files Browse the repository at this point in the history
  • Loading branch information
freever committed Jul 24, 2023
1 parent 4b66058 commit 655dfa2
Show file tree
Hide file tree
Showing 13 changed files with 110 additions and 83 deletions.
57 changes: 1 addition & 56 deletions src/Blauhaus.MVVM.Abstractions/Navigator/IViewNavigator.cs
Original file line number Diff line number Diff line change
@@ -1,5 +1,6 @@
using System.Collections;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using Blauhaus.Common.Abstractions;
Expand All @@ -8,65 +9,9 @@

namespace Blauhaus.MVVM.Abstractions.Navigator;

public interface IViewTarget : IReadOnlyList<ViewIdentifier>
{
string Path { get; }
}

public class ViewTarget : IViewTarget
{
private readonly IReadOnlyList<ViewIdentifier> _viewIdentifiers;
private string? _path;

public ViewTarget(IReadOnlyList<ViewIdentifier> viewIdentifiers)
{
_viewIdentifiers = viewIdentifiers;
}

public static ViewTarget Create (params ViewIdentifier[] viewIdentifiers) => new(viewIdentifiers);


public IEnumerator<ViewIdentifier> GetEnumerator() => _viewIdentifiers.GetEnumerator();
IEnumerator IEnumerable.GetEnumerator() => GetEnumerator();
public int Count => _viewIdentifiers.Count;
public ViewIdentifier this[int index] => _viewIdentifiers[index];

public string Path
{
get
{
if (_path == null)
{
var path = new StringBuilder();
var paramaters = new StringBuilder();
foreach (var viewIdentifier in _viewIdentifiers)
{
path.Append('/').Append(viewIdentifier.Name);

foreach (var prop in viewIdentifier.Properties)
{
paramaters.Append(paramaters.Length == 0 ? '?' : '&');
paramaters.Append(prop.Key).Append('=').Append(prop.Value);
}
}

_path = path.Append(paramaters).ToString();
}

return _path;
}
}

}

public interface IViewNavigator
{
Task NavigateAsync(IViewTarget viewTarget);
Task GoBackAsync();
}


public interface INavigableView : IView, IAsyncInitializable<ViewIdentifier>
{
ViewIdentifier Identifier { get; }
}
16 changes: 16 additions & 0 deletions src/Blauhaus.MVVM.Abstractions/Navigator/IViewTarget.cs
Original file line number Diff line number Diff line change
@@ -0,0 +1,16 @@
using Blauhaus.Common.ValueObjects.Navigation;
using System.Collections;
using System.Collections.Generic;
using System.Linq;
using System.Text;

namespace Blauhaus.MVVM.Abstractions.Navigator;


public interface IViewTarget : IReadOnlyList<ViewIdentifier>
{
string Path { get; }
ViewIdentifier View { get; }
}


10 changes: 10 additions & 0 deletions src/Blauhaus.MVVM.Abstractions/Views/INavigableView.cs
Original file line number Diff line number Diff line change
@@ -0,0 +1,10 @@
using Blauhaus.Common.Abstractions;
using Blauhaus.Common.ValueObjects.Navigation;
using Blauhaus.MVVM.Abstractions.Navigator;

namespace Blauhaus.MVVM.Abstractions.Views;

public interface INavigableView : IView, IAsyncInitializable<IViewTarget>
{
IViewTarget ViewTarget { get; }
}
4 changes: 2 additions & 2 deletions src/Blauhaus.MVVM.Maui/Applications/BaseMauiApplication.cs
Original file line number Diff line number Diff line change
Expand Up @@ -18,7 +18,7 @@ public abstract class BaseMauiApplication<TApplication> : Application

protected readonly IServiceLocator ServiceLocator;
protected readonly IAnalyticsLogger<TApplication> Logger;
protected readonly IViewNavigator _viewNavigator;
protected readonly IViewNavigator ViewNavigator;

protected BaseMauiApplication(
IServiceLocator serviceLocator,
Expand All @@ -27,7 +27,7 @@ protected BaseMauiApplication(
{
ServiceLocator = serviceLocator;
Logger = logger;
_viewNavigator = viewNavigator;
ViewNavigator = viewNavigator;
_appLifecycleService = ServiceLocator.ResolveAs<AppLifecycleService>(typeof(IAppLifecycleService));
MainPage = new ContentPage();
}
Expand Down
Original file line number Diff line number Diff line change
@@ -1,5 +1,6 @@
using Blauhaus.Analytics.Abstractions;
using Blauhaus.Common.ValueObjects.Navigation;
using Blauhaus.MVVM.Abstractions.Navigator;
using Blauhaus.Responses;

namespace Blauhaus.MVVM.Maui.ViewNavigator.Containers;
Expand All @@ -14,15 +15,15 @@ public MauiNavigationPage(
{
_viewNavigator = viewNavigator;
}

public ViewIdentifier Identifier { get; private set; } = null!;

public Task InitializeAsync(ViewIdentifier value)
public Task InitializeAsync(IViewTarget value)
{
Identifier = value;
ViewTarget = value;
return Task.CompletedTask;
}

public IViewTarget ViewTarget { get; private set; } = null!;

protected override void OnAppearing()
{
base.OnAppearing();
Expand All @@ -39,4 +40,5 @@ Task IMauiViewContainer.PopAsync()
{
return PopAsync();
}

}
3 changes: 2 additions & 1 deletion src/Blauhaus.MVVM.Maui/ViewNavigator/IMauiViewFactory.cs
Original file line number Diff line number Diff line change
@@ -1,8 +1,9 @@
using Blauhaus.Common.ValueObjects.Navigation;
using Blauhaus.MVVM.Abstractions.Navigator;

namespace Blauhaus.MVVM.Maui.ViewNavigator;

public interface IMauiViewFactory
{
Task<Page> GetViewAsync(ViewIdentifier viewIdentifier);
Task<Page> GetViewAsync(IViewTarget viewTarget);
}
16 changes: 5 additions & 11 deletions src/Blauhaus.MVVM.Maui/ViewNavigator/MauiViewFactory.cs
Original file line number Diff line number Diff line change
Expand Up @@ -2,6 +2,7 @@
using Blauhaus.Common.ValueObjects.Navigation;
using Blauhaus.Ioc.Abstractions;
using Blauhaus.MVVM.Abstractions.Navigator;
using Blauhaus.MVVM.Abstractions.Views;

namespace Blauhaus.MVVM.Maui.ViewNavigator;

Expand All @@ -18,29 +19,22 @@ public MauiViewFactory(
_serviceLocator = serviceLocator;
}

public async Task<Page> GetViewAsync(ViewIdentifier viewIdentifier)
public async Task<Page> GetViewAsync(IViewTarget viewTarget)
{
var viewType = _viewRegister.GetViewType(viewIdentifier);
var viewType = _viewRegister.GetViewType(viewTarget.View);
object? constructedView = _serviceLocator.Resolve(viewType);
if (constructedView is not INavigableView navigableView)
{
throw new Exception($"{constructedView.GetType().Name} must implement {nameof(INavigableView)}");
}

await navigableView.InitializeAsync(viewTarget);

if (constructedView is not Page page)
{
throw new Exception($"{constructedView.GetType().Name} must implement {nameof(INavigableView)}");
}

if (constructedView is IAsyncInitializable<ViewIdentifier> initializeable)
{
await initializeable.InitializeAsync(viewIdentifier);
}
if (constructedView is IAsyncInitializable<string> stringInitializeable)
{
await stringInitializeable.InitializeAsync(viewIdentifier.Serialize());
}

return page;
}
}
2 changes: 1 addition & 1 deletion src/Blauhaus.MVVM.Maui/ViewNavigator/MauiViewNavigator.cs
Original file line number Diff line number Diff line change
Expand Up @@ -31,7 +31,7 @@ public async Task NavigateAsync(IViewTarget viewTarget)
{
if (viewTarget.Count == 1)
{
var page = await _viewFactory.GetViewAsync(viewTarget[0]);
var page = await _viewFactory.GetViewAsync(viewTarget);
if (_activeContainer is null)
{
_logger.LogDebug("There is no active navigation container - setting application main page to {PageType} with identifier {ViewIdentifier}", page.GetType().Name, viewTarget[0].Serialize());
Expand Down
16 changes: 9 additions & 7 deletions src/Blauhaus.MVVM.Maui/Views/BaseMauiContentPage.cs
Original file line number Diff line number Diff line change
Expand Up @@ -12,9 +12,6 @@ namespace Blauhaus.MVVM.Maui.Views;
public abstract class BaseMauiContentPage<TViewModel> : ContentPage, IView<TViewModel>, INavigableView
where TViewModel : IViewModel
{
public TViewModel ViewModel { get; }


protected BaseMauiContentPage(TViewModel viewModel)
{
ViewModel = viewModel;
Expand All @@ -23,16 +20,21 @@ protected BaseMauiContentPage(TViewModel viewModel)
SubscribeToHotReload();
On<iOS>().SetUseSafeArea(true);
}

public TViewModel ViewModel { get; }
public IViewTarget ViewTarget { get; private set; } = null!;

public ViewIdentifier Identifier { get; private set; } = null!;
public Task InitializeAsync(IViewTarget viewTarget)
{
ViewTarget = viewTarget;
return OnInitializedAsync(viewTarget);
}

public Task InitializeAsync(ViewIdentifier identifier)
protected virtual Task OnInitializedAsync(IViewTarget viewIdentifier)
{
Identifier = identifier;
return Task.CompletedTask;
}


protected override void OnAppearing()
{
base.OnAppearing();
Expand Down
Original file line number Diff line number Diff line change
@@ -1,5 +1,6 @@
using Blauhaus.Common.ValueObjects.Navigation;
using Blauhaus.MVVM.Abstractions.Navigator;
using Blauhaus.MVVM.Navigation;
using Blauhaus.TestHelpers.MockBuilders;

namespace Blauhaus.MVVM.TestHelpers.MockBuilders.Services;
Expand Down
Original file line number Diff line number Diff line change
@@ -1,6 +1,7 @@
using Blauhaus.Common.Abstractions.Extensions;
using Blauhaus.Common.ValueObjects.Navigation;
using Blauhaus.MVVM.Abstractions.Navigator;
using Blauhaus.MVVM.Navigation;

namespace Blauhaus.MVVM.Tests.Tests.NavigatorTests.ViewTargetTests;

Expand Down
Original file line number Diff line number Diff line change
@@ -1,8 +1,9 @@
using System.Threading.Tasks;
using Blauhaus.Common.ValueObjects.Navigation;
using Blauhaus.MVVM.Abstractions.Navigator;
using Blauhaus.MVVM.Navigation;

namespace Blauhaus.MVVM.Abstractions.Extensions;
namespace Blauhaus.MVVM.Extensions;

public static class ViewNavigatorExtensions
{
Expand Down
54 changes: 54 additions & 0 deletions src/Blauhaus.MVVM/Navigation/ViewTarget.cs
Original file line number Diff line number Diff line change
@@ -0,0 +1,54 @@
using System.Collections;
using Blauhaus.Common.ValueObjects.Navigation;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using Blauhaus.MVVM.Abstractions.Navigator;

namespace Blauhaus.MVVM.Navigation;


public class ViewTarget : IViewTarget
{
private readonly IReadOnlyList<ViewIdentifier> _viewIdentifiers;
private string? _path;

public ViewTarget(IReadOnlyList<ViewIdentifier> viewIdentifiers, ViewIdentifier? view = null)
{
_viewIdentifiers = viewIdentifiers;
View = view ?? viewIdentifiers.Last();
}

public static ViewTarget Create (params ViewIdentifier[] viewIdentifiers) => new(viewIdentifiers);

public IEnumerator<ViewIdentifier> GetEnumerator() => _viewIdentifiers.GetEnumerator();
IEnumerator IEnumerable.GetEnumerator() => GetEnumerator();
public int Count => _viewIdentifiers.Count;
public ViewIdentifier this[int index] => _viewIdentifiers[index];
public ViewIdentifier View { get; }
public string Path
{
get
{
if (_path == null)
{
var path = new StringBuilder();
var paramaters = new StringBuilder();
foreach (var viewIdentifier in _viewIdentifiers)
{
path.Append('/').Append(viewIdentifier.Name);

foreach (var prop in viewIdentifier.Properties)
{
paramaters.Append(paramaters.Length == 0 ? '?' : '&');
paramaters.Append(prop.Key).Append('=').Append(prop.Value);
}
}

_path = path.Append(paramaters).ToString();
}

return _path;
}
}
}

0 comments on commit 655dfa2

Please sign in to comment.