using System.Collections.Generic;
using CommunityToolkit.Mvvm.Messaging;
using StrixMusic.Shells.Groove.Messages.Navigation;
using StrixMusic.Shells.Groove.Messages.Navigation.Pages;
using StrixMusic.Shells.Groove.Messages.Navigation.Pages.Abstract;
namespace StrixMusic.Shells.Groove.Helper
{
///
/// A class for tracking navigation history.
///
public class NavigationTracker
{
private Stack? _navigationStack;
///
/// Initializes a new instance of the class.
///
public void Initialize()
{
_navigationStack = new Stack();
WeakReferenceMessenger.Default.Register(this,
(s, e) => NavigateBackwards());
WeakReferenceMessenger.Default.Register(this,
(s, e) => RecordNavigation(e));
WeakReferenceMessenger.Default.Register(this,
(s, e) => RecordNavigation(e));
WeakReferenceMessenger.Default.Register(this,
(s, e) => RecordNavigation(e));
WeakReferenceMessenger.Default.Register(this,
(s, e) => RecordNavigation(e));
WeakReferenceMessenger.Default.Register(this,
(s, e) => RecordNavigation(e));
}
///
/// Gets the singleton instance of this class.
///
public static NavigationTracker Instance { get; } = new NavigationTracker();
///
/// Gets whether or not the navigation can go backwards.
///
public bool CanGoBack => _navigationStack != null ? _navigationStack.Count > 1 : false;
///
/// Navigates backwards.
///
public void NavigateBackwards()
{
if (!CanGoBack || _navigationStack == null)
return;
_navigationStack.Pop();
PageNavigationRequestMessage previous = _navigationStack.Peek();
previous.RecordNavigation = false;
switch (previous)
{
case AlbumViewNavigationRequestMessage albumViewNavigationRequest:
WeakReferenceMessenger.Default.Send(albumViewNavigationRequest);
break;
case ArtistViewNavigationRequestMessage artistViewNavigationRequest:
WeakReferenceMessenger.Default.Send(artistViewNavigationRequest);
break;
case HomeViewNavigationRequestMessage homeViewNavigationRequest:
WeakReferenceMessenger.Default.Send(homeViewNavigationRequest);
break;
case PlaylistsViewNavigationRequestMessage playlistViewNavigationRequest:
WeakReferenceMessenger.Default.Send(playlistViewNavigationRequest);
break;
}
}
private void RecordNavigation(T viewModel)
where T : PageNavigationRequestMessage
{
if (_navigationStack == null)
return;
if (viewModel.RecordNavigation)
_navigationStack.Push(viewModel);
}
}
}