feat(gui): split server discovery into its own always-usable button
Previously the server settings overlay had only "Connect and sync" and "Reset certs" — peer discovery had no button and only ran implicitly when reopening the dialog while connected. Add a dedicated "Sincronizza" button wired to DiscoverServersCommand, and make it work even without an active connection by opening a short-lived connection to a candidate server just to query its peer list, then closing it without touching the wallet's connection state.
This commit is contained in:
@@ -169,9 +169,9 @@ public sealed class Loc
|
|||||||
// Wallet panel
|
// Wallet panel
|
||||||
["wallet.close"] = ["Chiudi wallet", "Close wallet", "Cerrar wallet", "Fermer le wallet", "Fechar carteira", "Wallet schließen"],
|
["wallet.close"] = ["Chiudi wallet", "Close wallet", "Cerrar wallet", "Fermer le wallet", "Fechar carteira", "Wallet schließen"],
|
||||||
["wallet.server"] = ["Server:", "Server:", "Servidor:", "Serveur :", "Servidor:", "Server:"],
|
["wallet.server"] = ["Server:", "Server:", "Servidor:", "Serveur :", "Servidor:", "Server:"],
|
||||||
["wallet.connect"] = ["Connetti e sincronizza", "Connect and sync", "Conectar y sincronizar", "Connecter et synchroniser", "Conectar e sincronizar", "Verbinden und synchronisieren"],
|
["wallet.connect"] = ["Connetti", "Connect", "Conectar", "Connecter", "Conectar", "Verbinden"],
|
||||||
["wallet.manual"] = ["oppure host:porta manuale", "or manual host:port", "o host:puerto manual", "ou hôte:port manuel", "ou host:porta manual", "oder manuell host:port"],
|
["wallet.manual"] = ["oppure host:porta manuale", "or manual host:port", "o host:puerto manual", "ou hôte:port manuel", "ou host:porta manual", "oder manuell host:port"],
|
||||||
["wallet.discover"] = ["Cerca altri server", "Discover servers", "Buscar otros servidores", "Rechercher des serveurs", "Procurar servidores", "Server suchen"],
|
["wallet.discover"] = ["Sincronizza", "Sync servers", "Sincronizar", "Synchroniser", "Sincronizar", "Synchronisieren"],
|
||||||
["wallet.resetcert"] = ["Reset cert.", "Reset certs", "Restablecer cert.", "Réinit. cert.", "Redefinir cert.", "Zert. zurücksetzen"],
|
["wallet.resetcert"] = ["Reset cert.", "Reset certs", "Restablecer cert.", "Réinit. cert.", "Redefinir cert.", "Zert. zurücksetzen"],
|
||||||
["tab.receive"] = ["Ricevi", "Receive", "Recibir", "Recevoir", "Receber", "Empfangen"],
|
["tab.receive"] = ["Ricevi", "Receive", "Recibir", "Recevoir", "Receber", "Empfangen"],
|
||||||
["tab.history"] = ["Storico", "History", "Historial", "Historique", "Histórico", "Verlauf"],
|
["tab.history"] = ["Storico", "History", "Historial", "Historique", "Histórico", "Verlauf"],
|
||||||
|
|||||||
@@ -345,17 +345,57 @@ public partial class MainWindowViewModel
|
|||||||
_ = ConnectAndSync();
|
_ = ConnectAndSync();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Peer discovery. Always clickable: if the wallet is already connected, it reuses
|
||||||
|
/// that connection; otherwise it opens a short-lived connection to a candidate server
|
||||||
|
/// just to query its peer list, without touching the wallet's connection state.
|
||||||
|
/// </summary>
|
||||||
[RelayCommand]
|
[RelayCommand]
|
||||||
private async Task DiscoverServers()
|
private async Task DiscoverServers()
|
||||||
{
|
{
|
||||||
if (_client is null || !_client.IsConnected)
|
if (_client is { IsConnected: true } connected)
|
||||||
{
|
{
|
||||||
StatusMessage = Loc.Tr("conn.none") + ".";
|
await DiscoverServersUsing(connected);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
var (host, port) = ParseServer();
|
||||||
|
ElectrumClient? temp = null;
|
||||||
|
Exception? lastError = null;
|
||||||
|
foreach (var (h, p) in BuildServerCandidates(host, port))
|
||||||
|
{
|
||||||
|
try
|
||||||
|
{
|
||||||
|
var pins = new CertificatePinStore(AppPaths.CertificatePinsPath(Net));
|
||||||
|
temp = await ElectrumClient.ConnectAsync(h, p, UseSsl, pins);
|
||||||
|
lastError = null;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
catch (Exception ex)
|
||||||
|
{
|
||||||
|
lastError = ex;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if (temp is null)
|
||||||
|
{
|
||||||
|
StatusMessage = $"Errore nella scoperta peer: {lastError?.Message ?? Loc.Tr("conn.none")}";
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
try
|
try
|
||||||
{
|
{
|
||||||
var added = await Registry.DiscoverAsync(_client);
|
await DiscoverServersUsing(temp);
|
||||||
|
}
|
||||||
|
finally
|
||||||
|
{
|
||||||
|
await temp.DisposeAsync();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
private async Task DiscoverServersUsing(ElectrumClient client)
|
||||||
|
{
|
||||||
|
try
|
||||||
|
{
|
||||||
|
var added = await Registry.DiscoverAsync(client);
|
||||||
var selected = SelectedKnownServer;
|
var selected = SelectedKnownServer;
|
||||||
RefreshServers();
|
RefreshServers();
|
||||||
SelectedKnownServer = KnownServers.FirstOrDefault(s => s.Host == selected?.Host)
|
SelectedKnownServer = KnownServers.FirstOrDefault(s => s.Host == selected?.Host)
|
||||||
|
|||||||
@@ -1237,6 +1237,8 @@
|
|||||||
<StackPanel Orientation="Horizontal" Spacing="8" IsVisible="{Binding IsDesktop}">
|
<StackPanel Orientation="Horizontal" Spacing="8" IsVisible="{Binding IsDesktop}">
|
||||||
<Button Content="{Binding Loc[wallet.connect]}" Classes="accent"
|
<Button Content="{Binding Loc[wallet.connect]}" Classes="accent"
|
||||||
Command="{Binding ConnectAndSyncCommand}"/>
|
Command="{Binding ConnectAndSyncCommand}"/>
|
||||||
|
<Button Content="{Binding Loc[wallet.discover]}"
|
||||||
|
Command="{Binding DiscoverServersCommand}"/>
|
||||||
<Button Content="{Binding Loc[wallet.resetcert]}"
|
<Button Content="{Binding Loc[wallet.resetcert]}"
|
||||||
Command="{Binding ResetCertificatesCommand}"/>
|
Command="{Binding ResetCertificatesCommand}"/>
|
||||||
</StackPanel>
|
</StackPanel>
|
||||||
@@ -1245,6 +1247,9 @@
|
|||||||
<Button Content="{Binding Loc[wallet.connect]}" Classes="accent"
|
<Button Content="{Binding Loc[wallet.connect]}" Classes="accent"
|
||||||
Command="{Binding ConnectAndSyncCommand}"
|
Command="{Binding ConnectAndSyncCommand}"
|
||||||
HorizontalAlignment="Stretch" HorizontalContentAlignment="Center"/>
|
HorizontalAlignment="Stretch" HorizontalContentAlignment="Center"/>
|
||||||
|
<Button Content="{Binding Loc[wallet.discover]}"
|
||||||
|
Command="{Binding DiscoverServersCommand}"
|
||||||
|
HorizontalAlignment="Stretch" HorizontalContentAlignment="Center"/>
|
||||||
<Button Content="{Binding Loc[wallet.resetcert]}"
|
<Button Content="{Binding Loc[wallet.resetcert]}"
|
||||||
Command="{Binding ResetCertificatesCommand}"
|
Command="{Binding ResetCertificatesCommand}"
|
||||||
HorizontalAlignment="Stretch" HorizontalContentAlignment="Center"/>
|
HorizontalAlignment="Stretch" HorizontalContentAlignment="Center"/>
|
||||||
|
|||||||
Reference in New Issue
Block a user