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