refactor: remove crash workaround scaffolding
This commit is contained in:
@@ -1,6 +1,5 @@
|
||||
using System.Diagnostics.CodeAnalysis;
|
||||
using Microsoft.AspNetCore.Components;
|
||||
using Microsoft.Extensions.Logging;
|
||||
using Microsoft.JSInterop;
|
||||
using RpgRoller.Components.Pages.HomeControls;
|
||||
using RpgRoller.Contracts;
|
||||
@@ -10,55 +9,25 @@ namespace RpgRoller.Components.Pages;
|
||||
[ExcludeFromCodeCoverage]
|
||||
public partial class Workspace : IAsyncDisposable
|
||||
{
|
||||
protected override void OnInitialized()
|
||||
{
|
||||
Logger.LogInformation("Workspace.OnInitialized route={Route}", Route);
|
||||
}
|
||||
|
||||
protected override void OnParametersSet()
|
||||
{
|
||||
Logger.LogInformation(
|
||||
"Workspace.OnParametersSet route={Route} previousRoute={PreviousRoute} hasSessionInitialized={HasSessionInitialized} state=[{State}]",
|
||||
Route, PreviousRoute, HasSessionInitialized, WorkspaceDiagnosticSummary.DescribeState(State));
|
||||
State.IsScreenMenuOpen = false;
|
||||
if (PreviousRoute.HasValue && PreviousRoute.Value != Route && HasSessionInitialized)
|
||||
_ = InvokeAsync(HandleRouteChangedAsync);
|
||||
|
||||
PreviousRoute = Route;
|
||||
}
|
||||
|
||||
protected override Task OnAfterRenderAsync(bool firstRender)
|
||||
{
|
||||
RenderCount += 1;
|
||||
Logger.LogInformation(
|
||||
"Workspace.OnAfterRenderAsync route={Route} renderCount={RenderCount} firstRender={FirstRender} renderPhase={RenderPhase} hasSessionInitialized={HasSessionInitialized} state=[{State}]",
|
||||
Route, RenderCount, firstRender, RenderPhase, HasSessionInitialized,
|
||||
WorkspaceDiagnosticSummary.DescribeState(State));
|
||||
if (RenderPhase < WorkspaceRenderPhase.RouteSkeleton)
|
||||
return AdvanceRenderPhaseAsync("Workspace.OnAfterRenderAsync");
|
||||
|
||||
return Task.CompletedTask;
|
||||
}
|
||||
|
||||
[JSInvokable]
|
||||
public Task OnStateEventReceived(CampaignStateSnapshot state)
|
||||
{
|
||||
Logger.LogInformation("Workspace.OnStateEventReceived route={Route} snapshot=[{Snapshot}]",
|
||||
Route, WorkspaceDiagnosticSummary.DescribeSnapshot(state));
|
||||
return Live.OnStateEventReceivedAsync(state);
|
||||
}
|
||||
|
||||
[JSInvokable]
|
||||
public Task OnConnectionStateChanged(string state)
|
||||
{
|
||||
Logger.LogInformation("Workspace.OnConnectionStateChanged route={Route} state={ConnectionState}", Route, state);
|
||||
return Live.OnConnectionStateChangedAsync(state);
|
||||
}
|
||||
|
||||
public async ValueTask DisposeAsync()
|
||||
{
|
||||
Logger.LogInformation("Workspace.DisposeAsync route={Route} state=[{State}]",
|
||||
Route, WorkspaceDiagnosticSummary.DescribeState(State));
|
||||
await StopStateEventsAsync();
|
||||
DotNetRef?.Dispose();
|
||||
}
|
||||
@@ -85,15 +54,12 @@ public partial class Workspace : IAsyncDisposable
|
||||
|
||||
private async Task StartStateEventsCoreAsync(Guid campaignId)
|
||||
{
|
||||
Logger.LogInformation("Workspace.StartStateEventsCoreAsync route={Route} campaignId={CampaignId}", Route,
|
||||
campaignId);
|
||||
DotNetRef ??= DotNetObjectReference.Create(this);
|
||||
await JS.InvokeVoidAsync("rpgRollerApi.startStateEvents", campaignId.ToString(), DotNetRef);
|
||||
}
|
||||
|
||||
private async Task StopStateEventsCoreAsync()
|
||||
{
|
||||
Logger.LogInformation("Workspace.StopStateEventsCoreAsync route={Route}", Route);
|
||||
try
|
||||
{
|
||||
await JS.InvokeVoidAsync("rpgRollerApi.stopStateEvents");
|
||||
@@ -113,8 +79,6 @@ public partial class Workspace : IAsyncDisposable
|
||||
|
||||
private Task NavigateToRouteAsync(string route)
|
||||
{
|
||||
Logger.LogInformation("Workspace.NavigateToRouteAsync fromRoute={Route} toRoute={TargetRoute} state=[{State}]",
|
||||
Route, route, WorkspaceDiagnosticSummary.DescribeState(State));
|
||||
State.IsScreenMenuOpen = false;
|
||||
Navigation.NavigateTo(route, forceLoad: true);
|
||||
return Task.CompletedTask;
|
||||
@@ -125,27 +89,13 @@ public partial class Workspace : IAsyncDisposable
|
||||
if (IsPlayRoute)
|
||||
return Task.CompletedTask;
|
||||
|
||||
Logger.LogWarning("Workspace.RedirectToPlayAsync fromRoute={Route} state=[{State}]",
|
||||
Route, WorkspaceDiagnosticSummary.DescribeState(State));
|
||||
Navigation.NavigateTo("/play", forceLoad: true);
|
||||
return Task.CompletedTask;
|
||||
}
|
||||
|
||||
private Task RequestRefreshAsync()
|
||||
{
|
||||
return RequestRefreshAsync("Workspace");
|
||||
}
|
||||
|
||||
private Task RequestRefreshAsync(string source)
|
||||
{
|
||||
Logger.LogInformation("Workspace.RequestRefreshAsync source={Source} route={Route} state=[{State}]",
|
||||
source, Route, WorkspaceDiagnosticSummary.DescribeState(State));
|
||||
return InvokeAsync(() =>
|
||||
{
|
||||
Logger.LogInformation("Workspace.StateHasChanged source={Source} route={Route} state=[{State}]",
|
||||
source, Route, WorkspaceDiagnosticSummary.DescribeState(State));
|
||||
StateHasChanged();
|
||||
});
|
||||
return InvokeAsync(StateHasChanged);
|
||||
}
|
||||
|
||||
private Task InitializeRouteAsync()
|
||||
@@ -153,56 +103,14 @@ public partial class Workspace : IAsyncDisposable
|
||||
return InitializationTask ??= InitializeRouteCoreAsync();
|
||||
}
|
||||
|
||||
private Task EnsureLiveRenderPhaseAsync()
|
||||
{
|
||||
if (RenderPhase == WorkspaceRenderPhase.Live)
|
||||
return Task.CompletedTask;
|
||||
|
||||
return AdvanceRenderPhaseAsync("WorkspaceRouteView.EnsureLiveRenderPhaseAsync", WorkspaceRenderPhase.Live);
|
||||
}
|
||||
|
||||
private async Task InitializeRouteCoreAsync()
|
||||
{
|
||||
if (HasSessionInitialized)
|
||||
{
|
||||
Logger.LogInformation(
|
||||
"Workspace.InitializeRouteCoreAsync skipped route={Route} alreadyInitialized state=[{State}]",
|
||||
Route, WorkspaceDiagnosticSummary.DescribeState(State));
|
||||
return;
|
||||
}
|
||||
|
||||
Logger.LogInformation("Workspace.InitializeRouteCoreAsync start route={Route} stateBefore=[{State}]",
|
||||
Route, WorkspaceDiagnosticSummary.DescribeState(State));
|
||||
State.HasInteractiveRenderStarted = true;
|
||||
await Session.InitializeAsync();
|
||||
HasSessionInitialized = true;
|
||||
Logger.LogInformation("Workspace.InitializeRouteCoreAsync end route={Route} stateAfter=[{State}]",
|
||||
Route, WorkspaceDiagnosticSummary.DescribeState(State));
|
||||
await RequestRefreshAsync();
|
||||
}
|
||||
|
||||
private async Task HandleRouteChangedAsync()
|
||||
{
|
||||
if (!HasSessionInitialized)
|
||||
return;
|
||||
|
||||
Logger.LogInformation(
|
||||
"Workspace.HandleRouteChangedAsync start route={Route} previousRoute={PreviousRoute} stateBefore=[{State}]",
|
||||
Route, PreviousRoute, WorkspaceDiagnosticSummary.DescribeState(State));
|
||||
if (IsAdminRoute)
|
||||
{
|
||||
await Live.SyncStateEventsAsync();
|
||||
await EnsureAdminUsersLoadedAsync();
|
||||
Logger.LogInformation("Workspace.HandleRouteChangedAsync admin end route={Route} stateAfter=[{State}]",
|
||||
Route, WorkspaceDiagnosticSummary.DescribeState(State));
|
||||
await RequestRefreshAsync();
|
||||
return;
|
||||
}
|
||||
|
||||
await Scope.RefreshCampaignScopeAsync();
|
||||
await Live.SyncStateEventsAsync();
|
||||
Logger.LogInformation("Workspace.HandleRouteChangedAsync end route={Route} stateAfter=[{State}]",
|
||||
Route, WorkspaceDiagnosticSummary.DescribeState(State));
|
||||
await RequestRefreshAsync();
|
||||
}
|
||||
|
||||
@@ -211,19 +119,6 @@ public partial class Workspace : IAsyncDisposable
|
||||
return exception.Message.Contains("statically rendered", StringComparison.OrdinalIgnoreCase);
|
||||
}
|
||||
|
||||
private Task AdvanceRenderPhaseAsync(string source, WorkspaceRenderPhase? targetPhase = null)
|
||||
{
|
||||
var nextPhase = targetPhase ?? (WorkspaceRenderPhase)((int)RenderPhase + 1);
|
||||
if (nextPhase <= RenderPhase)
|
||||
return Task.CompletedTask;
|
||||
|
||||
Logger.LogInformation(
|
||||
"Workspace.AdvanceRenderPhaseAsync source={Source} route={Route} from={FromPhase} to={ToPhase}",
|
||||
source, Route, RenderPhase, nextPhase);
|
||||
RenderPhase = nextPhase;
|
||||
return RequestRefreshAsync(source);
|
||||
}
|
||||
|
||||
[Inject] private IJSRuntime JS { get; set; } = null!;
|
||||
|
||||
[Inject] private RpgRollerApiClient ApiClient { get; set; } = null!;
|
||||
@@ -231,8 +126,6 @@ public partial class Workspace : IAsyncDisposable
|
||||
[Inject] private WorkspaceQueryService WorkspaceQuery { get; set; } = null!;
|
||||
|
||||
[Inject] private NavigationManager Navigation { get; set; } = null!;
|
||||
[Inject] private ILogger<Workspace> Logger { get; set; } = null!;
|
||||
[Inject] private ILoggerFactory LoggerFactory { get; set; } = null!;
|
||||
|
||||
[Parameter] public EventCallback<string?> LoggedOut { get; set; }
|
||||
[Parameter] public WorkspaceRoute Route { get; set; } = WorkspaceRoute.Play;
|
||||
@@ -248,25 +141,23 @@ public partial class Workspace : IAsyncDisposable
|
||||
private bool ShowConnectionStateInHeader => IsPlayRoute;
|
||||
|
||||
private WorkspacePageContext PageContext => new(State, Play, Campaigns, Admin, Scope, Session,
|
||||
InitializeRouteAsync, HasSessionInitialized, RequestRefreshAsync, EnsureLiveRenderPhaseAsync,
|
||||
AdminDatabaseDownloadUrl, HeaderMenuItems, RenderPhase, IsPlayRoute, IsCampaignsRoute, IsAdminRoute);
|
||||
InitializeRouteAsync, HasSessionInitialized, RequestRefreshAsync, AdminDatabaseDownloadUrl, HeaderMenuItems,
|
||||
IsPlayRoute, IsCampaignsRoute, IsAdminRoute);
|
||||
|
||||
private WorkspaceCampaignScopeCoordinator Scope => m_Scope ??= new(State, Feedback, JS, WorkspaceQuery,
|
||||
() => IsPlayRoute, Play.EnsureSelectedCharacterActiveAsync, Play.RefreshSelectedCharacterSheetAsync,
|
||||
Play.RefreshCampaignLogAsync, Play.ResetCampaignLogDetailState, Play.ResetCampaignStateTracking,
|
||||
ClearAuthenticatedState,
|
||||
StopStateEventsAsync, message => LoggedOut.InvokeAsync(message),
|
||||
LoggerFactory.CreateLogger("Workspace.CampaignScope"));
|
||||
StopStateEventsAsync, message => LoggedOut.InvokeAsync(message));
|
||||
|
||||
private WorkspaceLiveStateController Live => m_Live ??= new(State, Feedback, () => IsPlayRoute, () => IsAdminRoute,
|
||||
StartStateEventsCoreAsync,
|
||||
StopStateEventsCoreAsync, Scope.RefreshCampaignRosterAsync, Play.RefreshSelectedCharacterSheetAsync,
|
||||
Play.RefreshCampaignLogAsync, () => RequestRefreshAsync("WorkspaceLiveStateController"),
|
||||
LoggerFactory.CreateLogger("Workspace.LiveState"));
|
||||
private WorkspaceLiveStateController Live => m_Live ??=
|
||||
new(State, Feedback, () => IsPlayRoute, () => IsAdminRoute, StartStateEventsCoreAsync,
|
||||
StopStateEventsCoreAsync, Scope.RefreshCampaignRosterAsync, Play.RefreshSelectedCharacterSheetAsync,
|
||||
Play.RefreshCampaignLogAsync, RequestRefreshAsync);
|
||||
|
||||
private WorkspacePlayCoordinator Play => m_Play ??= new(State, Feedback, () => IsPlayRoute, ApiClient,
|
||||
WorkspaceQuery,
|
||||
CanEditCharacter, () => RequestRefreshAsync("WorkspacePlayCoordinator"));
|
||||
CanEditCharacter, RequestRefreshAsync);
|
||||
|
||||
private WorkspaceCampaignCoordinator Campaigns => m_Campaigns ??= new(State, Feedback, JS, ApiClient,
|
||||
Session.LoadKnownUsernamesAsync, Scope.ReloadCampaignsAsync, Scope.ReloadCharacterCampaignOptionsAsync,
|
||||
@@ -275,15 +166,13 @@ public partial class Workspace : IAsyncDisposable
|
||||
private WorkspaceAdminCoordinator Admin => m_Admin ??= new(State, Feedback, JS, ApiClient, WorkspaceQuery,
|
||||
ClearAuthenticatedState, StopStateEventsAsync, message => LoggedOut.InvokeAsync(message));
|
||||
|
||||
private WorkspaceFeedbackService Feedback =>
|
||||
m_Feedback ??= new(State, () => RequestRefreshAsync("WorkspaceFeedbackService"));
|
||||
private WorkspaceFeedbackService Feedback => m_Feedback ??= new(State, RequestRefreshAsync);
|
||||
|
||||
private WorkspaceSessionCoordinator Session => m_Session ??= new(State, Feedback, JS, ApiClient, WorkspaceQuery,
|
||||
() => IsAdminRoute, RedirectToPlayAsync,
|
||||
Scope.ReloadCampaignsAsync, Scope.ReloadCharacterCampaignOptionsAsync, Scope.RefreshCampaignScopeAsync,
|
||||
Live.SyncStateEventsAsync, Live.StopStateEventsAsync, EnsureAdminUsersLoadedAsync,
|
||||
Play.ResetCampaignLogDetailState, message => LoggedOut.InvokeAsync(message),
|
||||
LoggerFactory.CreateLogger("Workspace.Session"));
|
||||
Play.ResetCampaignLogDetailState, message => LoggedOut.InvokeAsync(message));
|
||||
|
||||
private IReadOnlyList<AppHeaderMenuItem> HeaderMenuItems
|
||||
{
|
||||
@@ -331,7 +220,4 @@ public partial class Workspace : IAsyncDisposable
|
||||
private WorkspaceCampaignScopeCoordinator? m_Scope;
|
||||
private WorkspaceSessionCoordinator? m_Session;
|
||||
private Task? InitializationTask { get; set; }
|
||||
private WorkspaceRoute? PreviousRoute { get; set; }
|
||||
private int RenderCount { get; set; }
|
||||
private WorkspaceRenderPhase RenderPhase { get; set; }
|
||||
}
|
||||
Reference in New Issue
Block a user