diff --git a/ServerManagement/Components/Controls/CityComponent.razor b/ServerManagement/Components/Controls/CityComponent.razor index ce97cc0..8f9cd41 100644 --- a/ServerManagement/Components/Controls/CityComponent.razor +++ b/ServerManagement/Components/Controls/CityComponent.razor @@ -1,13 +1,26 @@ +@using ServerManagement.StateStore + +@implements IDisposable + +@inject EindhovenOnlineServersStore EindhovenOnlineServersStore +
@city
+
+ @if (city.Equals("Eindhoven", StringComparison.OrdinalIgnoreCase)) + { + Online: @serversOnlineEindhoven + } +
@code { + private int serversOnlineEindhoven; [Parameter] public string? city { get; set; } = ""; @@ -21,4 +34,26 @@ { SelectCityCallBack.InvokeAsync(cityName); } + + protected override void OnAfterRender(bool firstRender) + { + if (firstRender) + { + serversOnlineEindhoven = EindhovenOnlineServersStore.GetNumberServersOnline(); + EindhovenOnlineServersStore.AddStateChangeListener(OnServersStatusChange); + StateHasChanged(); + } + } + + private void OnServersStatusChange() + { + serversOnlineEindhoven = EindhovenOnlineServersStore.GetNumberServersOnline(); + StateHasChanged(); + } + + // Remove the listeners, otherwise it can cause memory leaks. + public void Dispose() + { + EindhovenOnlineServersStore.RemoveStateChangeListener(OnServersStatusChange); + } } \ No newline at end of file diff --git a/ServerManagement/Components/Controls/ServerComponent.razor b/ServerManagement/Components/Controls/ServerComponent.razor index c59fb09..7a6ea06 100755 --- a/ServerManagement/Components/Controls/ServerComponent.razor +++ b/ServerManagement/Components/Controls/ServerComponent.razor @@ -1,6 +1,7 @@ @namespace ServerManagement.Components.Controls @inject NavigationManager NavigationManager +@inject EindhovenOnlineServersStore EindhovenOnlineServersStore @if (Server != null) { @@ -32,14 +33,14 @@ @if (Server.IsOnline) { } else { } @@ -92,4 +93,27 @@ return "white"; } } + + private void SetServerStatus(bool status) + { + if (this.Server != null) + { + if (this.Server.IsOnline != status) + { + if (this.Server.City.Equals("Eindhoven", StringComparison.OrdinalIgnoreCase)) + { + var numberOnline = EindhovenOnlineServersStore.GetNumberServersOnline(); + if (status) + { + EindhovenOnlineServersStore.SetNumberServersOnline(numberOnline + 1); + } + else if (numberOnline > 1) + { + EindhovenOnlineServersStore.SetNumberServersOnline(numberOnline - 1); + } + } + this.Server.IsOnline = status; + } + } + } } \ No newline at end of file diff --git a/ServerManagement/Components/Pages/Servers.razor b/ServerManagement/Components/Pages/Servers.razor index af9df5f..85fdc98 100644 --- a/ServerManagement/Components/Pages/Servers.razor +++ b/ServerManagement/Components/Pages/Servers.razor @@ -1,7 +1,10 @@ @page "/servers" @page "/servers/back_from/{cityName}" + @using ServerManagement.Components.Controls + @inject NavigationManager NavigationManager +@inject EindhovenOnlineServersStore EindhovenOnlineServersStore

Servers


@@ -60,6 +63,12 @@ selectedCity = CityName; StateHasChanged(); } + + var serversEindhoven = ServersRepository.GetServersByCity("Eindhoven"); + if (serversEindhoven != null) + { + EindhovenOnlineServersStore.SetNumberServersOnline(serversEindhoven.Count(s => s.IsOnline)); + } } } } \ No newline at end of file diff --git a/ServerManagement/Components/StateStore/EindhovenOnlineServersStore.cs b/ServerManagement/Components/StateStore/EindhovenOnlineServersStore.cs new file mode 100644 index 0000000..cb4d3a3 --- /dev/null +++ b/ServerManagement/Components/StateStore/EindhovenOnlineServersStore.cs @@ -0,0 +1,18 @@ +namespace ServerManagement.StateStore +{ + public class EindhovenOnlineServersStore : Observer + { + private int _numberServersOnline; + + public int GetNumberServersOnline() + { + return _numberServersOnline; + } + + public void SetNumberServersOnline(int numbersOnline) + { + _numberServersOnline = numbersOnline; + base.BroadcastStateChange(); + } + } +} \ No newline at end of file diff --git a/ServerManagement/Components/StateStore/Observer.cs b/ServerManagement/Components/StateStore/Observer.cs new file mode 100644 index 0000000..8c6618c --- /dev/null +++ b/ServerManagement/Components/StateStore/Observer.cs @@ -0,0 +1,28 @@ +namespace ServerManagement.StateStore +{ + public class Observer + { + protected Action? _listeners; + + public void AddStateChangeListener(Action? listener) + { + if (listener is not null) + { + _listeners += listener; + } + } + + public void RemoveStateChangeListener(Action? listener) + { + if (listener is not null) + { + _listeners -= listener; + } + } + + public void BroadcastStateChange() + { + _listeners?.Invoke(); + } + } +} \ No newline at end of file diff --git a/ServerManagement/Program.cs b/ServerManagement/Program.cs index 5b1a4a1..c0471f5 100644 --- a/ServerManagement/Program.cs +++ b/ServerManagement/Program.cs @@ -15,6 +15,8 @@ builder.Services.AddTransient(); // For a WebAssembly, you want to use AddSingleton, so that everything is locally downloaded in the browser. builder.Services.AddScoped(); +builder.Services.AddScoped(); + var app = builder.Build(); // Configure the HTTP request pipeline.