Extract workspace campaign scope coordinator
This commit is contained in:
@@ -30,92 +30,15 @@ public partial class Workspace : IAsyncDisposable
|
||||
return Session.LoadKnownUsernamesAsync();
|
||||
}
|
||||
|
||||
private async Task ReloadCampaignsAsync(Guid? preferredCampaignId)
|
||||
{
|
||||
var campaigns = await WorkspaceQuery.GetCampaignsAsync();
|
||||
Campaigns = campaigns.OrderBy(c => c.Name, StringComparer.OrdinalIgnoreCase).ToList();
|
||||
private Task ReloadCampaignsAsync(Guid? preferredCampaignId) => Scope.ReloadCampaignsAsync(preferredCampaignId);
|
||||
|
||||
if (Campaigns.Count == 0)
|
||||
{
|
||||
SelectedCampaignId = null;
|
||||
await JS.InvokeVoidAsync("rpgRollerApi.setSessionValue", CampaignSessionKey, null);
|
||||
return;
|
||||
}
|
||||
private Task ReloadCharacterCampaignOptionsAsync() => Scope.ReloadCharacterCampaignOptionsAsync();
|
||||
|
||||
var campaignIds = Campaigns.Select(c => c.Id).ToHashSet();
|
||||
if (preferredCampaignId.HasValue && campaignIds.Contains(preferredCampaignId.Value))
|
||||
SelectedCampaignId = preferredCampaignId.Value;
|
||||
else if (!SelectedCampaignId.HasValue || !campaignIds.Contains(SelectedCampaignId.Value))
|
||||
SelectedCampaignId = Campaigns[0].Id;
|
||||
|
||||
await JS.InvokeVoidAsync("rpgRollerApi.setSessionValue", CampaignSessionKey, SelectedCampaignId?.ToString());
|
||||
}
|
||||
|
||||
private async Task ReloadCharacterCampaignOptionsAsync()
|
||||
{
|
||||
var campaignOptions = await WorkspaceQuery.GetCharacterCampaignOptionsAsync();
|
||||
CharacterCampaignOptions = campaignOptions.OrderBy(campaign => campaign.Name, StringComparer.OrdinalIgnoreCase).ToList();
|
||||
}
|
||||
|
||||
private async Task RefreshCampaignRosterAsync()
|
||||
{
|
||||
if (!SelectedCampaignId.HasValue)
|
||||
{
|
||||
SelectedCampaign = null;
|
||||
SelectedCharacterId = null;
|
||||
return;
|
||||
}
|
||||
|
||||
SelectedCampaign = await WorkspaceQuery.GetCampaignAsync(SelectedCampaignId.Value);
|
||||
SyncSelectedCharacter();
|
||||
|
||||
if (IsPlayScreen && PlaySelectedCharacterId.HasValue && SelectedCharacterId != PlaySelectedCharacterId)
|
||||
SelectedCharacterId = PlaySelectedCharacterId;
|
||||
|
||||
await EnsureSelectedCharacterActiveAsync();
|
||||
}
|
||||
private Task RefreshCampaignRosterAsync() => Scope.RefreshCampaignRosterAsync();
|
||||
|
||||
private Task RefreshCampaignLogAsync(Guid? afterRollId = null) => Play.RefreshCampaignLogAsync(afterRollId);
|
||||
|
||||
private async Task RefreshCampaignScopeAsync()
|
||||
{
|
||||
if (!SelectedCampaignId.HasValue)
|
||||
{
|
||||
SelectedCampaign = null;
|
||||
SelectedCharacterSkills = [];
|
||||
SelectedCharacterSkillGroups = [];
|
||||
CampaignLog = [];
|
||||
SelectedCharacterId = null;
|
||||
ConnectionState = "offline";
|
||||
CurrentCampaignState = null;
|
||||
CampaignLogCursor = null;
|
||||
ResetCampaignLogDetailState();
|
||||
return;
|
||||
}
|
||||
|
||||
IsCampaignDataLoading = true;
|
||||
try
|
||||
{
|
||||
await RefreshCampaignRosterAsync();
|
||||
await RefreshSelectedCharacterSheetAsync();
|
||||
await RefreshCampaignLogAsync();
|
||||
ResetCampaignStateTracking();
|
||||
}
|
||||
catch (ApiRequestException ex) when (ex.StatusCode == 401)
|
||||
{
|
||||
ClearAuthenticatedState();
|
||||
await StopStateEventsAsync();
|
||||
await LoggedOut.InvokeAsync("Session expired. Please log in again.");
|
||||
}
|
||||
catch (ApiRequestException ex)
|
||||
{
|
||||
SetStatus(ex.Message, true);
|
||||
}
|
||||
finally
|
||||
{
|
||||
IsCampaignDataLoading = false;
|
||||
}
|
||||
}
|
||||
private Task RefreshCampaignScopeAsync() => Scope.RefreshCampaignScopeAsync();
|
||||
|
||||
private Task LogoutAsync() => Session.LogoutAsync();
|
||||
|
||||
@@ -142,11 +65,7 @@ public partial class Workspace : IAsyncDisposable
|
||||
|
||||
private Task DeleteUserAsync(AdminUserSummary user) => Admin.DeleteUserAsync(user);
|
||||
|
||||
private async Task SetMobilePanelAsync(string panel)
|
||||
{
|
||||
MobilePanel = string.Equals(panel, "log", StringComparison.OrdinalIgnoreCase) ? "log" : "character";
|
||||
await JS.InvokeVoidAsync("rpgRollerApi.setSessionValue", MobilePanelSessionKey, MobilePanel);
|
||||
}
|
||||
private Task SetMobilePanelAsync(string panel) => Scope.SetMobilePanelAsync(panel);
|
||||
|
||||
private Task SetMobilePanelCharacterAsync()
|
||||
{
|
||||
@@ -253,27 +172,6 @@ public partial class Workspace : IAsyncDisposable
|
||||
return exception.Message.Contains("statically rendered", StringComparison.OrdinalIgnoreCase);
|
||||
}
|
||||
|
||||
private void SyncSelectedCharacter()
|
||||
{
|
||||
if (SelectedCampaign is null || SelectedCampaign.Characters.Length == 0)
|
||||
{
|
||||
SelectedCharacterId = null;
|
||||
return;
|
||||
}
|
||||
|
||||
var candidateIds = SelectedCampaign.Characters.Select(c => c.Id).ToHashSet();
|
||||
if (SelectedCharacterId.HasValue && candidateIds.Contains(SelectedCharacterId.Value))
|
||||
return;
|
||||
|
||||
if (ActiveCharacterId.HasValue && candidateIds.Contains(ActiveCharacterId.Value))
|
||||
{
|
||||
SelectedCharacterId = ActiveCharacterId;
|
||||
return;
|
||||
}
|
||||
|
||||
SelectedCharacterId = SelectedCampaign.Characters[0].Id;
|
||||
}
|
||||
|
||||
private string OwnerLabel(Guid ownerUserId)
|
||||
{
|
||||
if (User is not null && ownerUserId == User.Id)
|
||||
@@ -415,6 +313,19 @@ public partial class Workspace : IAsyncDisposable
|
||||
private bool IsPlayScreen => State.IsPlayScreen;
|
||||
private bool IsManagementScreen => State.IsManagementScreen;
|
||||
private bool IsAdminScreen => State.IsAdminScreen;
|
||||
private WorkspaceCampaignScopeCoordinator Scope => m_Scope ??= new(
|
||||
State,
|
||||
Feedback,
|
||||
JS,
|
||||
WorkspaceQuery,
|
||||
EnsureSelectedCharacterActiveAsync,
|
||||
RefreshSelectedCharacterSheetAsync,
|
||||
RefreshCampaignLogAsync,
|
||||
ResetCampaignLogDetailState,
|
||||
ResetCampaignStateTracking,
|
||||
ClearAuthenticatedState,
|
||||
StopStateEventsAsync,
|
||||
message => LoggedOut.InvokeAsync(message));
|
||||
private WorkspaceLiveStateController Live => m_Live ??= new(
|
||||
State,
|
||||
Feedback,
|
||||
@@ -489,10 +400,8 @@ public partial class Workspace : IAsyncDisposable
|
||||
private string AdminDatabaseDownloadUrl => Navigation.ToAbsoluteUri("api/admin/database").ToString();
|
||||
|
||||
private const string ScreenAdmin = "admin";
|
||||
private const string CampaignSessionKey = "campaign";
|
||||
private const string MobilePanelSessionKey = "play-panel";
|
||||
private const int CampaignLogWindowSize = 25;
|
||||
|
||||
private WorkspaceCampaignScopeCoordinator? m_Scope;
|
||||
private WorkspaceLiveStateController? m_Live;
|
||||
private WorkspacePlayCoordinator? m_Play;
|
||||
private WorkspaceCampaignCoordinator? m_CampaignsFlow;
|
||||
|
||||
Reference in New Issue
Block a user