@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.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 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.OnCampaignEnded -= OnCampaignEnded; } }