diff --git a/src/main/java/bisq/desktop/components/paymentmethods/HalCashForm.java b/src/main/java/bisq/desktop/components/paymentmethods/HalCashForm.java new file mode 100644 index 00000000000..fa9c2eeb836 --- /dev/null +++ b/src/main/java/bisq/desktop/components/paymentmethods/HalCashForm.java @@ -0,0 +1,112 @@ +/* + * This file is part of Bisq. + * + * Bisq is free software: you can redistribute it and/or modify it + * under the terms of the GNU Affero General Public License as published by + * the Free Software Foundation, either version 3 of the License, or (at + * your option) any later version. + * + * Bisq is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU Affero General Public + * License for more details. + * + * You should have received a copy of the GNU Affero General Public License + * along with Bisq. If not, see . + */ + +package bisq.desktop.components.paymentmethods; + +import bisq.desktop.components.InputTextField; +import bisq.desktop.util.Layout; +import bisq.desktop.util.validation.HalCashValidator; + +import bisq.core.locale.Res; +import bisq.core.locale.TradeCurrency; +import bisq.core.payment.AccountAgeWitnessService; +import bisq.core.payment.HalCashAccount; +import bisq.core.payment.PaymentAccount; +import bisq.core.payment.payload.HalCashAccountPayload; +import bisq.core.payment.payload.PaymentAccountPayload; +import bisq.core.util.BSFormatter; +import bisq.core.util.validation.InputValidator; + +import org.apache.commons.lang3.StringUtils; + +import javafx.scene.control.TextField; +import javafx.scene.layout.GridPane; + +import static bisq.desktop.util.FormBuilder.addLabelInputTextField; +import static bisq.desktop.util.FormBuilder.addLabelTextField; + +public class HalCashForm extends PaymentMethodForm { + private final HalCashAccount halCashAccount; + private final HalCashValidator halCashValidator; + private InputTextField mobileNrInputTextField; + + public static int addFormForBuyer(GridPane gridPane, int gridRow, + PaymentAccountPayload paymentAccountPayload) { + addLabelTextField(gridPane, ++gridRow, Res.get("payment.mobile"), + ((HalCashAccountPayload) paymentAccountPayload).getMobileNr()); + return gridRow; + } + + public HalCashForm(PaymentAccount paymentAccount, AccountAgeWitnessService accountAgeWitnessService, HalCashValidator halCashValidator, + InputValidator inputValidator, GridPane gridPane, int gridRow, BSFormatter formatter) { + super(paymentAccount, accountAgeWitnessService, inputValidator, gridPane, gridRow, formatter); + this.halCashAccount = (HalCashAccount) paymentAccount; + this.halCashValidator = halCashValidator; + } + + @Override + public void addFormForAddAccount() { + gridRowFrom = gridRow + 1; + + mobileNrInputTextField = addLabelInputTextField(gridPane, ++gridRow, + Res.get("payment.mobile")).second; + mobileNrInputTextField.setValidator(halCashValidator); + mobileNrInputTextField.textProperty().addListener((ov, oldValue, newValue) -> { + halCashAccount.setMobileNr(newValue); + updateFromInputs(); + }); + + TradeCurrency singleTradeCurrency = halCashAccount.getSingleTradeCurrency(); + String nameAndCode = singleTradeCurrency != null ? singleTradeCurrency.getNameAndCode() : "null"; + addLabelTextField(gridPane, ++gridRow, Res.getWithCol("shared.currency"), nameAndCode); + addLimitations(); + addAccountNameTextFieldWithAutoFillCheckBox(); + } + + @Override + protected void autoFillNameTextField() { + if (useCustomAccountNameCheckBox != null && !useCustomAccountNameCheckBox.isSelected()) { + String mobileNr = mobileNrInputTextField.getText(); + mobileNr = StringUtils.abbreviate(mobileNr, 9); + String method = Res.get(paymentAccount.getPaymentMethod().getId()); + accountNameTextField.setText(method.concat(": ").concat(mobileNr)); + } + } + + @Override + public void addFormForDisplayAccount() { + gridRowFrom = gridRow; + addLabelTextField(gridPane, gridRow, Res.get("payment.account.name"), + halCashAccount.getAccountName(), Layout.FIRST_ROW_AND_GROUP_DISTANCE); + addLabelTextField(gridPane, ++gridRow, Res.getWithCol("shared.paymentMethod"), + Res.get(halCashAccount.getPaymentMethod().getId())); + TextField field = addLabelTextField(gridPane, ++gridRow, Res.get("payment.mobile"), + halCashAccount.getMobileNr()).second; + field.setMouseTransparent(false); + TradeCurrency singleTradeCurrency = halCashAccount.getSingleTradeCurrency(); + String nameAndCode = singleTradeCurrency != null ? singleTradeCurrency.getNameAndCode() : "null"; + addLabelTextField(gridPane, ++gridRow, Res.getWithCol("shared.currency"), nameAndCode); + addLimitations(); + } + + @Override + public void updateAllInputsValid() { + allInputsValid.set(isAccountNameValid() + && halCashValidator.validate(halCashAccount.getMobileNr()).isValid + && halCashAccount.getTradeCurrencies().size() > 0); + } +} diff --git a/src/main/java/bisq/desktop/main/account/content/fiataccounts/FiatAccountsView.java b/src/main/java/bisq/desktop/main/account/content/fiataccounts/FiatAccountsView.java index 81b1bf63452..23303721097 100644 --- a/src/main/java/bisq/desktop/main/account/content/fiataccounts/FiatAccountsView.java +++ b/src/main/java/bisq/desktop/main/account/content/fiataccounts/FiatAccountsView.java @@ -29,6 +29,7 @@ import bisq.desktop.components.paymentmethods.ClearXchangeForm; import bisq.desktop.components.paymentmethods.F2FForm; import bisq.desktop.components.paymentmethods.FasterPaymentsForm; +import bisq.desktop.components.paymentmethods.HalCashForm; import bisq.desktop.components.paymentmethods.InteracETransferForm; import bisq.desktop.components.paymentmethods.MoneyBeamForm; import bisq.desktop.components.paymentmethods.MoneyGramForm; @@ -59,6 +60,7 @@ import bisq.desktop.util.validation.ChaseQuickPayValidator; import bisq.desktop.util.validation.ClearXchangeValidator; import bisq.desktop.util.validation.F2FValidator; +import bisq.desktop.util.validation.HalCashValidator; import bisq.desktop.util.validation.IBANValidator; import bisq.desktop.util.validation.InteracETransferValidator; import bisq.desktop.util.validation.MoneyBeamValidator; @@ -77,6 +79,7 @@ import bisq.core.payment.AccountAgeWitnessService; import bisq.core.payment.ClearXchangeAccount; import bisq.core.payment.F2FAccount; +import bisq.core.payment.HalCashAccount; import bisq.core.payment.MoneyGramAccount; import bisq.core.payment.PaymentAccount; import bisq.core.payment.PaymentAccountFactory; @@ -143,6 +146,7 @@ public class FiatAccountsView extends ActivatableViewAndModel doSaveNewAccount(paymentAccount)) .show(); + } else if (paymentAccount instanceof HalCashAccount) { + // HalCash has no chargeback risk so we don't show the text from payment.limits.info. + new Popup<>().information(Res.get("payment.halCash.info")) + .width(700) + .closeButtonText(Res.get("shared.cancel")) + .actionButtonText(Res.get("shared.iUnderstand")) + .onAction(() -> doSaveNewAccount(paymentAccount)) + .show(); } else { new Popup<>().information(Res.get("payment.limits.info", formatter.formatCoinWithCode(maxTradeLimitFirstMonth), @@ -499,6 +513,8 @@ private PaymentMethodForm getPaymentMethodForm(PaymentMethod paymentMethod, Paym return new WesternUnionForm(paymentAccount, accountAgeWitnessService, inputValidator, root, gridRow, formatter); case PaymentMethod.CASH_DEPOSIT_ID: return new CashDepositForm(paymentAccount, accountAgeWitnessService, inputValidator, root, gridRow, formatter); + case PaymentMethod.HAL_CASH_ID: + return new HalCashForm(paymentAccount, accountAgeWitnessService, halCashValidator, inputValidator, root, gridRow, formatter); case PaymentMethod.F2F_ID: return new F2FForm(paymentAccount, accountAgeWitnessService, f2FValidator, inputValidator, root, gridRow, formatter); default: diff --git a/src/main/java/bisq/desktop/main/offer/MutableOfferDataModel.java b/src/main/java/bisq/desktop/main/offer/MutableOfferDataModel.java index 8ffaa704490..f4798439a69 100644 --- a/src/main/java/bisq/desktop/main/offer/MutableOfferDataModel.java +++ b/src/main/java/bisq/desktop/main/offer/MutableOfferDataModel.java @@ -40,6 +40,7 @@ import bisq.core.payment.BankAccount; import bisq.core.payment.CountryBasedPaymentAccount; import bisq.core.payment.F2FAccount; +import bisq.core.payment.HalCashAccount; import bisq.core.payment.PaymentAccount; import bisq.core.payment.SameBankAccount; import bisq.core.payment.SepaAccount; @@ -307,7 +308,7 @@ void onTabSelected(boolean isSelected) { @SuppressWarnings("ConstantConditions") Offer createAndGetOffer() { - final boolean useMarketBasedPriceValue = isUseMarketBasedPriceValue(); + boolean useMarketBasedPriceValue = isUseMarketBasedPriceValue(); long priceAsLong = price.get() != null && !useMarketBasedPriceValue ? price.get().getValue() : 0L; String currencyCode = tradeCurrencyCode.get(); boolean isCryptoCurrency = CurrencyUtil.isCryptoCurrency(currencyCode); @@ -662,7 +663,13 @@ void calculateVolume() { !amount.get().isZero() && !price.get().isZero()) { try { - volume.set(price.get().getVolumeByAmount(amount.get())); + Volume volumeByAmount = price.get().getVolumeByAmount(amount.get()); + + // For HalCash we want multiple of 10 EUR + if (isHalCashAccount()) + volumeByAmount = OfferUtil.getAdjustedVolumeForHalCash(volumeByAmount); + + volume.set(volumeByAmount); } catch (Throwable t) { log.error(t.toString()); } @@ -678,7 +685,11 @@ void calculateAmount() { !price.get().isZero() && allowAmountUpdate) { try { - amount.set(formatter.reduceTo4Decimals(price.get().getAmountByVolume(volume.get()))); + Coin value = formatter.reduceTo4Decimals(price.get().getAmountByVolume(volume.get())); + if (isHalCashAccount()) + value = OfferUtil.getAdjustedAmountForHalCash(value, price.get(), getMaxTradeLimit()); + + amount.set(value); calculateTotalToPay(); } catch (Throwable t) { log.error(t.toString()); @@ -743,7 +754,7 @@ void setBuyerSecurityDeposit(Coin buyerSecurityDeposit) { } protected boolean isUseMarketBasedPriceValue() { - return marketPriceAvailable && useMarketBasedPrice.get(); + return marketPriceAvailable && useMarketBasedPrice.get() && !isHalCashAccount(); } /////////////////////////////////////////////////////////////////////////////////////////// @@ -813,4 +824,8 @@ public boolean isCurrencyForMakerFeeBtc() { public boolean isBsqForFeeAvailable() { return OfferUtil.isBsqForFeeAvailable(bsqWalletService, amount.get(), marketPriceAvailable, marketPriceMargin); } + + public boolean isHalCashAccount() { + return paymentAccount instanceof HalCashAccount; + } } diff --git a/src/main/java/bisq/desktop/main/offer/MutableOfferView.java b/src/main/java/bisq/desktop/main/offer/MutableOfferView.java index 3f119e1c493..77081501c4c 100644 --- a/src/main/java/bisq/desktop/main/offer/MutableOfferView.java +++ b/src/main/java/bisq/desktop/main/offer/MutableOfferView.java @@ -238,7 +238,7 @@ protected void doActivate() { onPaymentAccountsComboBoxSelected(); balanceTextField.setTargetAmount(model.getDataModel().totalToPayAsCoinProperty().get()); - updateMarketPriceAvailable(); + updatePriceToggle(); } } @@ -297,7 +297,7 @@ public void initWithData(OfferPayload.Direction direction, TradeCurrency tradeCu percentagePriceDescription.setText(Res.get("shared.aboveInPercent")); } - updateMarketPriceAvailable(); + updatePriceToggle(); if (!model.getDataModel().isMakerFeeValid() && model.getDataModel().getMakerFee() != null) showInsufficientBsqFundsForBtcFeePaymentPopup(); @@ -502,6 +502,8 @@ else if (tradeCurrencies.contains(model.getTradeCurrency())) } currencyComboBox.setOnAction(currencyComboBoxSelectionHandler); + + updatePriceToggle(); } private void onCurrencyComboBoxSelected() { @@ -703,7 +705,7 @@ private void createListeners() { } }; - marketPriceAvailableListener = (observable, oldValue, newValue) -> updateMarketPriceAvailable(); + marketPriceAvailableListener = (observable, oldValue, newValue) -> updatePriceToggle(); getShowWalletFundedNotificationListener = (observable, oldValue, newValue) -> { if (newValue) { @@ -756,15 +758,16 @@ private Label createPopoverLabel(String text) { return label; } - protected void updateMarketPriceAvailable() { + protected void updatePriceToggle() { int marketPriceAvailableValue = model.marketPriceAvailableProperty.get(); if (marketPriceAvailableValue > -1) { - boolean isMarketPriceAvailable = marketPriceAvailableValue == 1; - percentagePriceBox.setVisible(isMarketPriceAvailable); - percentagePriceBox.setManaged(isMarketPriceAvailable); - priceTypeToggleButton.setVisible(isMarketPriceAvailable); - priceTypeToggleButton.setManaged(isMarketPriceAvailable); - boolean fixedPriceSelected = !model.getDataModel().getUseMarketBasedPrice().get() || !isMarketPriceAvailable; + boolean showPriceToggle = marketPriceAvailableValue == 1 && + !model.getDataModel().isHalCashAccount(); + percentagePriceBox.setVisible(showPriceToggle); + percentagePriceBox.setManaged(showPriceToggle); + priceTypeToggleButton.setVisible(showPriceToggle); + priceTypeToggleButton.setManaged(showPriceToggle); + boolean fixedPriceSelected = !model.getDataModel().getUseMarketBasedPrice().get() || !showPriceToggle; updatePriceToggleButtons(fixedPriceSelected); } } diff --git a/src/main/java/bisq/desktop/main/offer/MutableOfferViewModel.java b/src/main/java/bisq/desktop/main/offer/MutableOfferViewModel.java index cf4c1b172db..a9af33a7bb0 100644 --- a/src/main/java/bisq/desktop/main/offer/MutableOfferViewModel.java +++ b/src/main/java/bisq/desktop/main/offer/MutableOfferViewModel.java @@ -45,6 +45,7 @@ import bisq.core.monetary.Volume; import bisq.core.offer.Offer; import bisq.core.offer.OfferPayload; +import bisq.core.offer.OfferUtil; import bisq.core.payment.PaymentAccount; import bisq.core.provider.price.MarketPrice; import bisq.core.provider.price.PriceFeedService; @@ -683,6 +684,8 @@ void onFocusOutAmountTextField(boolean oldValue, boolean newValue) { if (minAmount.get() != null) minAmountValidationResult.set(isBtcInputValid(minAmount.get())); } + // We want to trigger a recalculation of the volume + UserThread.execute(() -> onFocusOutVolumeTextField(true, false)); } } @@ -723,6 +726,14 @@ void onFocusOutPriceTextField(boolean oldValue, boolean newValue) { dataModel.calculateAmount(); applyMakerFee(); } + + // We want to trigger a recalculation of the volume and minAmount + UserThread.execute(() -> { + onFocusOutVolumeTextField(true, false); + // We also need to update minAmount + onFocusOutAmountTextField(true, false); + onFocusOutMinAmountTextField(true, false); + }); } } @@ -743,8 +754,16 @@ void onFocusOutVolumeTextField(boolean oldValue, boolean newValue) { if (result.isValid) { setVolumeToModel(); ignoreVolumeStringListener = true; - if (dataModel.getVolume().get() != null) - volume.set(btcFormatter.formatVolume(dataModel.getVolume().get())); + + Volume volume = dataModel.getVolume().get(); + if (volume != null) { + // For HalCash we want multiple of 10 EUR + if (dataModel.isHalCashAccount()) + volume = OfferUtil.getAdjustedVolumeForHalCash(volume); + + this.volume.set(btcFormatter.formatVolume(volume)); + } + ignoreVolumeStringListener = false; dataModel.calculateAmount(); @@ -947,9 +966,19 @@ public M getDataModel() { private void setAmountToModel() { if (amount.get() != null && !amount.get().isEmpty()) { - dataModel.setAmount(btcFormatter.parseToCoinWith4Decimals(amount.get())); - if (syncMinAmountWithAmount || dataModel.getMinAmount().get() == null || dataModel.getMinAmount().get().equals(Coin.ZERO)) { - minAmount.set(amount.get()); + Coin amount = btcFormatter.parseToCoinWith4Decimals(this.amount.get()); + + if (dataModel.isHalCashAccount() && dataModel.getPrice().get() != null) { + amount = OfferUtil.getAdjustedAmountForHalCash(amount, + dataModel.getPrice().get(), + dataModel.getMaxTradeLimit()); + } + + dataModel.setAmount(amount); + if (syncMinAmountWithAmount || + dataModel.getMinAmount().get() == null || + dataModel.getMinAmount().get().equals(Coin.ZERO)) { + minAmount.set(this.amount.get()); setMinAmountToModel(); } } else { @@ -958,10 +987,19 @@ private void setAmountToModel() { } private void setMinAmountToModel() { - if (minAmount.get() != null && !minAmount.get().isEmpty()) - dataModel.setMinAmount(btcFormatter.parseToCoinWith4Decimals(minAmount.get())); - else + if (minAmount.get() != null && !minAmount.get().isEmpty()) { + Coin minAmount = btcFormatter.parseToCoinWith4Decimals(this.minAmount.get()); + + if (dataModel.isHalCashAccount() && dataModel.getPrice().get() != null) { + minAmount = OfferUtil.getAdjustedAmountForHalCash(minAmount, + dataModel.getPrice().get(), + dataModel.getMaxTradeLimit()); + } + + dataModel.setMinAmount(minAmount); + } else { dataModel.setMinAmount(null); + } } private void setPriceToModel() { diff --git a/src/main/java/bisq/desktop/main/offer/takeoffer/TakeOfferDataModel.java b/src/main/java/bisq/desktop/main/offer/takeoffer/TakeOfferDataModel.java index 1573015a16e..cb2f2a81028 100644 --- a/src/main/java/bisq/desktop/main/offer/takeoffer/TakeOfferDataModel.java +++ b/src/main/java/bisq/desktop/main/offer/takeoffer/TakeOfferDataModel.java @@ -35,6 +35,7 @@ import bisq.core.monetary.Volume; import bisq.core.offer.Offer; import bisq.core.offer.OfferPayload; +import bisq.core.offer.OfferUtil; import bisq.core.payment.AccountAgeWitnessService; import bisq.core.payment.PaymentAccount; import bisq.core.payment.PaymentAccountUtil; @@ -490,8 +491,11 @@ void calculateVolume() { if (tradePrice != null && offer != null && amount.get() != null && !amount.get().isZero()) { - volume.set(tradePrice.getVolumeByAmount(amount.get())); - //volume.set(new ExchangeRate(tradePrice).coinToFiat(amountAsCoin.get())); + Volume volumeByAmount = tradePrice.getVolumeByAmount(amount.get()); + if (offer.getPaymentMethod().getId().equals(PaymentMethod.HAL_CASH_ID)) + volumeByAmount = OfferUtil.getAdjustedVolumeForHalCash(volumeByAmount); + + volume.set(volumeByAmount); updateBalance(); } diff --git a/src/main/java/bisq/desktop/main/offer/takeoffer/TakeOfferViewModel.java b/src/main/java/bisq/desktop/main/offer/takeoffer/TakeOfferViewModel.java index cadff07d8d5..fa247d49cfe 100644 --- a/src/main/java/bisq/desktop/main/offer/takeoffer/TakeOfferViewModel.java +++ b/src/main/java/bisq/desktop/main/offer/takeoffer/TakeOfferViewModel.java @@ -31,6 +31,7 @@ import bisq.core.locale.Res; import bisq.core.offer.Offer; import bisq.core.offer.OfferPayload; +import bisq.core.offer.OfferUtil; import bisq.core.payment.PaymentAccount; import bisq.core.payment.payload.PaymentMethod; import bisq.core.trade.Trade; @@ -280,6 +281,14 @@ void onFocusOutAmountTextField(boolean oldValue, boolean newValue, String userIn calculateVolume(); + if (dataModel.getPaymentMethod().getId().equals(PaymentMethod.HAL_CASH_ID)) { + Coin adjustedAmountForHalCash = OfferUtil.getAdjustedAmountForHalCash(dataModel.getAmount().get(), + dataModel.tradePrice, + dataModel.getMaxTradeLimit()); + dataModel.applyAmount(adjustedAmountForHalCash); + amount.set(btcFormatter.formatCoin(dataModel.getAmount().get())); + } + if (!dataModel.isMinAmountLessOrEqualAmount()) amountValidationResult.set(new InputValidator.ValidationResult(false, Res.get("takeOffer.validation.amountSmallerThanMinAmount"))); diff --git a/src/main/java/bisq/desktop/main/portfolio/editoffer/EditOfferView.java b/src/main/java/bisq/desktop/main/portfolio/editoffer/EditOfferView.java index 3754eeec5f8..162b6b90f67 100644 --- a/src/main/java/bisq/desktop/main/portfolio/editoffer/EditOfferView.java +++ b/src/main/java/bisq/desktop/main/portfolio/editoffer/EditOfferView.java @@ -97,7 +97,7 @@ protected void doActivate() { // Workaround to fix margin on top of amount group gridPane.setPadding(new Insets(-20, 25, -1, 25)); - updateMarketPriceAvailable(); + updatePriceToggle(); updateElementsWithDirection(); model.isNextButtonDisabled.setValue(false); diff --git a/src/main/java/bisq/desktop/main/portfolio/pendingtrades/steps/buyer/BuyerStep2View.java b/src/main/java/bisq/desktop/main/portfolio/pendingtrades/steps/buyer/BuyerStep2View.java index 4a83c23c234..23b0fd4abca 100644 --- a/src/main/java/bisq/desktop/main/portfolio/pendingtrades/steps/buyer/BuyerStep2View.java +++ b/src/main/java/bisq/desktop/main/portfolio/pendingtrades/steps/buyer/BuyerStep2View.java @@ -28,6 +28,7 @@ import bisq.desktop.components.paymentmethods.CryptoCurrencyForm; import bisq.desktop.components.paymentmethods.F2FForm; import bisq.desktop.components.paymentmethods.FasterPaymentsForm; +import bisq.desktop.components.paymentmethods.HalCashForm; import bisq.desktop.components.paymentmethods.InteracETransferForm; import bisq.desktop.components.paymentmethods.MoneyBeamForm; import bisq.desktop.components.paymentmethods.MoneyGramForm; @@ -57,6 +58,7 @@ import bisq.core.payment.payload.CashDepositAccountPayload; import bisq.core.payment.payload.CryptoCurrencyAccountPayload; import bisq.core.payment.payload.F2FAccountPayload; +import bisq.core.payment.payload.HalCashAccountPayload; import bisq.core.payment.payload.MoneyGramAccountPayload; import bisq.core.payment.payload.PaymentAccountPayload; import bisq.core.payment.payload.PaymentMethod; @@ -261,6 +263,9 @@ protected void addContent() { case PaymentMethod.WESTERN_UNION_ID: gridRow = WesternUnionForm.addFormForBuyer(gridPane, gridRow, paymentAccountPayload); break; + case PaymentMethod.HAL_CASH_ID: + gridRow = HalCashForm.addFormForBuyer(gridPane, gridRow, paymentAccountPayload); + break; case PaymentMethod.F2F_ID: checkNotNull(model.dataModel.getTrade().getOffer(), "model.dataModel.getTrade().getOffer() must not be null"); gridRow = F2FForm.addFormForBuyer(gridPane, gridRow, paymentAccountPayload, model.dataModel.getTrade().getOffer()); @@ -374,6 +379,25 @@ private void onPaymentStarted() { } else { showConfirmPaymentStartedPopup(); } + } else if (model.dataModel.getSellersPaymentAccountPayload() instanceof HalCashAccountPayload) { + //noinspection UnusedAssignment + //noinspection ConstantConditions + String key = "halCashCodeInfo"; + if (!DevEnv.isDevMode() && DontShowAgainLookup.showAgain(key)) { + String mobileNr = ((HalCashAccountPayload) model.dataModel.getSellersPaymentAccountPayload()).getMobileNr(); + Popup popup = new Popup<>(); + popup.headLine(Res.get("portfolio.pending.step2_buyer.halCashInfo.headline")) + .feedback(Res.get("portfolio.pending.step2_buyer.halCashInfo.msg", + model.dataModel.getTrade().getShortId(), mobileNr)) + .onAction(this::showConfirmPaymentStartedPopup) + .actionButtonText(Res.get("shared.yes")) + .closeButtonText(Res.get("shared.no")) + .onClose(popup::hide) + .dontShowAgainId(key) + .show(); + } else { + showConfirmPaymentStartedPopup(); + } } else { showConfirmPaymentStartedPopup(); } @@ -492,6 +516,12 @@ private void showPopup() { accountDetails + paymentDetailsForTradePopup + "\n\n" + copyPaste; + } else if (paymentAccountPayload instanceof HalCashAccountPayload) { + //noinspection UnusedAssignment + message += Res.get("portfolio.pending.step2_buyer.bank", amount) + + accountDetails + + paymentDetailsForTradePopup + ".\n\n" + + copyPaste; } else { //noinspection UnusedAssignment message += Res.get("portfolio.pending.step2_buyer.bank", amount) + diff --git a/src/main/java/bisq/desktop/main/portfolio/pendingtrades/steps/seller/SellerStep3View.java b/src/main/java/bisq/desktop/main/portfolio/pendingtrades/steps/seller/SellerStep3View.java index 1f6694d185b..49371c6773b 100644 --- a/src/main/java/bisq/desktop/main/portfolio/pendingtrades/steps/seller/SellerStep3View.java +++ b/src/main/java/bisq/desktop/main/portfolio/pendingtrades/steps/seller/SellerStep3View.java @@ -31,6 +31,7 @@ import bisq.core.payment.payload.CashDepositAccountPayload; import bisq.core.payment.payload.CryptoCurrencyAccountPayload; import bisq.core.payment.payload.F2FAccountPayload; +import bisq.core.payment.payload.HalCashAccountPayload; import bisq.core.payment.payload.MoneyGramAccountPayload; import bisq.core.payment.payload.PaymentAccountPayload; import bisq.core.payment.payload.PaymentMethod; @@ -269,6 +270,7 @@ private void onPaymentReceived() { String message = Res.get("portfolio.pending.step3_seller.onPaymentReceived.part1", CurrencyUtil.getNameByCode(model.dataModel.getCurrencyCode())); if (!(paymentAccountPayload instanceof CryptoCurrencyAccountPayload)) { if (!(paymentAccountPayload instanceof WesternUnionAccountPayload) && + !(paymentAccountPayload instanceof HalCashAccountPayload) && !(paymentAccountPayload instanceof F2FAccountPayload)) { message += Res.get("portfolio.pending.step3_seller.onPaymentReceived.fiat", trade.getShortId()); } @@ -313,6 +315,7 @@ private void showPopup() { if (paymentAccountPayload instanceof USPostalMoneyOrderAccountPayload) { message = Res.get("portfolio.pending.step3_seller.postal", part1, tradeVolumeWithCode, id); } else if (!(paymentAccountPayload instanceof WesternUnionAccountPayload) && + !(paymentAccountPayload instanceof HalCashAccountPayload) && !(paymentAccountPayload instanceof F2FAccountPayload)) { message = Res.get("portfolio.pending.step3_seller.bank", currencyName, tradeVolumeWithCode, id); } @@ -324,6 +327,8 @@ else if (paymentAccountPayload instanceof WesternUnionAccountPayload) message = message + Res.get("portfolio.pending.step3_seller.westernUnion"); else if (paymentAccountPayload instanceof MoneyGramAccountPayload) message = message + Res.get("portfolio.pending.step3_seller.moneyGram"); + else if (paymentAccountPayload instanceof HalCashAccountPayload) + message = message + Res.get("portfolio.pending.step3_seller.halCash"); else if (paymentAccountPayload instanceof F2FAccountPayload) message = part1; diff --git a/src/main/java/bisq/desktop/util/validation/HalCashValidator.java b/src/main/java/bisq/desktop/util/validation/HalCashValidator.java new file mode 100644 index 00000000000..b90fdd20ee3 --- /dev/null +++ b/src/main/java/bisq/desktop/util/validation/HalCashValidator.java @@ -0,0 +1,37 @@ +/* + * This file is part of Bisq. + * + * Bisq is free software: you can redistribute it and/or modify it + * under the terms of the GNU Affero General Public License as published by + * the Free Software Foundation, either version 3 of the License, or (at + * your option) any later version. + * + * Bisq is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU Affero General Public + * License for more details. + * + * You should have received a copy of the GNU Affero General Public License + * along with Bisq. If not, see . + */ + +package bisq.desktop.util.validation; + +import bisq.core.util.validation.InputValidator; + +public final class HalCashValidator extends InputValidator { + + /////////////////////////////////////////////////////////////////////////////////////////// + // Public methods + /////////////////////////////////////////////////////////////////////////////////////////// + + @Override + public ValidationResult validate(String input) { + // TODO + return super.validate(input); + } + + /////////////////////////////////////////////////////////////////////////////////////////// + // Private methods + /////////////////////////////////////////////////////////////////////////////////////////// +}