Utopia-Canteen-System/Services/NavigationService.cs

127 lines
3.2 KiB
C#

using UtopiaCanteenSystem.ViewModels;
namespace UtopiaCanteenSystem.Services;
/// <summary>
/// Holds the current view model and notifies when it changes for binding in MainWindow.
/// </summary>
public class NavigationService : INavigationService
{
private object? _currentViewModel;
private DateTime? _dashboardSessionStartUtc;
private readonly AppSession _session;
public object? CurrentViewModel
{
get => _currentViewModel;
private set
{
if (_currentViewModel == value) return;
_currentViewModel = value;
CurrentViewModelChanged?.Invoke(this, EventArgs.Empty);
}
}
public event EventHandler? CurrentViewModelChanged;
private readonly Func<AdminLoginViewModel> _adminLoginVm;
private readonly Func<ScannerViewModel> _scannerVm;
private readonly Func<MainDashboardViewModel> _dashboardVm;
private readonly Func<AdminSettingsAuthViewModel> _adminSettingsAuthVm;
private readonly Func<SettingsViewModel> _settingsVm;
public NavigationService(
AppSession session,
Func<AdminLoginViewModel> adminLoginVm,
Func<ScannerViewModel> scannerVm,
Func<MainDashboardViewModel> dashboardVm,
Func<AdminSettingsAuthViewModel> adminSettingsAuthVm,
Func<SettingsViewModel> settingsVm)
{
_session = session;
_adminLoginVm = adminLoginVm;
_scannerVm = scannerVm;
_dashboardVm = dashboardVm;
_adminSettingsAuthVm = adminSettingsAuthVm;
_settingsVm = settingsVm;
}
public void NavigateToAdminLogin()
{
CurrentViewModel = _adminLoginVm();
}
public void NavigateToScanner()
{
if (!_session.IsAdminAuthenticated)
{
NavigateToAdminLogin();
return;
}
CurrentViewModel = _scannerVm();
}
public void NavigateToDashboard()
{
if (!_session.IsAdminAuthenticated)
{
NavigateToAdminLogin();
return;
}
CurrentViewModel = _dashboardVm();
}
public void NavigateToSettings()
{
if (!_session.IsAdminAuthenticated)
{
NavigateToAdminLogin();
return;
}
CurrentViewModel = _settingsVm();
}
public void NavigateToAdminSettingsAuth()
{
if (!_session.IsAdminAuthenticated)
{
NavigateToAdminLogin();
return;
}
CurrentViewModel = _adminSettingsAuthVm();
}
public void StartDashboardSession()
{
_dashboardSessionStartUtc = DateTime.UtcNow;
}
public bool IsDashboardSessionExpired(TimeSpan timeout)
{
if (!_dashboardSessionStartUtc.HasValue)
return true;
return DateTime.UtcNow - _dashboardSessionStartUtc.Value >= timeout;
}
public TimeSpan GetDashboardSessionElapsed()
{
if (!_dashboardSessionStartUtc.HasValue)
return TimeSpan.MaxValue;
return DateTime.UtcNow - _dashboardSessionStartUtc.Value;
}
public void NavigateBackFromSettings(TimeSpan timeout)
{
if (IsDashboardSessionExpired(timeout))
NavigateToScanner();
else
NavigateToDashboard();
}
}