From 4d1ee3fc9b008cf9ef55f410657d9855766aaba2 Mon Sep 17 00:00:00 2001 From: Christoph Atteneder Date: Thu, 2 Dec 2021 13:39:11 +0100 Subject: [PATCH] Add support to duplicate bsq swap offers --- .../offer/bsq_swap/BsqSwapOfferModel.java | 13 ++++++- .../offer/bsq_swap/BsqSwapTakeOfferModel.java | 10 +----- .../bisq/desktop/main/offer/OfferView.java | 9 +++-- .../BsqSwapCreateOfferDataModel.java | 5 +-- .../create_offer/BsqSwapCreateOfferView.java | 8 +++-- .../BsqSwapCreateOfferViewModel.java | 34 +++++++++++++++++-- .../desktop/main/portfolio/PortfolioView.java | 18 ++++++++-- .../duplicateoffer/DuplicateOfferView.java | 4 +-- .../DuplicateOfferViewModel.java | 4 +-- 9 files changed, 79 insertions(+), 26 deletions(-) diff --git a/core/src/main/java/bisq/core/offer/bsq_swap/BsqSwapOfferModel.java b/core/src/main/java/bisq/core/offer/bsq_swap/BsqSwapOfferModel.java index 33b3f963cd..9046363963 100644 --- a/core/src/main/java/bisq/core/offer/bsq_swap/BsqSwapOfferModel.java +++ b/core/src/main/java/bisq/core/offer/bsq_swap/BsqSwapOfferModel.java @@ -25,6 +25,7 @@ import bisq.core.btc.wallet.BsqWalletService; import bisq.core.btc.wallet.BtcWalletService; import bisq.core.monetary.Price; import bisq.core.monetary.Volume; +import bisq.core.offer.Offer; import bisq.core.offer.OfferDirection; import bisq.core.offer.OfferUtil; import bisq.core.payment.payload.PaymentMethod; @@ -124,10 +125,20 @@ public class BsqSwapOfferModel { // API /////////////////////////////////////////////////////////////////////////////////////////// - public void init(OfferDirection direction, boolean isMaker) { + public void init(OfferDirection direction, boolean isMaker, Offer offer) { this.direction = direction; this.isMaker = isMaker; + if (offer != null) { + setPrice(offer.getPrice()); + + setBtcAmount(Coin.valueOf(Math.min(offer.getAmount().value, getMaxTradeLimit()))); + calculateVolumeForAmount(getBtcAmount()); + + setMinAmount(offer.getMinAmount()); + calculateMinVolume(); + } + createListeners(); applyTxFeePerVbyte(); diff --git a/core/src/main/java/bisq/core/offer/bsq_swap/BsqSwapTakeOfferModel.java b/core/src/main/java/bisq/core/offer/bsq_swap/BsqSwapTakeOfferModel.java index 266cc2a856..7988186840 100644 --- a/core/src/main/java/bisq/core/offer/bsq_swap/BsqSwapTakeOfferModel.java +++ b/core/src/main/java/bisq/core/offer/bsq_swap/BsqSwapTakeOfferModel.java @@ -67,17 +67,9 @@ public class BsqSwapTakeOfferModel extends BsqSwapOfferModel { /////////////////////////////////////////////////////////////////////////////////////////// public void initWithData(Offer offer) { - super.init(offer.getDirection(), false); + super.init(offer.getDirection(), false, offer); this.offer = offer; - setPrice(offer.getPrice()); - - setBtcAmount(Coin.valueOf(Math.min(offer.getAmount().value, getMaxTradeLimit()))); - calculateVolumeForAmount(getBtcAmount()); - - setMinAmount(offer.getMinAmount()); - calculateMinVolume(); - offer.resetState(); } diff --git a/desktop/src/main/java/bisq/desktop/main/offer/OfferView.java b/desktop/src/main/java/bisq/desktop/main/offer/OfferView.java index cb61fe568b..1aad98f66a 100644 --- a/desktop/src/main/java/bisq/desktop/main/offer/OfferView.java +++ b/desktop/src/main/java/bisq/desktop/main/offer/OfferView.java @@ -37,6 +37,7 @@ import bisq.core.locale.Res; import bisq.core.locale.TradeCurrency; import bisq.core.offer.Offer; import bisq.core.offer.OfferDirection; +import bisq.core.offer.bsq_swap.BsqSwapOfferPayload; import bisq.core.payment.payload.PaymentMethod; import bisq.core.support.dispute.arbitration.arbitrator.ArbitratorManager; import bisq.core.user.Preferences; @@ -56,6 +57,8 @@ import java.util.List; import java.util.Optional; import java.util.stream.Collectors; +import javax.annotation.Nullable; + public abstract class OfferView extends ActivatableView { private OfferBookView offerBookView; @@ -102,7 +105,7 @@ public abstract class OfferView extends ActivatableView { protected void initialize() { navigationListener = (viewPath, data) -> { if (viewPath.size() == 3 && viewPath.indexOf(this.getClass()) == 1) - loadView(viewPath.tip()); + loadView(viewPath.tip(), data); }; tabChangeListener = (observableValue, oldValue, newValue) -> { if (newValue != null) { @@ -198,7 +201,7 @@ public abstract class OfferView extends ActivatableView { return Res.get("offerbook.takeOffer").toUpperCase(); } - private void loadView(Class viewClass) { + private void loadView(Class viewClass, @Nullable Object data) { TabPane tabPane = root; tabPane.setTabClosingPolicy(TabPane.TabClosingPolicy.ALL_TABS); View view; @@ -237,7 +240,7 @@ public abstract class OfferView extends ActivatableView { } else if (viewClass == BsqSwapCreateOfferView.class && bsqSwapCreateOfferView == null) { view = viewLoader.load(viewClass); bsqSwapCreateOfferView = (BsqSwapCreateOfferView) view; - bsqSwapCreateOfferView.initWithData(direction, offerActionHandler); + bsqSwapCreateOfferView.initWithData(direction, offerActionHandler, (BsqSwapOfferPayload) data); createOfferPane = bsqSwapCreateOfferView.getRoot(); createOfferTab = new Tab(getCreateOfferTabName(viewClass)); createOfferTab.setClosable(true); diff --git a/desktop/src/main/java/bisq/desktop/main/offer/bsq_swap/create_offer/BsqSwapCreateOfferDataModel.java b/desktop/src/main/java/bisq/desktop/main/offer/bsq_swap/create_offer/BsqSwapCreateOfferDataModel.java index b17cccf725..57ba523b0b 100644 --- a/desktop/src/main/java/bisq/desktop/main/offer/bsq_swap/create_offer/BsqSwapCreateOfferDataModel.java +++ b/desktop/src/main/java/bisq/desktop/main/offer/bsq_swap/create_offer/BsqSwapCreateOfferDataModel.java @@ -28,6 +28,7 @@ import bisq.core.offer.Offer; import bisq.core.offer.OfferDirection; import bisq.core.offer.OfferUtil; import bisq.core.offer.bsq_swap.BsqSwapOfferModel; +import bisq.core.offer.bsq_swap.BsqSwapOfferPayload; import bisq.core.offer.bsq_swap.OpenBsqSwapOfferService; import bisq.core.payment.PaymentAccount; import bisq.core.user.User; @@ -91,8 +92,8 @@ class BsqSwapCreateOfferDataModel extends BsqSwapOfferDataModel { // API /////////////////////////////////////////////////////////////////////////////////////////// - void initWithData(OfferDirection direction) { - bsqSwapOfferModel.init(direction, true); + void initWithData(OfferDirection direction, BsqSwapOfferPayload offerPayload) { + bsqSwapOfferModel.init(direction, true, offerPayload != null ? new Offer(offerPayload) : null); fillPaymentAccounts(); applyPaymentAccount(); diff --git a/desktop/src/main/java/bisq/desktop/main/offer/bsq_swap/create_offer/BsqSwapCreateOfferView.java b/desktop/src/main/java/bisq/desktop/main/offer/bsq_swap/create_offer/BsqSwapCreateOfferView.java index 16e4210b94..db13cc9d3c 100644 --- a/desktop/src/main/java/bisq/desktop/main/offer/bsq_swap/create_offer/BsqSwapCreateOfferView.java +++ b/desktop/src/main/java/bisq/desktop/main/offer/bsq_swap/create_offer/BsqSwapCreateOfferView.java @@ -37,6 +37,7 @@ import bisq.desktop.util.Layout; import bisq.core.locale.CurrencyUtil; import bisq.core.locale.Res; import bisq.core.offer.OfferDirection; +import bisq.core.offer.bsq_swap.BsqSwapOfferPayload; import bisq.core.payment.PaymentAccount; import bisq.core.user.DontShowAgainLookup; @@ -159,9 +160,12 @@ public class BsqSwapCreateOfferView extends BsqSwapOfferView btcMinAmount = dataModel.getMinAmount(); + if (btcMinAmount.get() != null) { + minAmountAsCoinListener.changed(btcMinAmount, null, btcMinAmount.get()); + } + + ObjectProperty btcAmount = dataModel.getBtcAmount(); + + if (btcAmount.get() != null && btcAmount.get() != null) { + syncMinAmountWithAmount = btcMinAmount.get().equals(dataModel.getBtcAmount().get()); + } + + if (btcAmount.get() != null) { + amountAsCoinListener.changed(btcAmount, null, btcAmount.get()); + } + + ObjectProperty price = dataModel.getPrice(); + if (price.get() != null) { + priceListener.changed(price, null, price.get()); + } + + ObjectProperty volume = dataModel.getVolume(); + if (volume.get() != null) { + volumeListener.changed(volume, null, volume.get()); + } + } + private void stopTimeoutTimer() { if (timeoutTimer != null) { timeoutTimer.stop(); diff --git a/desktop/src/main/java/bisq/desktop/main/portfolio/PortfolioView.java b/desktop/src/main/java/bisq/desktop/main/portfolio/PortfolioView.java index 08ed465c05..84bad05342 100644 --- a/desktop/src/main/java/bisq/desktop/main/portfolio/PortfolioView.java +++ b/desktop/src/main/java/bisq/desktop/main/portfolio/PortfolioView.java @@ -23,6 +23,9 @@ import bisq.desktop.common.view.CachingViewLoader; import bisq.desktop.common.view.FxmlView; import bisq.desktop.common.view.View; import bisq.desktop.main.MainView; +import bisq.desktop.main.offer.BuyOfferView; +import bisq.desktop.main.offer.SellOfferView; +import bisq.desktop.main.offer.bsq_swap.create_offer.BsqSwapCreateOfferView; import bisq.desktop.main.portfolio.bsqswaps.UnconfirmedBsqSwapsView; import bisq.desktop.main.portfolio.closedtrades.ClosedTradesView; import bisq.desktop.main.portfolio.duplicateoffer.DuplicateOfferView; @@ -32,8 +35,10 @@ import bisq.desktop.main.portfolio.openoffer.OpenOffersView; import bisq.desktop.main.portfolio.pendingtrades.PendingTradesView; import bisq.core.locale.Res; +import bisq.core.offer.OfferDirection; +import bisq.core.offer.OfferPayloadBase; import bisq.core.offer.OpenOffer; -import bisq.core.offer.bisq_v1.OfferPayload; +import bisq.core.offer.bsq_swap.BsqSwapOfferPayload; import bisq.core.trade.bisq_v1.FailedTradesManager; import bisq.core.trade.model.bisq_v1.Trade; @@ -228,11 +233,18 @@ public class PortfolioView extends ActivatableView { selectOpenOffersView((OpenOffersView) view); } } else if (view instanceof DuplicateOfferView) { - if (duplicateOfferView == null && data instanceof OfferPayload) { + if (duplicateOfferView == null && data instanceof OfferPayloadBase) { + // Switch to create BSQ swap offer + if (data instanceof BsqSwapOfferPayload) { + var offerViewClass = ((BsqSwapOfferPayload) data).getDirection() == OfferDirection.BUY ? BuyOfferView.class : SellOfferView.class; + navigation.navigateToWithData(data, MainView.class, offerViewClass, BsqSwapCreateOfferView.class); + return; + } + viewLoader.removeFromCache(viewClass); // remove cached dialog view = viewLoader.load(viewClass); // and load a fresh one duplicateOfferView = (DuplicateOfferView) view; - duplicateOfferView.initWithData((OfferPayload) data); + duplicateOfferView.initWithData((OfferPayloadBase) data); duplicateOfferTab = new Tab(Res.get("portfolio.tab.duplicateOffer").toUpperCase()); duplicateOfferView.setCloseHandler(() -> { root.getTabs().remove(duplicateOfferTab); diff --git a/desktop/src/main/java/bisq/desktop/main/portfolio/duplicateoffer/DuplicateOfferView.java b/desktop/src/main/java/bisq/desktop/main/portfolio/duplicateoffer/DuplicateOfferView.java index db6eb38ba1..5fdad85116 100644 --- a/desktop/src/main/java/bisq/desktop/main/portfolio/duplicateoffer/DuplicateOfferView.java +++ b/desktop/src/main/java/bisq/desktop/main/portfolio/duplicateoffer/DuplicateOfferView.java @@ -23,7 +23,7 @@ import bisq.desktop.main.offer.bisq_v1.MutableOfferView; import bisq.desktop.main.overlays.windows.OfferDetailsWindow; import bisq.core.locale.CurrencyUtil; -import bisq.core.offer.bisq_v1.OfferPayload; +import bisq.core.offer.OfferPayloadBase; import bisq.core.user.Preferences; import bisq.core.util.FormattingUtils; import bisq.core.util.coin.BsqFormatter; @@ -61,7 +61,7 @@ public class DuplicateOfferView extends MutableOfferView