LANCommander/LANCommander.Server/UI/Pages/Settings/Components/ServerEngineEditor.razor

186 lines
7.4 KiB
Text

@using LANCommander.Server.Services.ServerEngines
@using LANCommander.Server.Settings.Enums
@using LANCommander.Server.Settings.Models
@inject RemoteServerEngine RemoteServerEngine
<Flex Direction="FlexDirection.Vertical" Gap="FlexGap.Large">
@if (!ServerEngines.Any())
{
<Empty Description="@("No engines have been configured")" />
}
<Collapse>
@foreach (var serverEngine in ServerEngines)
{
@if (serverEngine.Type == ServerEngine.Local)
{
<Panel Header="@serverEngine.Name">
<ExtraTemplate>
<Button Type="ButtonType.Text" Icon="@IconType.Outline.Close" Size="ButtonSize.Small" Danger OnClick="() => Remove(serverEngine)"/>
</ExtraTemplate>
<ChildContent>
<Form Model="serverEngine" Layout="FormLayout.Vertical">
<FormItem Label="Name">
<Input @bind-Value="context.Name" BindOnInput />
</FormItem>
</Form>
</ChildContent>
</Panel>
}
@if (serverEngine.Type == ServerEngine.Docker)
{
<Panel Header="@serverEngine.Name">
<ExtraTemplate>
<Button Type="ButtonType.Text" Icon="@IconType.Outline.Close" Size="ButtonSize.Small" Danger OnClick="() => Remove(serverEngine)"/>
</ExtraTemplate>
<ChildContent>
<Form Model="serverEngine" Layout="FormLayout.Vertical">
<FormItem Label="Name">
<Input @bind-Value="context.Name" BindOnInput />
</FormItem>
<FormItem Label="Address">
<Input @bind-Value="context.Address" />
</FormItem>
</Form>
</ChildContent>
</Panel>
}
@if (serverEngine.Type == ServerEngine.Remote)
{
<Panel Header="@serverEngine.Name">
<ExtraTemplate>
<Button Type="ButtonType.Text" Icon="@IconType.Outline.Close" Size="ButtonSize.Small" Danger OnClick="() => Remove(serverEngine)"/>
</ExtraTemplate>
<ChildContent>
<Form Model="serverEngine" Layout="FormLayout.Vertical">
<FormItem Label="Name">
<Input @bind-Value="context.Name" BindOnInput />
</FormItem>
<FormItem Label="Address">
<Input @bind-Value="context.Address" Placeholder="http://other-server:1337" />
</FormItem>
<FormItem Label="Status">
@if (!String.IsNullOrWhiteSpace(context.AccessToken) && context.TokenExpiration > DateTime.UtcNow)
{
<Tag Color="success">Connected</Tag>
}
else
{
<Tag Color="default">Not Connected</Tag>
}
</FormItem>
<FormItem Label="Username">
<Input @bind-Value="_remoteUsernames[serverEngine.Id]" />
</FormItem>
<FormItem Label="Password">
<InputPassword @bind-Value="_remotePasswords[serverEngine.Id]" />
</FormItem>
@if (!string.IsNullOrWhiteSpace(_remoteErrors[serverEngine.Id]))
{
<Alert Type="@AlertType.Error" Message="@_remoteErrors[serverEngine.Id]" ShowIcon />
}
<FormItem>
<Button Type="ButtonType.Primary" Loading="_remoteConnecting[serverEngine.Id]" OnClick="() => Connect(serverEngine)">Connect</Button>
</FormItem>
</Form>
</ChildContent>
</Panel>
}
}
</Collapse>
<Flex Justify="FlexJustify.Center" Gap="FlexGap.Small">
<Button OnClick="() => Add(ServerEngine.Local)" Type="ButtonType.Default">Add Local</Button>
<Button OnClick="() => Add(ServerEngine.Docker)" Type="ButtonType.Default">Add Docker</Button>
<Button OnClick="() => Add(ServerEngine.Remote)" Type="ButtonType.Primary">Add Remote</Button>
</Flex>
</Flex>
@code {
[Parameter] public IEnumerable<ServerEngineConfiguration> Values { get; set; }
[Parameter] public EventCallback<IEnumerable<ServerEngineConfiguration>> ValuesChanged { get; set; }
List<ServerEngineConfiguration> ServerEngines = new();
Dictionary<Guid, string> _remoteUsernames = new();
Dictionary<Guid, string> _remotePasswords = new();
Dictionary<Guid, string> _remoteErrors = new();
Dictionary<Guid, bool> _remoteConnecting = 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))
{
_remoteUsernames.TryAdd(engine.Id, string.Empty);
_remotePasswords.TryAdd(engine.Id, string.Empty);
_remoteErrors.TryAdd(engine.Id, string.Empty);
_remoteConnecting.TryAdd(engine.Id, false);
}
}
async Task Add(ServerEngine type)
{
var newEngine = new ServerEngineConfiguration
{
Type = type,
Name = type.ToString()
};
ServerEngines.Add(newEngine);
if (type == ServerEngine.Remote)
{
_remoteUsernames[newEngine.Id] = string.Empty;
_remotePasswords[newEngine.Id] = string.Empty;
_remoteErrors[newEngine.Id] = string.Empty;
_remoteConnecting[newEngine.Id] = false;
}
if (ValuesChanged.HasDelegate)
await ValuesChanged.InvokeAsync(ServerEngines);
}
async Task Remove(ServerEngineConfiguration serverEngine)
{
ServerEngines.Remove(serverEngine);
_remoteUsernames.Remove(serverEngine.Id);
_remotePasswords.Remove(serverEngine.Id);
_remoteErrors.Remove(serverEngine.Id);
_remoteConnecting.Remove(serverEngine.Id);
if (ValuesChanged.HasDelegate)
await ValuesChanged.InvokeAsync(ServerEngines);
}
async Task Connect(ServerEngineConfiguration serverEngine)
{
_remoteConnecting[serverEngine.Id] = true;
_remoteErrors[serverEngine.Id] = string.Empty;
await InvokeAsync(StateHasChanged);
var username = _remoteUsernames.GetValueOrDefault(serverEngine.Id, string.Empty);
var password = _remotePasswords.GetValueOrDefault(serverEngine.Id, string.Empty);
var error = await RemoteServerEngine.AuthenticateAsync(serverEngine.Id, username, password);
if (!string.IsNullOrWhiteSpace(error))
_remoteErrors[serverEngine.Id] = error;
_remoteConnecting[serverEngine.Id] = false;
await InvokeAsync(StateHasChanged);
}
}