mirror of
https://github.com/boldsuck/haveno.git
synced 2024-12-22 20:19:21 +00:00
update offer state on same thread to fix blocking
This commit is contained in:
parent
6fea58c197
commit
59fbd805a5
4 changed files with 76 additions and 70 deletions
|
@ -265,7 +265,7 @@ public class Offer implements NetworkPayload, PersistablePayload {
|
|||
///////////////////////////////////////////////////////////////////////////////////////////
|
||||
|
||||
public void setState(Offer.State state) {
|
||||
UserThread.await(() -> stateProperty().set(state));
|
||||
stateProperty.set(state);
|
||||
}
|
||||
|
||||
public ObjectProperty<Offer.State> stateProperty() {
|
||||
|
|
|
@ -200,22 +200,24 @@ public class MarketView extends ActivatableView<TabPane, Void> {
|
|||
}
|
||||
|
||||
private String getAllOffersWithReferralId() {
|
||||
List<String> list = offerBook.getOfferBookListItems().stream()
|
||||
.map(OfferBookListItem::getOffer)
|
||||
.filter(offer -> offer.getExtraDataMap() != null)
|
||||
.filter(offer -> offer.getExtraDataMap().get(OfferPayload.REFERRAL_ID) != null)
|
||||
.map(offer -> {
|
||||
StringBuilder sb = new StringBuilder();
|
||||
sb.append("Offer ID: ").append(offer.getId()).append("\n")
|
||||
.append("Type: ").append(offer.getDirection().name()).append("\n")
|
||||
.append("Market: ").append(CurrencyUtil.getCurrencyPair(offer.getCurrencyCode())).append("\n")
|
||||
.append("Price: ").append(FormattingUtils.formatPrice(offer.getPrice())).append("\n")
|
||||
.append("Amount: ").append(DisplayUtils.formatAmount(offer, formatter)).append(" BTC\n")
|
||||
.append("Payment method: ").append(Res.get(offer.getPaymentMethod().getId())).append("\n")
|
||||
.append("ReferralID: ").append(offer.getExtraDataMap().get(OfferPayload.REFERRAL_ID));
|
||||
return sb.toString();
|
||||
})
|
||||
.collect(Collectors.toList());
|
||||
return Joiner.on("\n\n").join(list);
|
||||
synchronized (offerBook.getOfferBookListItems()) {
|
||||
List<String> list = offerBook.getOfferBookListItems().stream()
|
||||
.map(OfferBookListItem::getOffer)
|
||||
.filter(offer -> offer.getExtraDataMap() != null)
|
||||
.filter(offer -> offer.getExtraDataMap().get(OfferPayload.REFERRAL_ID) != null)
|
||||
.map(offer -> {
|
||||
StringBuilder sb = new StringBuilder();
|
||||
sb.append("Offer ID: ").append(offer.getId()).append("\n")
|
||||
.append("Type: ").append(offer.getDirection().name()).append("\n")
|
||||
.append("Market: ").append(CurrencyUtil.getCurrencyPair(offer.getCurrencyCode())).append("\n")
|
||||
.append("Price: ").append(FormattingUtils.formatPrice(offer.getPrice())).append("\n")
|
||||
.append("Amount: ").append(DisplayUtils.formatAmount(offer, formatter)).append(" BTC\n")
|
||||
.append("Payment method: ").append(Res.get(offer.getPaymentMethod().getId())).append("\n")
|
||||
.append("ReferralID: ").append(offer.getExtraDataMap().get(OfferPayload.REFERRAL_ID));
|
||||
return sb.toString();
|
||||
})
|
||||
.collect(Collectors.toList());
|
||||
return Joiner.on("\n\n").join(list);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
|
@ -147,16 +147,18 @@ class OfferBookChartViewModel extends ActivatableViewModel {
|
|||
|
||||
private void fillTradeCurrencies() {
|
||||
// Don't use a set as we need all entries
|
||||
List<TradeCurrency> tradeCurrencyList = offerBookListItems.stream()
|
||||
.map(e -> {
|
||||
String currencyCode = e.getOffer().getCurrencyCode();
|
||||
Optional<TradeCurrency> tradeCurrencyOptional = CurrencyUtil.getTradeCurrency(currencyCode);
|
||||
return tradeCurrencyOptional.orElse(null);
|
||||
})
|
||||
.filter(Objects::nonNull)
|
||||
.collect(Collectors.toList());
|
||||
synchronized (offerBookListItems) {
|
||||
List<TradeCurrency> tradeCurrencyList = offerBookListItems.stream()
|
||||
.map(e -> {
|
||||
String currencyCode = e.getOffer().getCurrencyCode();
|
||||
Optional<TradeCurrency> tradeCurrencyOptional = CurrencyUtil.getTradeCurrency(currencyCode);
|
||||
return tradeCurrencyOptional.orElse(null);
|
||||
})
|
||||
.filter(Objects::nonNull)
|
||||
.collect(Collectors.toList());
|
||||
|
||||
currencyListItems.updateWithCurrencies(tradeCurrencyList, null);
|
||||
currencyListItems.updateWithCurrencies(tradeCurrencyList, null);
|
||||
}
|
||||
}
|
||||
|
||||
@Override
|
||||
|
|
|
@ -350,50 +350,52 @@ class TakeOfferViewModel extends ActivatableWithDataModel<TakeOfferDataModel> im
|
|||
///////////////////////////////////////////////////////////////////////////////////////////
|
||||
|
||||
private void applyOfferState(Offer.State state) {
|
||||
offerWarning.set(null);
|
||||
UserThread.execute(() -> {
|
||||
offerWarning.set(null);
|
||||
|
||||
// We have 2 situations handled here:
|
||||
// 1. when clicking take offer in the offerbook screen, we do the availability check
|
||||
// 2. Before actually taking the offer in the take offer screen, we check again the availability as some time might have passed in the meantime
|
||||
// So we use the takeOfferRequested flag to display different network_messages depending on the context.
|
||||
switch (state) {
|
||||
case UNKNOWN:
|
||||
break;
|
||||
case OFFER_FEE_RESERVED:
|
||||
// irrelevant for taker
|
||||
break;
|
||||
case AVAILABLE:
|
||||
isOfferAvailable.set(true);
|
||||
updateButtonDisableState();
|
||||
break;
|
||||
case NOT_AVAILABLE:
|
||||
if (takeOfferRequested)
|
||||
offerWarning.set(Res.get("takeOffer.failed.offerNotAvailable"));
|
||||
else
|
||||
offerWarning.set(Res.get("takeOffer.failed.offerTaken"));
|
||||
takeOfferRequested = false;
|
||||
break;
|
||||
case REMOVED:
|
||||
if (!takeOfferRequested)
|
||||
offerWarning.set(Res.get("takeOffer.failed.offerRemoved"));
|
||||
|
||||
takeOfferRequested = false;
|
||||
break;
|
||||
case MAKER_OFFLINE:
|
||||
if (takeOfferRequested)
|
||||
offerWarning.set(Res.get("takeOffer.failed.offererNotOnline"));
|
||||
else
|
||||
offerWarning.set(Res.get("takeOffer.failed.offererOffline"));
|
||||
takeOfferRequested = false;
|
||||
break;
|
||||
default:
|
||||
log.error("Unhandled offer state: " + state);
|
||||
break;
|
||||
}
|
||||
|
||||
updateSpinnerInfo();
|
||||
|
||||
updateButtonDisableState();
|
||||
// We have 2 situations handled here:
|
||||
// 1. when clicking take offer in the offerbook screen, we do the availability check
|
||||
// 2. Before actually taking the offer in the take offer screen, we check again the availability as some time might have passed in the meantime
|
||||
// So we use the takeOfferRequested flag to display different network_messages depending on the context.
|
||||
switch (state) {
|
||||
case UNKNOWN:
|
||||
break;
|
||||
case OFFER_FEE_RESERVED:
|
||||
// irrelevant for taker
|
||||
break;
|
||||
case AVAILABLE:
|
||||
isOfferAvailable.set(true);
|
||||
updateButtonDisableState();
|
||||
break;
|
||||
case NOT_AVAILABLE:
|
||||
if (takeOfferRequested)
|
||||
offerWarning.set(Res.get("takeOffer.failed.offerNotAvailable"));
|
||||
else
|
||||
offerWarning.set(Res.get("takeOffer.failed.offerTaken"));
|
||||
takeOfferRequested = false;
|
||||
break;
|
||||
case REMOVED:
|
||||
if (!takeOfferRequested)
|
||||
offerWarning.set(Res.get("takeOffer.failed.offerRemoved"));
|
||||
|
||||
takeOfferRequested = false;
|
||||
break;
|
||||
case MAKER_OFFLINE:
|
||||
if (takeOfferRequested)
|
||||
offerWarning.set(Res.get("takeOffer.failed.offererNotOnline"));
|
||||
else
|
||||
offerWarning.set(Res.get("takeOffer.failed.offererOffline"));
|
||||
takeOfferRequested = false;
|
||||
break;
|
||||
default:
|
||||
log.error("Unhandled offer state: " + state);
|
||||
break;
|
||||
}
|
||||
|
||||
updateSpinnerInfo();
|
||||
|
||||
updateButtonDisableState();
|
||||
});
|
||||
}
|
||||
|
||||
private void applyTradeErrorMessage(@Nullable String errorMessage) {
|
||||
|
|
Loading…
Reference in a new issue