fix: scope startup by route

This commit is contained in:
2026-05-04 22:11:20 +02:00
parent 73dc4a9cd4
commit 12612e05fa
7 changed files with 93 additions and 28 deletions

View File

@@ -14,19 +14,31 @@
}
<div class="workspace-shell">
<AppHeader
User="State.User"
ShowCampaign="true"
CampaignName="@State.SelectedCampaignName"
ShowConnectionState="true"
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 (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>
}
@if (ChildContent is not null)
{
@ChildContent(PageContext)

View File

@@ -137,6 +137,8 @@ public partial class Workspace : IAsyncDisposable
private bool IsCampaignsRoute => Route == WorkspaceRoute.Campaigns;
private bool IsAdminRoute => Route == WorkspaceRoute.Admin;
private string AppCssClass => IsPlayRoute ? "rr-app app-play" : "rr-app";
private bool ShowCampaignInHeader => !IsAdminRoute;
private bool ShowConnectionStateInHeader => IsPlayRoute;
private WorkspacePageContext PageContext => new(State, Play, Campaigns, Admin, Scope, Session,
InitializeRouteAsync, HasSessionInitialized, RequestRefreshAsync, AdminDatabaseDownloadUrl, HeaderMenuItems,

View File

@@ -87,9 +87,22 @@ public sealed class WorkspaceCampaignScopeCoordinator(
try
{
await RefreshCampaignRosterAsync();
await refreshSelectedCharacterSheetAsync();
await refreshCampaignLogAsync(null);
resetCampaignStateTracking();
if (isPlayRoute())
{
await refreshSelectedCharacterSheetAsync();
await refreshCampaignLogAsync(null);
resetCampaignStateTracking();
}
else
{
state.SelectedCharacterSkills = [];
state.SelectedCharacterSkillGroups = [];
state.CampaignLog = [];
state.ConnectionState = "offline";
state.CurrentCampaignState = null;
state.CampaignLogCursor = null;
resetCampaignLogDetailState();
}
}
catch (ApiRequestException ex) when (ex.StatusCode == 401)
{
@@ -136,4 +149,4 @@ public sealed class WorkspaceCampaignScopeCoordinator(
private const string CampaignSessionKey = "campaign";
private const string MobilePanelSessionKey = "play-panel";
}
}

View File

@@ -82,7 +82,7 @@ public sealed class WorkspaceLiveStateController(
public async Task SyncStateEventsAsync()
{
if (state.User is null || !state.SelectedCampaignId.HasValue || isAdminRoute())
if (state.User is null || !state.SelectedCampaignId.HasValue || isAdminRoute() || !isPlayRoute())
{
await StopStateEventsAsync();
state.ConnectionState = "offline";
@@ -109,4 +109,4 @@ public sealed class WorkspaceLiveStateController(
return snapshot.CharacterVersions.FirstOrDefault(version => version.CharacterId == characterId.Value)
?.Version ?? 0;
}
}
}

View File

@@ -31,12 +31,14 @@ public sealed class WorkspaceSessionCoordinator(
state.RollVisibility = NormalizeRollVisibility(storedRollVisibility);
Guid? preferredCampaignId = null;
var storedCampaignId = await js.InvokeAsync<string?>("rpgRollerApi.getSessionValue", CampaignSessionKey);
if (Guid.TryParse(storedCampaignId, out var parsedCampaignId))
preferredCampaignId = parsedCampaignId;
if (!isAdminRoute())
{
var storedCampaignId = await js.InvokeAsync<string?>("rpgRollerApi.getSessionValue", CampaignSessionKey);
if (Guid.TryParse(storedCampaignId, out var parsedCampaignId))
preferredCampaignId = parsedCampaignId;
}
await CheckHealthAsync();
await LoadRulesetsAsync();
var reloaded = await ReloadAuthenticatedSessionAsync(preferredCampaignId);
if (!reloaded)
@@ -160,14 +162,20 @@ public sealed class WorkspaceSessionCoordinator(
if (!await EnsureRouteAccessAsync())
return true;
if (isAdminRoute())
{
await stopStateEventsAsync();
state.ConnectionState = "offline";
await ensureAdminUsersLoadedAsync();
return true;
}
await LoadRulesetsAsync();
await reloadCampaignsAsync(preferredCampaignId ?? me.CurrentCampaignId);
await reloadCharacterCampaignOptionsAsync();
await refreshCampaignScopeAsync();
await syncStateEventsAsync();
if (isAdminRoute())
await ensureAdminUsersLoadedAsync();
return true;
}