Merge branch 'public-prerender-hang' into dev
This commit is contained in:
@@ -77,23 +77,21 @@
|
|||||||
private bool _mobileMenuOpen;
|
private bool _mobileMenuOpen;
|
||||||
private Guid _viewportSubscriptionId;
|
private Guid _viewportSubscriptionId;
|
||||||
|
|
||||||
protected override async Task OnInitializedAsync()
|
|
||||||
{
|
|
||||||
// During SSR prerender the dark-mode state is already seeded by the server-side
|
|
||||||
// DarkModeService (via IHttpContextAccessor + DarkModeSettings + PersistentComponentState).
|
|
||||||
// Invoking the EventCallback here during prerender triggers a re-render cycle on the
|
|
||||||
// SSR renderer that never completes, hanging the page. Guard to interactive-only so
|
|
||||||
// the cookie sync only runs when the component is actually mounted in the browser.
|
|
||||||
if (!RendererInfo.IsInteractive) return;
|
|
||||||
|
|
||||||
IsDarkMode = DarkModeCookieService.GetDarkModeAsync();
|
|
||||||
await IsDarkModeChanged.InvokeAsync(IsDarkMode);
|
|
||||||
}
|
|
||||||
|
|
||||||
protected override async Task OnAfterRenderAsync(bool firstRender)
|
protected override async Task OnAfterRenderAsync(bool firstRender)
|
||||||
{
|
{
|
||||||
if (firstRender)
|
if (firstRender)
|
||||||
{
|
{
|
||||||
|
// Runs here (not OnInitializedAsync) because OnAfterRenderAsync(firstRender)
|
||||||
|
// is guaranteed not to execute during any SSR prerender pass. During prerender
|
||||||
|
// (now interactive across all of Routes), awaiting IsDarkModeChanged.InvokeAsync
|
||||||
|
// triggers a parent re-render cycle that cannot complete on the prerender renderer
|
||||||
|
// and hangs the response. Server-side DarkModeService has already seeded
|
||||||
|
// DarkModeSettings via PersistentComponentState, so the prerender paint is
|
||||||
|
// already correct; this call reads that persisted value and propagates it to the
|
||||||
|
// parent so the menu's IsDarkMode parameter stays consistent with DarkModeSettings.
|
||||||
|
IsDarkMode = DarkModeCookieService.GetDarkMode();
|
||||||
|
await IsDarkModeChanged.InvokeAsync(IsDarkMode);
|
||||||
|
|
||||||
_viewportSubscriptionId = Guid.NewGuid();
|
_viewportSubscriptionId = Guid.NewGuid();
|
||||||
await BrowserViewportService.SubscribeAsync(
|
await BrowserViewportService.SubscribeAsync(
|
||||||
_viewportSubscriptionId,
|
_viewportSubscriptionId,
|
||||||
|
|||||||
@@ -7,12 +7,9 @@ public class DarkModeCookieService(DarkModeSettings darkModeSetting, IJSRuntime
|
|||||||
{
|
{
|
||||||
private const int EXPIRY_DAYS = 365;
|
private const int EXPIRY_DAYS = 365;
|
||||||
|
|
||||||
public bool GetDarkModeAsync()
|
public bool GetDarkMode()
|
||||||
{
|
{
|
||||||
return darkModeSetting.IsDarkMode;
|
return darkModeSetting.IsDarkMode;
|
||||||
// var value = await js.InvokeAsync<string?>("eval",
|
|
||||||
// $"document.cookie.split('; ').find(c => c.startsWith('{COOKIE_NAME}='))?.split('=')[1]");
|
|
||||||
// return value == "true";
|
|
||||||
}
|
}
|
||||||
|
|
||||||
public async ValueTask SetDarkModeAsync(bool isDarkMode)
|
public async ValueTask SetDarkModeAsync(bool isDarkMode)
|
||||||
|
|||||||
Reference in New Issue
Block a user