@page "/campaigns"
@using Hcs.WebApp.BackgroundServices
@using Hcs.WebApp.Services
@using Microsoft.AspNetCore.Authorization
@implements IDisposable
@attribute [Authorize]
@inject AuthenticationStateProvider AuthenticationStateProvider
@inject HeadquartersService HeadquartersService
@inject CampaignManagementState CampaignManagementState
@inject OperationExecutionState OperationExecutionState
@inject ResultWaitState ResultWaitState
Кампании
@code {
enum CampaignsPageState
{
Init,
Loading,
Idle
}
CampaignsPageState state;
RadzenDataGrid campaignsDataGrid;
RadzenDataGrid operationsDataGrid;
IEnumerable? campaigns;
Campaign? expandedCampaign;
protected override async Task OnAfterRenderAsync(bool firstRender)
{
await base.OnAfterRenderAsync(firstRender);
if (firstRender)
{
ChangeState(CampaignsPageState.Loading);
var state = await AuthenticationStateProvider.GetAuthenticationStateAsync();
if (state.User.IsInRole(AppRole.ADMINISTRATOR_TYPE) || state.User.IsInRole(AppRole.OPERATOR_TYPE))
{
campaigns = await HeadquartersService.GetCampaignsAsync();
CampaignManagementState.OnCampaignCreated += OnCampaignCreated;
CampaignManagementState.OnCampaignStarted += OnCampaignStarted;
CampaignManagementState.OnCampaignProgressStep += OnCampaignProgressStep;
CampaignManagementState.OnCampaignEnded += OnCampaignEnded;
OperationExecutionState.OnOperationStarted += OnOperationStarted;
OperationExecutionState.OnOperationExecuted += OnOperationExecuted;
OperationExecutionState.OnOperationEnded += OnOperationEnded;
ResultWaitState.OnOperationEnded += OnOperationEnded;
}
ChangeState(CampaignsPageState.Idle);
}
}
async Task RowExpandAsync(Campaign campaign)
{
expandedCampaign = campaign;
if (campaign.Operations == null)
{
campaign.Operations = await HeadquartersService.GetOperationsAsync(campaign.Id);
}
}
void RowCollapse(Campaign campaign)
{
if (expandedCampaign != null && expandedCampaign.Id == campaign.Id)
{
expandedCampaign = null;
}
campaign.Operations = null;
}
void ChangeState(CampaignsPageState state)
{
if (this.state == state) return;
this.state = state;
StateHasChanged();
}
void OnCampaignCreated(Campaign campaign)
{
Task.Run(RefreshCampaigns);
}
void OnCampaignStarted(Campaign campaign)
{
InvokeAsync(() =>
{
var targetCampaign = campaigns?.FirstOrDefault(x => x.Id == campaign.Id);
if (targetCampaign != null)
{
targetCampaign.StartedAt = campaign.StartedAt;
campaignsDataGrid.Reload();
}
if (expandedCampaign != null && expandedCampaign.Id == campaign.Id)
{
campaignsDataGrid.CollapseAll();
}
});
}
void OnCampaignProgressStep(Campaign campaign)
{
InvokeAsync(() =>
{
var targetCampaign = campaigns?.FirstOrDefault(x => x.Id == campaign.Id);
if (targetCampaign != null)
{
targetCampaign.Step = campaign.Step;
targetCampaign.Progress = campaign.Progress;
campaignsDataGrid.Reload();
if (expandedCampaign != null && expandedCampaign.Id == campaign.Id)
{
campaignsDataGrid.CollapseAll();
}
}
});
}
void OnCampaignEnded(Campaign campaign)
{
Task.Run(RefreshCampaigns);
}
void OnOperationStarted(Operation operation)
{
InvokeAsync(() =>
{
if (expandedCampaign != null && expandedCampaign.Id == operation.CampaignId)
{
var targetOperation = expandedCampaign.Operations?.FirstOrDefault(x => x.Id == operation.Id);
if (targetOperation != null)
{
targetOperation.StartedAt = operation.StartedAt;
operationsDataGrid.Reload();
}
}
});
}
void OnOperationExecuted(Operation operation)
{
InvokeAsync(() =>
{
if (expandedCampaign != null && expandedCampaign.Id == operation.CampaignId)
{
var targetOperation = expandedCampaign.Operations?.FirstOrDefault(x => x.Id == operation.Id);
if (targetOperation != null)
{
targetOperation.MessageGuid = operation.MessageGuid;
operationsDataGrid.Reload();
}
}
});
}
void OnOperationEnded(Operation operation)
{
InvokeAsync(() =>
{
if (expandedCampaign != null && expandedCampaign.Id == operation.CampaignId)
{
var targetOperation = expandedCampaign.Operations?.FirstOrDefault(x => x.Id == operation.Id);
if (targetOperation != null)
{
targetOperation.EndedAt = operation.EndedAt;
targetOperation.FailureReason = operation.FailureReason;
operationsDataGrid.Reload();
}
}
});
}
async Task RefreshCampaigns()
{
await InvokeAsync(() => ChangeState(CampaignsPageState.Loading));
var refreshedCampaigns = await HeadquartersService.GetCampaignsAsync();
await InvokeAsync(() =>
{
campaigns = refreshedCampaigns;
expandedCampaign = null;
ChangeState(CampaignsPageState.Idle);
});
}
public void Dispose()
{
CampaignManagementState.OnCampaignCreated -= OnCampaignCreated;
CampaignManagementState.OnCampaignStarted -= OnCampaignStarted;
CampaignManagementState.OnCampaignProgressStep -= OnCampaignProgressStep;
CampaignManagementState.OnCampaignEnded -= OnCampaignEnded;
OperationExecutionState.OnOperationStarted -= OnOperationStarted;
OperationExecutionState.OnOperationExecuted -= OnOperationExecuted;
OperationExecutionState.OnOperationEnded -= OnOperationEnded;
ResultWaitState.OnOperationEnded -= OnOperationEnded;
}
}