From 785a1db6687f9ca76276cbeaa7e21d072b809e50 Mon Sep 17 00:00:00 2001 From: "HOME-LAPTOP\\kshkulev" Date: Wed, 5 Nov 2025 16:00:52 +0900 Subject: [PATCH] Update campaign progress UI --- .../CampaignManagementService.cs | 9 +++++++++ .../BackgroundServices/CampaignManagementState.cs | 10 ++++++++++ .../CampaignManagers/IManager.cs | 2 ++ .../CampaignManagers/ManagerBase.cs | 4 ++++ Hcs.WebApp/Components/Pages/Campaigns.razor | 15 +++++++++++++++ 5 files changed, 40 insertions(+) diff --git a/Hcs.WebApp/BackgroundServices/CampaignManagementService.cs b/Hcs.WebApp/BackgroundServices/CampaignManagementService.cs index 22bd00b..15832a9 100644 --- a/Hcs.WebApp/BackgroundServices/CampaignManagementService.cs +++ b/Hcs.WebApp/BackgroundServices/CampaignManagementService.cs @@ -37,6 +37,8 @@ namespace Hcs.WebApp.BackgroundServices if (manager != null) { managers.Add(manager); + + manager.OnCampaignProgressStep += OnCampaignProgressStep; } else { @@ -62,6 +64,8 @@ namespace Hcs.WebApp.BackgroundServices if (manager.State == IManager.ManagerState.Ended) { campaignManagementState.InvokeOnCampaignEnded(manager.Campaign); + + manager.OnCampaignProgressStep -= OnCampaignProgressStep; } } @@ -97,5 +101,10 @@ namespace Hcs.WebApp.BackgroundServices campaignManagementState.EnqueueCampaign(campaign); } } + + private void OnCampaignProgressStep(Campaign campaign) + { + campaignManagementState.InvokeOnCampaignProgressStep(campaign); + } } } diff --git a/Hcs.WebApp/BackgroundServices/CampaignManagementState.cs b/Hcs.WebApp/BackgroundServices/CampaignManagementState.cs index 46f3bfb..f18f079 100644 --- a/Hcs.WebApp/BackgroundServices/CampaignManagementState.cs +++ b/Hcs.WebApp/BackgroundServices/CampaignManagementState.cs @@ -8,6 +8,7 @@ namespace Hcs.WebApp.BackgroundServices private readonly ConcurrentQueue campaigns = new(); public event Action OnCampaignCreated; + public event Action OnCampaignProgressStep; public event Action OnCampaignEnded; public void EnqueueCampaign(Campaign campaign) @@ -30,5 +31,14 @@ namespace Hcs.WebApp.BackgroundServices } catch { } } + + public void InvokeOnCampaignProgressStep(Campaign campaign) + { + try + { + OnCampaignProgressStep?.Invoke(campaign); + } + catch { } + } } } diff --git a/Hcs.WebApp/BackgroundServices/CampaignManagers/IManager.cs b/Hcs.WebApp/BackgroundServices/CampaignManagers/IManager.cs index 724aab6..8d9ebe0 100644 --- a/Hcs.WebApp/BackgroundServices/CampaignManagers/IManager.cs +++ b/Hcs.WebApp/BackgroundServices/CampaignManagers/IManager.cs @@ -15,6 +15,8 @@ namespace Hcs.WebApp.BackgroundServices.CampaignManagers public ManagerState State { get; } + event Action OnCampaignProgressStep; + Task ProcessAsync(); Task EndWithFailAsync(Exception e); diff --git a/Hcs.WebApp/BackgroundServices/CampaignManagers/ManagerBase.cs b/Hcs.WebApp/BackgroundServices/CampaignManagers/ManagerBase.cs index dce470e..04249d0 100644 --- a/Hcs.WebApp/BackgroundServices/CampaignManagers/ManagerBase.cs +++ b/Hcs.WebApp/BackgroundServices/CampaignManagers/ManagerBase.cs @@ -25,6 +25,8 @@ namespace Hcs.WebApp.BackgroundServices.CampaignManagers public IManager.ManagerState State { get; protected set; } = IManager.ManagerState.Created; + public event Action? OnCampaignProgressStep; + public abstract Task ProcessAsync(); public async Task EndWithFailAsync(Exception e) @@ -45,6 +47,8 @@ namespace Hcs.WebApp.BackgroundServices.CampaignManagers campaign.Step = step; campaign.Progress = (step + 1) / StepCount; await HeadquartersService.UpdateCampaignStepAndProgressAsync(context, campaign); + + OnCampaignProgressStep?.Invoke(campaign); } } } diff --git a/Hcs.WebApp/Components/Pages/Campaigns.razor b/Hcs.WebApp/Components/Pages/Campaigns.razor index a41ea4c..537ce85 100644 --- a/Hcs.WebApp/Components/Pages/Campaigns.razor +++ b/Hcs.WebApp/Components/Pages/Campaigns.razor @@ -81,6 +81,7 @@ 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(); @@ -109,6 +110,19 @@ 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); @@ -131,6 +145,7 @@ public void Dispose() { CampaignManagementState.OnCampaignCreated -= OnCampaignCreated; + CampaignManagementState.OnCampaignProgressStep -= OnCampaignProgressStep; CampaignManagementState.OnCampaignEnded -= OnCampaignEnded; } }