Files
Nexus.Reader/src/NexusReader.UI.Shared/Routes.razor
T
mjasin 2e23a032d3 feat(ui): Hub Navigation, Profile Dashboard and Auth Stability Fixes (#31)
This PR implements the Hub Navigation system and the Profile Dashboard, while resolving critical session synchronization issues.

### Key Changes
- **Hub Navigation**: Introduced `MainHubLayout` with a premium glassmorphism sidebar, providing access to Dashboard, Library, Concepts Map, and Profile.
- **Profile Dashboard**: Implemented a high-fidelity Profile page (#27) with learning metrics, AI token usage tracking, and system rank visualization.
- **Stability Fixes**:
    - Resolved an infinite network loop on the `/profile` page by implementing request deduplication and in-memory caching in `IdentityService`.
    - Added environment-aware guards to prevent illegal JavaScript interop calls during server-side prerendering.
    - Implemented automatic session invalidation on `401 Unauthorized` responses to handle stale authentication states gracefully.
- **Reader Integration**: Added a "Return to Dashboard" option in the reader toolbar (#26).

Closes #26
Closes #27

Reviewed-on: #31
Co-authored-by: Marek Jasiński <jasins.marek@gmail.com>
Co-committed-by: Marek Jasiński <jasins.marek@gmail.com>
2026-05-10 17:36:35 +00:00

42 lines
1.5 KiB
Plaintext

<ErrorBoundary @ref="_errorBoundary">
<ChildContent>
<Router AppAssembly="@typeof(Routes).Assembly">
<Found Context="routeData">
<AuthorizeRouteView RouteData="@routeData" DefaultLayout="@typeof(MainHubLayout)">
<NotAuthorized>
<RedirectToLogin />
</NotAuthorized>
</AuthorizeRouteView>
<FocusOnNavigate RouteData="@routeData" Selector="h1" />
</Found>
<NotFound>
<NexusReader.UI.Shared.Pages.NotFound />
</NotFound>
</Router>
</ChildContent>
<ErrorContent Context="ex">
<div class="nexus-error-boundary">
<div class="error-card">
<div class="error-icon">
<NexusIcon Name="alert-triangle" Size="48" Color="#ff4444" />
</div>
<h3>Nexus System Error</h3>
<p>Wystąpił nieoczekiwany błąd podczas renderowania komponentu.</p>
<div class="error-details">
<code>@ex.Message</code>
</div>
<button class="retry-btn" @onclick="() => _errorBoundary?.Recover()">
<NexusIcon Name="refresh-cw" Size="16" />
Spróbuj ponownie
</button>
</div>
</div>
</ErrorContent>
</ErrorBoundary>
@code {
private ErrorBoundary? _errorBoundary;
}