@using LANCommander.Server.Services.ServerEngines
@using LANCommander.Server.Settings.Enums
@using LANCommander.Server.Settings.Models
@inject RemoteServerEngine RemoteServerEngine
@if (!ServerEngines.Any())
{
}
@foreach (var serverEngine in ServerEngines)
{
@if (serverEngine.Type == ServerEngine.Local)
{
}
@if (serverEngine.Type == ServerEngine.Docker)
{
}
@if (serverEngine.Type == ServerEngine.Remote)
{
}
}
@code {
[Parameter] public IEnumerable Values { get; set; }
[Parameter] public EventCallback> ValuesChanged { get; set; }
[Parameter] public EventCallback Save { get; set; }
class RemoteEngineState
{
public string Username { get; set; } = string.Empty;
public string Password { get; set; } = string.Empty;
public string Error { get; set; } = string.Empty;
public bool Connecting { get; set; } = false;
}
List ServerEngines = new();
Dictionary _remoteStates = new();
protected override void OnParametersSet()
{
ServerEngines = Values.OrderBy(e => e.Type).ThenBy(e => e.Name).ToList();
foreach (var engine in ServerEngines.Where(e => e.Type == ServerEngine.Remote))
_remoteStates.TryAdd(engine.Id, new RemoteEngineState());
}
async Task Add(ServerEngine type)
{
var newEngine = new ServerEngineConfiguration
{
Type = type,
Name = type.ToString()
};
ServerEngines.Add(newEngine);
if (type == ServerEngine.Remote)
_remoteStates[newEngine.Id] = new RemoteEngineState();
if (ValuesChanged.HasDelegate)
await ValuesChanged.InvokeAsync(ServerEngines);
}
async Task Remove(ServerEngineConfiguration serverEngine)
{
ServerEngines.Remove(serverEngine);
_remoteStates.Remove(serverEngine.Id);
if (ValuesChanged.HasDelegate)
await ValuesChanged.InvokeAsync(ServerEngines);
if (Save.HasDelegate)
await Save.InvokeAsync();
}
async Task Connect(ServerEngineConfiguration serverEngine)
{
var state = _remoteStates[serverEngine.Id];
state.Connecting = true;
state.Error = string.Empty;
await InvokeAsync(StateHasChanged);
if (Save.HasDelegate)
await Save.InvokeAsync();
var error = await RemoteServerEngine.AuthenticateAsync(serverEngine.Id, state.Username, state.Password);
if (!string.IsNullOrWhiteSpace(error))
state.Error = error;
state.Connecting = false;
await InvokeAsync(StateHasChanged);
}
}