@inherits LayoutComponentBase @inject AuthenticationStateProvider AuthStateProvider @inject NavigationManager Nav @inject IUserNotificationService UserNotificationService @inject IJSRuntime JSRuntime @implements IDisposable @using System.Security.Claims @Body @code { private bool _drawerOpen = true; private bool _isDarkMode; protected override void OnInitialized() { UserNotificationService.OnUserDeleted += HandleUserDeleted; } protected override async Task OnAfterRenderAsync(bool firstRender) { if (firstRender) { try { var saved = await JSRuntime.InvokeAsync("localStorage.getItem", "darkMode"); if (!string.IsNullOrEmpty(saved)) { _isDarkMode = bool.Parse(saved); StateHasChanged(); } } catch { // Ignored during prerendering/SSR } } } private async Task ToggleDarkMode() { _isDarkMode = !_isDarkMode; await JSRuntime.InvokeVoidAsync("localStorage.setItem", "darkMode", _isDarkMode.ToString().ToLower()); } private async Task HandleUserDeleted(int deletedUserId) { var state = await AuthStateProvider.GetAuthenticationStateAsync(); var idClaim = state.User.FindFirst(ClaimTypes.NameIdentifier)?.Value; if (idClaim != null && int.TryParse(idClaim, out var myId) && myId == deletedUserId) { await InvokeAsync(() => Nav.NavigateTo("/auth/logout", forceLoad: true)); } } public void Dispose() { UserNotificationService.OnUserDeleted -= HandleUserDeleted; } private readonly MudTheme _theme = new() { PaletteLight = new PaletteLight { Primary = "#1E293B", PrimaryDarken = "#0F172A", PrimaryLighten = "#475569", Secondary = "#0EA5E9", SecondaryDarken = "#0284C7", AppbarBackground = "#0F172A", Background = "#F8FAFC", DrawerBackground = "#0F172A", DrawerText = "#94A3B8", DrawerIcon = "#94A3B8", Surface = "#FFFFFF", TextPrimary = "#0F172A", TextSecondary = "#475569", }, PaletteDark = new PaletteDark { Primary = "#0EA5E9", PrimaryDarken = "#0284C7", PrimaryLighten = "#38BDF8", Secondary = "#0EA5E9", SecondaryDarken = "#0284C7", AppbarBackground = "#0F172A", AppbarText = "#F8FAFC", Background = "#0B0F19", DrawerBackground = "#0F172A", DrawerText = "#94A3B8", DrawerIcon = "#94A3B8", Surface = "#1E293B", TextPrimary = "#F8FAFC", TextSecondary = "#94A3B8", ActionDefault = "#94A3B8", Divider = "rgba(255, 255, 255, 0.08)", } }; private void ToggleDrawer() => _drawerOpen = !_drawerOpen; }