Files
MilkyShots/MilkStream.Client/NavigationExtensions.cs
T
REDCODE dc5ac98c68 feat: return-url login redirects + keepalive + cosplayers fix
- 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
2026-07-10 15:16:59 +02:00

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