@inherits LayoutComponentBase @implements IDisposable @inject ThemeState ThemeState @inject IJSRuntime JS @inject AuthService AuthService @inject IAuthApiClient AuthApiClient @inject NavigationManager Navigation
@if (AuthService.IsAuthenticated) { @AuthService.UserName } About
@if (_checkingAuth) {
Wird geladen…
} else { @Body }
An unhandled error has occurred. Reload 🗙
@code { private bool _isInteractive; private bool _checkingAuth = true; protected override void OnInitialized() { ThemeState.OnChange += OnThemeChanged; AuthService.OnChange += OnAuthChanged; } protected override async Task OnAfterRenderAsync(bool firstRender) { if (firstRender) { _isInteractive = true; if (!AuthService.IsAuthenticated) { try { var username = await JS.InvokeAsync("authStorage.get", "auth_user"); var cookie = await JS.InvokeAsync("authStorage.get", "auth_cookie"); if (!string.IsNullOrEmpty(username) && !string.IsNullOrEmpty(cookie)) { var restored = await AuthApiClient.RestoreAsync(username, cookie); if (!restored) { await JS.InvokeVoidAsync("authStorage.clear"); Navigation.NavigateTo("/login", replace: true); return; } } else { Navigation.NavigateTo("/login", replace: true); return; } } catch { Navigation.NavigateTo("/login", replace: true); return; } } _checkingAuth = false; StateHasChanged(); } await ApplyDxDarkOverrideAsync(); } private async Task LogoutAsync() { try { await AuthApiClient.LogoutAsync(); await JS.InvokeVoidAsync("authStorage.clear"); } catch { // Fehler beim Abmelden ignorieren, trotzdem weiterleiten } Navigation.NavigateTo("/login", replace: true); } private void OnAuthChanged() { InvokeAsync(StateHasChanged); } private void OnThemeChanged() { InvokeAsync(async () => { StateHasChanged(); if (_isInteractive) await ApplyDxDarkOverrideAsync(); }); } private async Task ApplyDxDarkOverrideAsync() { if (!_isInteractive) return; try { bool needsOverride = ThemeState.IsDarkMode && !ThemeState.IsNativeDarkTheme; await JS.InvokeVoidAsync("setDxDarkOverride", needsOverride); } catch (JSException) { // JS-Funktion noch nicht verfügbar – kein Circuit-Crash } } private void ToggleTheme() { ThemeState.SetDarkMode(!ThemeState.IsDarkMode); } public void Dispose() { ThemeState.OnChange -= OnThemeChanged; AuthService.OnChange -= OnAuthChanged; } }