From 25770c24262f8bd80b8f0090884178b02b676de9 Mon Sep 17 00:00:00 2001 From: Craig Raw Date: Thu, 5 Jun 2025 09:40:17 +0200 Subject: [PATCH] suggest connecting to broadcast a finalized transaction if offlineand a server is configured --- .../sparrow/control/ConfirmationAlert.java | 39 +++++++++++++++++++ .../com/sparrowwallet/sparrow/io/Config.java | 11 ++++++ .../transaction/HeadersController.java | 17 ++++++++ 3 files changed, 67 insertions(+) create mode 100644 src/main/java/com/sparrowwallet/sparrow/control/ConfirmationAlert.java diff --git a/src/main/java/com/sparrowwallet/sparrow/control/ConfirmationAlert.java b/src/main/java/com/sparrowwallet/sparrow/control/ConfirmationAlert.java new file mode 100644 index 00000000..3fa613b0 --- /dev/null +++ b/src/main/java/com/sparrowwallet/sparrow/control/ConfirmationAlert.java @@ -0,0 +1,39 @@ +package com.sparrowwallet.sparrow.control; + +import com.sparrowwallet.sparrow.AppServices; +import javafx.geometry.Insets; +import javafx.scene.control.Alert; +import javafx.scene.control.ButtonType; +import javafx.scene.control.CheckBox; +import javafx.scene.control.Label; +import javafx.scene.layout.VBox; + +import static com.sparrowwallet.sparrow.AppServices.getActiveWindow; +import static com.sparrowwallet.sparrow.AppServices.setStageIcon; + +public class ConfirmationAlert extends Alert { + private final CheckBox dontAskAgain; + + public ConfirmationAlert(String title, String contentText, ButtonType... buttons) { + super(AlertType.CONFIRMATION, contentText, buttons); + + initOwner(getActiveWindow()); + setStageIcon(getDialogPane().getScene().getWindow()); + getDialogPane().getScene().getStylesheets().add(AppServices.class.getResource("general.css").toExternalForm()); + setTitle(title); + setHeaderText(title); + + VBox contentBox = new VBox(20); + contentBox.setPadding(new Insets(10, 20, 10, 20)); + Label contentLabel = new Label(contentText); + contentLabel.setWrapText(true); + dontAskAgain = new CheckBox("Don't ask again"); + contentBox.getChildren().addAll(contentLabel, dontAskAgain); + + getDialogPane().setContent(contentBox); + } + + public boolean isDontAskAgain() { + return dontAskAgain.isSelected(); + } +} diff --git a/src/main/java/com/sparrowwallet/sparrow/io/Config.java b/src/main/java/com/sparrowwallet/sparrow/io/Config.java index 0a04de2a..fa375aab 100644 --- a/src/main/java/com/sparrowwallet/sparrow/io/Config.java +++ b/src/main/java/com/sparrowwallet/sparrow/io/Config.java @@ -52,6 +52,7 @@ public class Config { private boolean showDeprecatedImportExport = false; private boolean signBsmsExports = false; private boolean preventSleep = false; + private Boolean connectToBroadcast; private List recentWalletFiles; private Integer keyDerivationPeriod; private long dustAttackThreshold = DUST_ATTACK_THRESHOLD_SATS; @@ -348,6 +349,16 @@ public class Config { public void setPreventSleep(boolean preventSleep) { this.preventSleep = preventSleep; + flush(); + } + + public Boolean getConnectToBroadcast() { + return connectToBroadcast; + } + + public void setConnectToBroadcast(Boolean connectToBroadcast) { + this.connectToBroadcast = connectToBroadcast; + flush(); } public List getRecentWalletFiles() { diff --git a/src/main/java/com/sparrowwallet/sparrow/transaction/HeadersController.java b/src/main/java/com/sparrowwallet/sparrow/transaction/HeadersController.java index 967d2386..4fd6b76e 100644 --- a/src/main/java/com/sparrowwallet/sparrow/transaction/HeadersController.java +++ b/src/main/java/com/sparrowwallet/sparrow/transaction/HeadersController.java @@ -1559,6 +1559,23 @@ public class HeadersController extends TransactionFormController implements Init signButtonBox.setVisible(false); broadcastButtonBox.setVisible(true); + + if(Config.get().hasServer() && !AppServices.isConnected() && !AppServices.isConnecting()) { + if(Config.get().getConnectToBroadcast() == null) { + Platform.runLater(() -> { + ConfirmationAlert confirmationAlert = new ConfirmationAlert("Connect to broadcast?", "Connect to the configured server to broadcast the transaction?", ButtonType.NO, ButtonType.YES); + Optional optType = confirmationAlert.showAndWait(); + if(confirmationAlert.isDontAskAgain() && optType.isPresent()) { + Config.get().setConnectToBroadcast(optType.get() == ButtonType.YES); + } + if(optType.isPresent() && optType.get() == ButtonType.YES) { + EventManager.get().post(new RequestConnectEvent()); + } + }); + } else if(Config.get().getConnectToBroadcast()) { + Platform.runLater(() -> EventManager.get().post(new RequestConnectEvent())); + } + } } }