fix: stabilize route startup render
This commit is contained in:
@@ -17,7 +17,7 @@
|
||||
<div class="section-head">
|
||||
<h2>User Management</h2>
|
||||
</div>
|
||||
@if (Workspace.State.IsAdminDataLoading)
|
||||
@if (IsAdminDataLoading)
|
||||
{
|
||||
<p class="empty">Loading users...</p>
|
||||
}
|
||||
@@ -65,4 +65,6 @@
|
||||
|
||||
@code {
|
||||
[Parameter, EditorRequired] public WorkspacePageContext Workspace { get; set; } = null!;
|
||||
|
||||
private bool IsAdminDataLoading => !Workspace.HasSessionInitialized || Workspace.State.IsAdminDataLoading;
|
||||
}
|
||||
|
||||
@@ -3,7 +3,7 @@
|
||||
|
||||
<main class="play-screen @(Workspace.State.MobilePanel == "log" ? "mobile-log" : "mobile-character")">
|
||||
<CharacterPanel
|
||||
IsCampaignDataLoading="Workspace.State.IsCampaignDataLoading"
|
||||
IsCampaignDataLoading="@IsCampaignDataLoading"
|
||||
SelectedCampaign="Workspace.State.PlaySelectedCampaign"
|
||||
SelectedCharacterId="Workspace.State.PlaySelectedCharacterId"
|
||||
SelectedCharacter="Workspace.State.PlaySelectedCharacter"
|
||||
@@ -29,7 +29,7 @@
|
||||
RollRequested="Workspace.Play.RollSkillAsync"/>
|
||||
|
||||
<CampaignLogPanel
|
||||
IsCampaignDataLoading="Workspace.State.IsCampaignDataLoading"
|
||||
IsCampaignDataLoading="@IsCampaignDataLoading"
|
||||
CampaignLog="Workspace.State.PlayVisibleCampaignLog"
|
||||
ExpandedRollId="Workspace.State.ExpandedCampaignLogRollId"
|
||||
FreshRollId="Workspace.State.FreshCampaignLogRollId"
|
||||
@@ -72,4 +72,6 @@
|
||||
|
||||
@code {
|
||||
[Parameter, EditorRequired] public WorkspacePageContext Workspace { get; set; } = null!;
|
||||
|
||||
private bool IsCampaignDataLoading => !Workspace.HasSessionInitialized || Workspace.State.IsCampaignDataLoading;
|
||||
}
|
||||
|
||||
@@ -14,30 +14,19 @@
|
||||
}
|
||||
|
||||
<div class="workspace-shell">
|
||||
@if (HasSessionInitialized)
|
||||
{
|
||||
<AppHeader
|
||||
User="State.User"
|
||||
ShowCampaign="@ShowCampaignInHeader"
|
||||
CampaignName="@State.SelectedCampaignName"
|
||||
ShowConnectionState="@ShowConnectionStateInHeader"
|
||||
ConnectionStateLabel="@State.ConnectionStateLabel"
|
||||
ConnectionStateCssClass="@State.ConnectionStateCssClass"
|
||||
IsMenuOpen="State.IsScreenMenuOpen"
|
||||
MenuButtonId="workspace-screen-menu-button"
|
||||
MenuId="workspace-screen-menu"
|
||||
MenuItems="HeaderMenuItems"
|
||||
ToggleMenuRequested="ToggleScreenMenu"
|
||||
LogoutRequested="Session.LogoutAsync"/>
|
||||
}
|
||||
else
|
||||
{
|
||||
<main class="management-screen">
|
||||
<section class="card">
|
||||
<p class="empty">Loading workspace...</p>
|
||||
</section>
|
||||
</main>
|
||||
}
|
||||
<AppHeader
|
||||
User="State.User"
|
||||
ShowCampaign="@ShowCampaignInHeader"
|
||||
CampaignName="@State.SelectedCampaignName"
|
||||
ShowConnectionState="@ShowConnectionStateInHeader"
|
||||
ConnectionStateLabel="@State.ConnectionStateLabel"
|
||||
ConnectionStateCssClass="@State.ConnectionStateCssClass"
|
||||
IsMenuOpen="State.IsScreenMenuOpen"
|
||||
MenuButtonId="workspace-screen-menu-button"
|
||||
MenuId="workspace-screen-menu"
|
||||
MenuItems="HeaderMenuItems"
|
||||
ToggleMenuRequested="ToggleScreenMenu"
|
||||
LogoutRequested="Session.LogoutAsync"/>
|
||||
|
||||
@if (ChildContent is not null)
|
||||
{
|
||||
|
||||
@@ -12,6 +12,10 @@ public partial class Workspace : IAsyncDisposable
|
||||
protected override void OnParametersSet()
|
||||
{
|
||||
State.IsScreenMenuOpen = false;
|
||||
if (PreviousRoute.HasValue && PreviousRoute.Value != Route && HasSessionInitialized)
|
||||
_ = InvokeAsync(HandleRouteChangedAsync);
|
||||
|
||||
PreviousRoute = Route;
|
||||
}
|
||||
|
||||
[JSInvokable]
|
||||
@@ -114,6 +118,24 @@ public partial class Workspace : IAsyncDisposable
|
||||
await RequestRefreshAsync();
|
||||
}
|
||||
|
||||
private async Task HandleRouteChangedAsync()
|
||||
{
|
||||
if (!HasSessionInitialized)
|
||||
return;
|
||||
|
||||
if (IsAdminRoute)
|
||||
{
|
||||
await Live.SyncStateEventsAsync();
|
||||
await EnsureAdminUsersLoadedAsync();
|
||||
await RequestRefreshAsync();
|
||||
return;
|
||||
}
|
||||
|
||||
await Scope.RefreshCampaignScopeAsync();
|
||||
await Live.SyncStateEventsAsync();
|
||||
await RequestRefreshAsync();
|
||||
}
|
||||
|
||||
private static bool IsStaticRenderInteropException(InvalidOperationException exception)
|
||||
{
|
||||
return exception.Message.Contains("statically rendered", StringComparison.OrdinalIgnoreCase);
|
||||
@@ -220,4 +242,5 @@ public partial class Workspace : IAsyncDisposable
|
||||
private WorkspaceCampaignScopeCoordinator? m_Scope;
|
||||
private WorkspaceSessionCoordinator? m_Session;
|
||||
private Task? InitializationTask { get; set; }
|
||||
}
|
||||
private WorkspaceRoute? PreviousRoute { get; set; }
|
||||
}
|
||||
|
||||
@@ -1,9 +1,6 @@
|
||||
@using Microsoft.AspNetCore.Components
|
||||
|
||||
@if (Workspace.HasSessionInitialized)
|
||||
{
|
||||
@ChildContent(Workspace)
|
||||
}
|
||||
@ChildContent(Workspace)
|
||||
|
||||
@code {
|
||||
protected override async Task OnAfterRenderAsync(bool firstRender)
|
||||
|
||||
Reference in New Issue
Block a user