- NavigationExtensions: centralized NavigateToLogin/NavigateToLoginForce helpers that include returnUrl query parameter - LoginService: SemaphoreSlim guard on Reauthenticate to prevent concurrent refresh races (timer + API handler) - MainLayout: expiry-driven keepalive loop — parses JWT, schedules reauthentication 2 min before token expiry; starts on login, stops on logout/force-logout - Login page: reads returnUrl from query via SupplyParameterFromQuery, navigates there (or /) on success - All NavigateTo(/login) call sites updated to use returnUrl: App, MainLayout, NavMenu, Jobs, Settings, AdminUsers - Cosplayers: fix eternal spinner when logged out (set isLoading=false), update message to 'No media available' with hint about public content
25 lines
915 B
C#
25 lines
915 B
C#
using Microsoft.AspNetCore.Components;
|
|
|
|
namespace MilkStream.Client;
|
|
|
|
/// <summary>
|
|
/// Extension methods for <see cref="NavigationManager"/> to support login redirects with return URLs.
|
|
/// </summary>
|
|
public static class NavigationExtensions {
|
|
/// <summary>
|
|
/// Navigates to the login page with the current URL as a return URL query parameter.
|
|
/// </summary>
|
|
public static void NavigateToLogin(this NavigationManager nav) {
|
|
var returnUrl = Uri.EscapeDataString(nav.Uri);
|
|
nav.NavigateTo($"/login?returnUrl={returnUrl}");
|
|
}
|
|
|
|
/// <summary>
|
|
/// Navigates to the login page with the current URL as a return URL query parameter, forcing a full page reload.
|
|
/// </summary>
|
|
public static void NavigateToLoginForce(this NavigationManager nav) {
|
|
var returnUrl = Uri.EscapeDataString(nav.Uri);
|
|
nav.NavigateTo($"/login?returnUrl={returnUrl}", true);
|
|
}
|
|
}
|