@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; } }