@page "/login" @inject AuthService Auth @inject NetworkStatusService NetworkStatus @inject NavigationManager Navigation @implements IDisposable Login - Chrono CCG

Chrono API Account

@if (!NetworkStatus.IsOnline) { } else if (Auth.IsLoggedIn) {
Logged In

You are signed in as @Auth.CurrentUsername. Your private card notes and decks are active.

} else { @if (!string.IsNullOrEmpty(errorMessage)) { } @if (!string.IsNullOrEmpty(successMessage)) { }
}
@code { private string username = ""; private string password = ""; private bool isLoading; private string? errorMessage; private string? successMessage; protected override async Task OnInitializedAsync() { NetworkStatus.StatusChanged += OnStatusChanged; Auth.AuthStateChanged += OnAuthStateChanged; await Auth.InitializeAsync(); } private void OnStatusChanged(bool isOnline) { InvokeAsync(StateHasChanged); } private void OnAuthStateChanged() { InvokeAsync(StateHasChanged); } private async Task HandleLogin() { errorMessage = null; successMessage = null; if (string.IsNullOrWhiteSpace(username) || string.IsNullOrWhiteSpace(password)) { errorMessage = "Please enter both username and password."; return; } isLoading = true; try { var result = await Auth.LoginAsync(username.Trim(), password); if (result.Success) { successMessage = result.Message; Navigation.NavigateTo(""); } else { errorMessage = result.Message; } } finally { isLoading = false; } } private async Task HandleLogout() { await Auth.LogoutAsync(); } public void Dispose() { NetworkStatus.StatusChanged -= OnStatusChanged; Auth.AuthStateChanged -= OnAuthStateChanged; } }