2e23a032d3
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>
42 lines
1.5 KiB
Plaintext
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;
|
|
}
|