using UtopiaCanteenSystem.ViewModels; namespace UtopiaCanteenSystem.Services; /// /// Holds the current view model and notifies when it changes for binding in MainWindow. /// 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 _adminLoginVm; private readonly Func _scannerVm; private readonly Func _dashboardVm; private readonly Func _adminSettingsAuthVm; private readonly Func _settingsVm; private readonly Func _mealSchedulesVm; public NavigationService( AppSession session, Func adminLoginVm, Func scannerVm, Func dashboardVm, Func adminSettingsAuthVm, Func settingsVm, Func 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(); } }