Utopia-Canteen-System/ViewModels/AdminLoginViewModel.cs

74 lines
1.9 KiB
C#

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;
}
}
}