mirror of
https://github.com/RedWizardsLab/EchoHub.git
synced 2026-09-04 16:46:08 +02:00
- Created User, Channel, Message, and ServerInfo models with necessary properties. - Added DTOs for user profiles, server information, and message handling. - Implemented JWT authentication service for user login and token generation. - Developed Entity Framework Core DbContext for database interactions. - Introduced SignalR ChatHub for real-time messaging and presence tracking. - Implemented file storage and image to ASCII conversion services. - Set up CORS and middleware for API endpoints. - Created launch settings and development configuration for server and web projects.
229 lines
6.5 KiB
C#
229 lines
6.5 KiB
C#
using System.Collections.ObjectModel;
|
|
using EchoHub.Client.Config;
|
|
using Terminal.Gui.App;
|
|
using Terminal.Gui.Views;
|
|
using Terminal.Gui.ViewBase;
|
|
|
|
namespace EchoHub.Client.UI;
|
|
|
|
/// <summary>
|
|
/// Result returned from the connect dialog.
|
|
/// </summary>
|
|
public record ConnectDialogResult(string ServerUrl, string Username, string Password, bool IsRegister);
|
|
|
|
/// <summary>
|
|
/// A Terminal.Gui dialog for entering server connection and authentication details.
|
|
/// Includes a saved servers selector when saved servers are available.
|
|
/// </summary>
|
|
public sealed class ConnectDialog
|
|
{
|
|
/// <summary>
|
|
/// Shows the connect dialog with an optional list of saved servers.
|
|
/// Returns the result, or null if cancelled.
|
|
/// </summary>
|
|
public static ConnectDialogResult? Show(IApplication app, List<SavedServer>? savedServers = null)
|
|
{
|
|
ConnectDialogResult? result = null;
|
|
savedServers ??= [];
|
|
|
|
var hasSavedServers = savedServers.Count > 0;
|
|
var dialogHeight = hasSavedServers ? 20 : 16;
|
|
|
|
var dialog = new Dialog { Title = "Connect to Server", Width = 60, Height = dialogHeight };
|
|
|
|
int yOffset = 0;
|
|
|
|
// -- Saved Servers section (if any) -----------------------------------
|
|
ListView? savedServerList = null;
|
|
if (hasSavedServers)
|
|
{
|
|
var savedLabel = new Label
|
|
{
|
|
Text = "Saved Servers:",
|
|
X = 1,
|
|
Y = 1
|
|
};
|
|
dialog.Add(savedLabel);
|
|
|
|
var serverDisplayNames = savedServers
|
|
.Select(s => $"{s.Name} ({s.Username ?? "?"})")
|
|
.ToList();
|
|
|
|
savedServerList = new ListView
|
|
{
|
|
Source = new ListWrapper<string>(new ObservableCollection<string>(serverDisplayNames)),
|
|
X = 1,
|
|
Y = 2,
|
|
Width = Dim.Fill(2),
|
|
Height = 3
|
|
};
|
|
dialog.Add(savedServerList);
|
|
|
|
// Visual separator
|
|
var separator = new Label
|
|
{
|
|
Text = new string('-', 56),
|
|
X = 1,
|
|
Y = 5
|
|
};
|
|
dialog.Add(separator);
|
|
|
|
yOffset = 5;
|
|
}
|
|
|
|
// -- Manual entry fields ----------------------------------------------
|
|
var urlLabel = new Label
|
|
{
|
|
Text = "Server URL:",
|
|
X = 1,
|
|
Y = yOffset + 1
|
|
};
|
|
var urlField = new TextField
|
|
{
|
|
Text = "http://localhost:5000",
|
|
X = 15,
|
|
Y = yOffset + 1,
|
|
Width = Dim.Fill(2)
|
|
};
|
|
|
|
var userLabel = new Label
|
|
{
|
|
Text = "Username:",
|
|
X = 1,
|
|
Y = yOffset + 3
|
|
};
|
|
var userField = new TextField
|
|
{
|
|
Text = "",
|
|
X = 15,
|
|
Y = yOffset + 3,
|
|
Width = Dim.Fill(2)
|
|
};
|
|
|
|
var passLabel = new Label
|
|
{
|
|
Text = "Password:",
|
|
X = 1,
|
|
Y = yOffset + 5
|
|
};
|
|
var passField = new TextField
|
|
{
|
|
Text = "",
|
|
X = 15,
|
|
Y = yOffset + 5,
|
|
Width = Dim.Fill(2),
|
|
Secret = true
|
|
};
|
|
|
|
var displayLabel = new Label
|
|
{
|
|
Text = "Display Name:",
|
|
X = 1,
|
|
Y = yOffset + 7
|
|
};
|
|
var displayField = new TextField
|
|
{
|
|
Text = "",
|
|
X = 15,
|
|
Y = yOffset + 7,
|
|
Width = Dim.Fill(2)
|
|
};
|
|
|
|
var loginButton = new Button
|
|
{
|
|
Text = "Login",
|
|
IsDefault = true,
|
|
X = Pos.Center() - 20,
|
|
Y = yOffset + 9
|
|
};
|
|
|
|
var registerButton = new Button
|
|
{
|
|
Text = "Register",
|
|
X = Pos.Center() - 5,
|
|
Y = yOffset + 9
|
|
};
|
|
|
|
var cancelButton = new Button
|
|
{
|
|
Text = "Cancel",
|
|
X = Pos.Center() + 10,
|
|
Y = yOffset + 9
|
|
};
|
|
|
|
// Wire saved server selection to auto-fill fields
|
|
if (savedServerList is not null && savedServers.Count > 0)
|
|
{
|
|
savedServerList.ValueChanged += (sender, e) =>
|
|
{
|
|
var index = e.NewValue;
|
|
if (index.HasValue && index.Value >= 0 && index.Value < savedServers.Count)
|
|
{
|
|
var server = savedServers[index.Value];
|
|
urlField.Text = server.Url;
|
|
userField.Text = server.Username ?? "";
|
|
}
|
|
};
|
|
|
|
// Pre-fill with the first saved server
|
|
urlField.Text = savedServers[0].Url;
|
|
userField.Text = savedServers[0].Username ?? "";
|
|
}
|
|
|
|
loginButton.Accepting += (s, e) =>
|
|
{
|
|
var url = urlField.Text?.Trim() ?? string.Empty;
|
|
var user = userField.Text?.Trim() ?? string.Empty;
|
|
var pass = passField.Text ?? string.Empty;
|
|
|
|
if (string.IsNullOrEmpty(url) || string.IsNullOrEmpty(user) || string.IsNullOrEmpty(pass))
|
|
{
|
|
MessageBox.ErrorQuery(app, "Validation", "Server URL, username, and password are required.", "OK");
|
|
e.Handled = true;
|
|
return;
|
|
}
|
|
|
|
result = new ConnectDialogResult(url, user, pass, IsRegister: false);
|
|
e.Handled = true;
|
|
app.RequestStop();
|
|
};
|
|
|
|
registerButton.Accepting += (s, e) =>
|
|
{
|
|
var url = urlField.Text?.Trim() ?? string.Empty;
|
|
var user = userField.Text?.Trim() ?? string.Empty;
|
|
var pass = passField.Text ?? string.Empty;
|
|
|
|
if (string.IsNullOrEmpty(url) || string.IsNullOrEmpty(user) || string.IsNullOrEmpty(pass))
|
|
{
|
|
MessageBox.ErrorQuery(app, "Validation", "Server URL, username, and password are required.", "OK");
|
|
e.Handled = true;
|
|
return;
|
|
}
|
|
|
|
result = new ConnectDialogResult(url, user, pass, IsRegister: true);
|
|
e.Handled = true;
|
|
app.RequestStop();
|
|
};
|
|
|
|
cancelButton.Accepting += (s, e) =>
|
|
{
|
|
result = null;
|
|
e.Handled = true;
|
|
app.RequestStop();
|
|
};
|
|
|
|
dialog.Add(urlLabel, urlField, userLabel, userField, passLabel, passField,
|
|
displayLabel, displayField, loginButton, registerButton, cancelButton);
|
|
|
|
if (hasSavedServers && savedServerList is not null)
|
|
savedServerList.SetFocus();
|
|
else
|
|
urlField.SetFocus();
|
|
|
|
app.Run(dialog);
|
|
|
|
return result;
|
|
}
|
|
}
|