138 lines
3.6 KiB
C#
138 lines
3.6 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<ScannerDashboardViewModel> _scannerVm;
|
|
private readonly Func<MainDashboardViewModel> _dashboardVm;
|
|
private readonly Func<AdminSettingsAuthViewModel> _adminSettingsAuthVm;
|
|
private readonly Func<SettingsViewModel> _settingsVm;
|
|
private readonly Func<MealSchedulesViewModel> _mealSchedulesVm;
|
|
|
|
public NavigationService(
|
|
AppSession session,
|
|
Func<AdminLoginViewModel> adminLoginVm,
|
|
Func<ScannerDashboardViewModel> scannerVm,
|
|
Func<MainDashboardViewModel> dashboardVm,
|
|
Func<AdminSettingsAuthViewModel> adminSettingsAuthVm,
|
|
Func<SettingsViewModel> settingsVm,
|
|
Func<MealSchedulesViewModel> mealSchedulesVm)
|
|
{
|
|
_session = session;
|
|
_adminLoginVm = adminLoginVm;
|
|
_scannerVm = scannerVm;
|
|
_dashboardVm = dashboardVm;
|
|
_adminSettingsAuthVm = adminSettingsAuthVm;
|
|
_settingsVm = settingsVm;
|
|
_mealSchedulesVm = mealSchedulesVm;
|
|
}
|
|
|
|
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 NavigateToMealSchedules()
|
|
{
|
|
if (!_session.IsAdminAuthenticated)
|
|
{
|
|
NavigateToAdminLogin();
|
|
return;
|
|
}
|
|
CurrentViewModel = _mealSchedulesVm();
|
|
}
|
|
|
|
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)
|
|
{
|
|
// Single-screen mode: always return to the scanner/dashboard screen.
|
|
NavigateToScanner();
|
|
}
|
|
}
|