@inherits LayoutComponentBase @implements IDisposable @using NexusReader.UI.Shared.Components.Molecules @using NexusReader.UI.Shared.Components.Atoms @using NexusReader.Application.Abstractions.Services @using NexusReader.UI.Shared.Services @if (!_isFullyLoaded) {
Synchronizing Secure Session...
}
@context.User.Identity?.Name?[0].ToString().ToUpper()
@if (_isMobileMenuOpen) {
}
@Body
@code { [Inject] private AuthenticationStateProvider AuthStateProvider { get; set; } = default!; [Inject] private IIdentityService IdentityService { get; set; } = default!; [Inject] private NavigationManager NavigationManager { get; set; } = default!; [Inject] private IThemeService ThemeService { get; set; } = default!; private bool _isSyncing = false; private bool _isMobileMenuOpen = false; private bool _isFullyLoaded = false; protected override async Task OnInitializedAsync() { ThemeService.OnThemeChanged += HandleThemeChanged; if (_isSyncing) return; var authState = await AuthStateProvider.GetAuthenticationStateAsync(); if (!authState.User.Identity?.IsAuthenticated ?? true) { _isSyncing = true; // Try to sync with server cookie await IdentityService.GetProfileAsync(); } } private void HandleThemeChanged(ThemeMode mode) { InvokeAsync(StateHasChanged); } protected override void OnAfterRender(bool firstRender) { if (firstRender) { _isFullyLoaded = true; StateHasChanged(); } } private void ToggleMobileMenu() { _isMobileMenuOpen = !_isMobileMenuOpen; } private void CloseMobileMenu() { _isMobileMenuOpen = false; } private async Task HandleLogout() { CloseMobileMenu(); await IdentityService.LogoutAsync(); NavigationManager.NavigateTo("/account/logout-form", true); } public void Dispose() { ThemeService.OnThemeChanged -= HandleThemeChanged; GC.SuppressFinalize(this); } }