fix hanging while posting or canceling offer

This commit is contained in:
woodser 2025-04-18 16:44:33 -04:00
parent 39909e7936
commit 67ee13809f
No known key found for this signature in database
GPG Key ID: 55A10DD48ADEE5EF
3 changed files with 32 additions and 32 deletions

View File

@ -37,7 +37,6 @@ package haveno.core.xmr;
import com.google.inject.Inject;
import haveno.common.ThreadUtils;
import haveno.common.UserThread;
import haveno.core.api.model.XmrBalanceInfo;
import haveno.core.offer.OpenOffer;
import haveno.core.offer.OpenOfferManager;
@ -163,18 +162,12 @@ public class Balances {
// calculate reserved balance
reservedBalance = reservedOfferBalance.add(reservedTradeBalance);
// play sound if funds received
boolean fundsReceived = balanceSumBefore != null && getNonTradeBalanceSum().compareTo(balanceSumBefore) > 0;
if (fundsReceived) HavenoUtils.playCashRegisterSound();
// notify balance update
UserThread.execute(() -> {
// check if funds received
boolean fundsReceived = balanceSumBefore != null && getNonTradeBalanceSum().compareTo(balanceSumBefore) > 0;
if (fundsReceived) {
HavenoUtils.playCashRegisterSound();
}
// increase counter to notify listeners
updateCounter.set(updateCounter.get() + 1);
});
updateCounter.set(updateCounter.get() + 1);
}
}
}

View File

@ -353,7 +353,7 @@ public class MainView extends InitializableView<StackPane, MainViewModel> {
settingsButtonWithBadge.getStyleClass().add("new");
navigation.addListener((viewPath, data) -> {
UserThread.await(() -> {
UserThread.await(() -> { // TODO: this uses `await` to fix nagivation link from market view to offer book, but await can cause hanging, so execute should be used
if (viewPath.size() != 2 || viewPath.indexOf(MainView.class) != 0) return;
Class<? extends View> viewClass = viewPath.tip();

View File

@ -19,6 +19,8 @@ package haveno.desktop.main.offer;
import com.google.inject.Inject;
import com.google.inject.name.Named;
import haveno.common.ThreadUtils;
import haveno.common.UserThread;
import haveno.common.app.DevEnv;
import haveno.common.handlers.ErrorMessageHandler;
@ -108,7 +110,7 @@ public abstract class MutableOfferViewModel<M extends MutableOfferDataModel> ext
private String amountDescription;
private String addressAsString;
private final String paymentLabel;
private boolean createOfferRequested;
private boolean createOfferInProgress;
public boolean createOfferCanceled;
public final StringProperty amount = new SimpleStringProperty();
@ -638,32 +640,37 @@ public abstract class MutableOfferViewModel<M extends MutableOfferDataModel> ext
///////////////////////////////////////////////////////////////////////////////////////////
void onPlaceOffer(Offer offer, Runnable resultHandler) {
errorMessage.set(null);
createOfferRequested = true;
createOfferCanceled = false;
dataModel.onPlaceOffer(offer, transaction -> {
resultHandler.run();
if (!createOfferCanceled) placeOfferCompleted.set(true);
ThreadUtils.execute(() -> {
errorMessage.set(null);
}, errMessage -> {
createOfferRequested = false;
if (offer.getState() == Offer.State.OFFER_FEE_RESERVED) errorMessage.set(errMessage + Res.get("createOffer.errorInfo"));
else errorMessage.set(errMessage);
createOfferInProgress = true;
createOfferCanceled = false;
dataModel.onPlaceOffer(offer, transaction -> {
createOfferInProgress = false;
resultHandler.run();
if (!createOfferCanceled) placeOfferCompleted.set(true);
errorMessage.set(null);
}, errMessage -> {
createOfferInProgress = false;
if (offer.getState() == Offer.State.OFFER_FEE_RESERVED) errorMessage.set(errMessage + Res.get("createOffer.errorInfo"));
else errorMessage.set(errorMessage.get());
UserThread.execute(() -> {
updateButtonDisableState();
updateSpinnerInfo();
resultHandler.run();
});
});
UserThread.execute(() -> {
updateButtonDisableState();
updateSpinnerInfo();
resultHandler.run();
});
});
updateButtonDisableState();
updateSpinnerInfo();
}, getClass().getSimpleName());
}
public void onCancelOffer(ResultHandler resultHandler, ErrorMessageHandler errorMessageHandler) {
createOfferRequested = false;
log.info("Canceling posting offer {}", offer.getId());
createOfferCanceled = true;
OpenOfferManager openOfferManager = HavenoUtils.openOfferManager;
Optional<OpenOffer> openOffer = openOfferManager.getOpenOffer(offer.getId());
@ -1355,7 +1362,7 @@ public abstract class MutableOfferViewModel<M extends MutableOfferDataModel> ext
inputDataValid = inputDataValid && getExtraInfoValidationResult().isValid;
isNextButtonDisabled.set(!inputDataValid);
isPlaceOfferButtonDisabled.set(createOfferRequested || !inputDataValid || !dataModel.getIsXmrWalletFunded().get());
isPlaceOfferButtonDisabled.set(createOfferInProgress || !inputDataValid || !dataModel.getIsXmrWalletFunded().get());
}
private ValidationResult getExtraInfoValidationResult() {