@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 Кампании @code { enum CampaignsPageState { Init, Loading, Idle } CampaignsPageState state; IEnumerable campaigns; 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)) { CampaignManagementState.OnCampaignCreated += OnCampaignCreated; CampaignManagementState.OnCampaignProgressStep += OnCampaignProgressStep; CampaignManagementState.OnCampaignEnded += OnCampaignEnded; campaigns = await HeadquartersService.GetCampaignsAsync(); } ChangeState(CampaignsPageState.Idle); } } async Task RowExpandAsync(Campaign campaign) { // TODO } void ChangeState(CampaignsPageState state) { if (this.state == state) return; this.state = state; StateHasChanged(); } void OnCampaignCreated(Campaign campaign) { Task.Run(RefreshCampaigns); } 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; } }); } void OnCampaignEnded(Campaign campaign) { Task.Run(RefreshCampaigns); } async Task RefreshCampaigns() { await InvokeAsync(() => ChangeState(CampaignsPageState.Loading)); var refreshedCampaigns = await HeadquartersService.GetCampaignsAsync(); await InvokeAsync(() => { campaigns = refreshedCampaigns; ChangeState(CampaignsPageState.Idle); }); } public void Dispose() { CampaignManagementState.OnCampaignCreated -= OnCampaignCreated; CampaignManagementState.OnCampaignProgressStep -= OnCampaignProgressStep; CampaignManagementState.OnCampaignEnded -= OnCampaignEnded; } }