@page "/login" @rendermode InteractiveWebAssembly @attribute [AllowAnonymous] @inject IAuthService AuthService @inject NavigationManager Nav @inject IJSRuntime JSRuntime Anmelden – Timetracker @* ── Logo / Header ── *@ Timetracker @* ── Tab Navigation ── *@ Anmelden Registrieren @if (_activeTab == 0) { @* ── Login Form ── *@ @if (_error != null) { @_error } @if (_loading) { } Anmelden } else { @* ── Register Form ── *@ @if (_error != null) { @_error } Ich akzeptiere die AGB. @if (_loading) { } Konto erstellen } @code { private int _activeTab = 0; private string? _error; private bool _loading; private string _honeypot = ""; private bool _acceptAgb; private readonly AuthModel _loginModel = new(); private readonly AuthModel _registerModel = new(); [SupplyParameterFromQuery(Name = "error")] public string? ErrorParam { get; set; } [SupplyParameterFromQuery(Name = "tab")] public string? TabParam { get; set; } protected override void OnParametersSet() { _error = ErrorParam switch { "invalid" => "Benutzername oder Passwort falsch.", not null => Uri.UnescapeDataString(ErrorParam), _ => null }; _activeTab = TabParam == "register" ? 1 : 0; } private void SetTab(int tab) { _activeTab = tab; _error = null; } private async Task HandleLogin() { _loading = true; _error = null; try { var user = await AuthService.LoginAsync(_loginModel.Username, _loginModel.Password); if (user != null) { Nav.NavigateTo("/", forceLoad: true); // forceLoad forces state update/re-render of the root app } else { _error = "Benutzername oder Passwort falsch."; } } catch (Exception ex) { _error = $"Login Fehler: {ex.Message}"; } finally { _loading = false; } } private async Task HandleRegister() { if (!_acceptAgb) { _error = "Du musst die AGB akzeptieren."; return; } _loading = true; _error = null; try { var (user, error) = await AuthService.RegisterAsync(_registerModel.Username, _registerModel.Password, _honeypot); if (user != null) { await JSRuntime.InvokeVoidAsync("localStorage.setItem", "showOnboarding", "true"); Nav.NavigateTo("/", forceLoad: true); } else { _error = error ?? "Registrierung fehlgeschlagen."; } } catch (Exception ex) { _error = $"Registrierungs Fehler: {ex.Message}"; } finally { _loading = false; } } private class AuthModel { public string Username { get; set; } = ""; public string Password { get; set; } = ""; } }