using CommunityToolkit.Mvvm.ComponentModel; using CommunityToolkit.Mvvm.Input; using UtopiaCanteenSystem.Services; namespace UtopiaCanteenSystem.ViewModels; public partial class AdminLoginViewModel : ObservableObject { private readonly IAuthService _authService; private readonly AppSession _session; private readonly INavigationService _navigation; [ObservableProperty] private string _username = string.Empty; // Updated from code-behind (PasswordBox doesn't support binding cleanly). [ObservableProperty] private string _password = string.Empty; [ObservableProperty] private string _errorMessage = string.Empty; [ObservableProperty] private bool _isBusy; public AdminLoginViewModel(IAuthService authService, AppSession session, INavigationService navigation) { _authService = authService; _session = session; _navigation = navigation; } [RelayCommand] private async Task AdminLoginAsync() { if (IsBusy) return; ErrorMessage = string.Empty; var user = Username?.Trim() ?? string.Empty; var pass = Password ?? string.Empty; // Requirement: after clicking login, clear fields. Username = string.Empty; Password = string.Empty; if (string.IsNullOrWhiteSpace(user) || string.IsNullOrEmpty(pass)) { ErrorMessage = "Username and password are required."; return; } IsBusy = true; try { var result = await _authService.LoginAsync(user, pass).ConfigureAwait(true); if (!result.Success) { ErrorMessage = "Invalid username or password."; return; } _session.SetAdminAuthenticated(user, result.EmployeeId); _navigation.NavigateToScanner(); } finally { IsBusy = false; } } }