@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) { } } @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); } }