Add observer for online servers.
Only for the servers in the Eindhoven city.
This commit is contained in:
parent
734a59f38b
commit
9e7e7df370
@ -1,13 +1,26 @@
|
||||
@using ServerManagement.StateStore
|
||||
|
||||
@implements IDisposable
|
||||
|
||||
@inject EindhovenOnlineServersStore EindhovenOnlineServersStore
|
||||
|
||||
<div class="col">
|
||||
<div class="card @((city == selectedCity) ? "border-primary" : "")">
|
||||
<img src=@($"/images/{@city}.png") class="card-img-top" alt="@city">
|
||||
<div class="card-body @((city == selectedCity) ? "active" : "")">
|
||||
<button class="btn btn-primary" @onclick="@(() => { SelectCity(city); })">@city</button>
|
||||
</div>
|
||||
<div>
|
||||
@if (city.Equals("Eindhoven", StringComparison.OrdinalIgnoreCase))
|
||||
{
|
||||
<text>Online: @serversOnlineEindhoven</text>
|
||||
}
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
@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);
|
||||
}
|
||||
}
|
||||
@ -1,6 +1,7 @@
|
||||
@namespace ServerManagement.Components.Controls
|
||||
|
||||
@inject NavigationManager NavigationManager
|
||||
@inject EindhovenOnlineServersStore EindhovenOnlineServersStore
|
||||
|
||||
@if (Server != null)
|
||||
{
|
||||
@ -32,14 +33,14 @@
|
||||
@if (Server.IsOnline)
|
||||
{
|
||||
<button type="button" class="btn btn-outline-danger"
|
||||
@onclick="@(() => { Server.IsOnline = false; })">
|
||||
@onclick="@(() => { SetServerStatus(false); })">
|
||||
Turn off
|
||||
</button>
|
||||
}
|
||||
else
|
||||
{
|
||||
<button type="button" class="btn btn-outline-success"
|
||||
@onclick="@(() => { Server.IsOnline = true; })">
|
||||
@onclick="@(() => { SetServerStatus(true); })">
|
||||
Turn on
|
||||
</button>
|
||||
}
|
||||
@ -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;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
@ -1,7 +1,10 @@
|
||||
@page "/servers"
|
||||
@page "/servers/back_from/{cityName}"
|
||||
|
||||
@using ServerManagement.Components.Controls
|
||||
|
||||
@inject NavigationManager NavigationManager
|
||||
@inject EindhovenOnlineServersStore EindhovenOnlineServersStore
|
||||
|
||||
<h3>Servers</h3>
|
||||
<br/>
|
||||
@ -60,6 +63,12 @@
|
||||
selectedCity = CityName;
|
||||
StateHasChanged();
|
||||
}
|
||||
|
||||
var serversEindhoven = ServersRepository.GetServersByCity("Eindhoven");
|
||||
if (serversEindhoven != null)
|
||||
{
|
||||
EindhovenOnlineServersStore.SetNumberServersOnline(serversEindhoven.Count(s => s.IsOnline));
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
@ -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();
|
||||
}
|
||||
}
|
||||
}
|
||||
28
ServerManagement/Components/StateStore/Observer.cs
Normal file
28
ServerManagement/Components/StateStore/Observer.cs
Normal file
@ -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();
|
||||
}
|
||||
}
|
||||
}
|
||||
@ -15,6 +15,8 @@ builder.Services.AddTransient<SessionStorage>();
|
||||
// For a WebAssembly, you want to use AddSingleton, so that everything is locally downloaded in the browser.
|
||||
builder.Services.AddScoped<ContainerStorage>();
|
||||
|
||||
builder.Services.AddScoped<EindhovenOnlineServersStore>();
|
||||
|
||||
var app = builder.Build();
|
||||
|
||||
// Configure the HTTP request pipeline.
|
||||
|
||||
Loading…
x
Reference in New Issue
Block a user