From d064b38f1c6c0190392bd96e01633b63206b1b6d Mon Sep 17 00:00:00 2001 From: Sander van Grieken Date: Thu, 30 Mar 2023 13:23:14 +0200 Subject: [PATCH] qml: split updating userinfo from determine_can_pay, check determine_can_pay also in event handlers --- electrum/gui/qml/qeinvoice.py | 62 ++++++++++++++++++++++++----------- 1 file changed, 43 insertions(+), 19 deletions(-) diff --git a/electrum/gui/qml/qeinvoice.py b/electrum/gui/qml/qeinvoice.py index d850fd41c..6cedce037 100644 --- a/electrum/gui/qml/qeinvoice.py +++ b/electrum/gui/qml/qeinvoice.py @@ -170,12 +170,14 @@ class QEInvoiceParser(QEInvoice, QtEventListener): def on_event_payment_succeeded(self, wallet, key): if wallet == self._wallet.wallet and key == self.key: self.statusChanged.emit() + self.determine_can_pay() self.userinfo = _('Paid!') @event_listener def on_event_payment_failed(self, wallet, key, reason): if wallet == self._wallet.wallet and key == self.key: self.statusChanged.emit() + self.determine_can_pay() self.userinfo = _('Payment failed: ') + reason @event_listener @@ -183,6 +185,7 @@ class QEInvoiceParser(QEInvoice, QtEventListener): if wallet == self._wallet.wallet and key == self.key: self.statusChanged.emit() if status in [PR_INFLIGHT, PR_ROUTING]: + self.determine_can_pay() self.userinfo = _('In progress...') @pyqtProperty(int, notify=invoiceChanged) @@ -231,6 +234,7 @@ class QEInvoiceParser(QEInvoice, QtEventListener): if self._effectiveInvoice: self._effectiveInvoice.amount_msat = '!' if new_amount.isMax else int(new_amount.satsInt * 1000) + self.update_userinfo() self.determine_can_pay() self.invoiceChanged.emit() @@ -242,12 +246,11 @@ class QEInvoiceParser(QEInvoice, QtEventListener): def amountOverride(self, new_amount): self._logger.debug(f'set new override amount {repr(new_amount)}') self._amountOverride.copyFrom(new_amount) - - self.determine_can_pay() self.amountOverrideChanged.emit() @pyqtSlot() def _on_amountoverride_value_changed(self): + self.update_userinfo() self.determine_can_pay() @pyqtProperty('quint64', notify=invoiceChanged) @@ -338,6 +341,7 @@ class QEInvoiceParser(QEInvoice, QtEventListener): self.set_lnprops() + self.update_userinfo() self.determine_can_pay() self.invoiceChanged.emit() @@ -353,6 +357,7 @@ class QEInvoiceParser(QEInvoice, QtEventListener): self._timer.setInterval(interval) # msec self._timer.start() else: + self.update_userinfo() self.determine_can_pay() # status went to PR_EXPIRED @pyqtSlot() @@ -360,9 +365,7 @@ class QEInvoiceParser(QEInvoice, QtEventListener): self.statusChanged.emit() self.set_status_timer() - def determine_can_pay(self): - self.canPay = False - self.canSave = False + def update_userinfo(self): self.userinfo = '' if not self.amountOverride.isEmpty: @@ -370,8 +373,6 @@ class QEInvoiceParser(QEInvoice, QtEventListener): else: amount = self.amount - self.canSave = True - if self.amount.isEmpty: self.userinfo = _('Enter the amount you want to send') @@ -384,13 +385,9 @@ class QEInvoiceParser(QEInvoice, QtEventListener): lnaddr = self._effectiveInvoice._lnaddr if lnaddr.amount and amount.satsInt < lnaddr.amount * COIN: self.userinfo = _('Cannot pay less than the amount specified in the invoice') - else: - self.canPay = True - elif self.address and self.get_max_spendable_onchain() > amount.satsInt: + elif self.address and self.get_max_spendable_onchain() < amount.satsInt: # TODO: validate address? # TODO: subtract fee? - self.canPay = True - else: self.userinfo = _('Insufficient balance') else: self.userinfo = { @@ -402,13 +399,7 @@ class QEInvoiceParser(QEInvoice, QtEventListener): }[self.status] elif self.invoiceType == QEInvoice.Type.OnchainInvoice: if self.status in [PR_UNPAID, PR_FAILED]: - if amount.isMax and self.get_max_spendable_onchain() > 0: - # TODO: dust limit? - self.canPay = True - elif self.get_max_spendable_onchain() >= amount.satsInt: - # TODO: subtract fee? - self.canPay = True - else: + if not ((amount.isMax and self.get_max_spendable_onchain() > 0) or (self.get_max_spendable_onchain() >= amount.satsInt)): self.userinfo = _('Insufficient balance') else: self.userinfo = { @@ -418,6 +409,39 @@ class QEInvoiceParser(QEInvoice, QtEventListener): PR_UNKNOWN: _('Invoice has unknown status'), }[self.status] + def determine_can_pay(self): + self.canPay = False + self.canSave = False + + if not self.amountOverride.isEmpty: + amount = self.amountOverride + else: + amount = self.amount + + self.canSave = True + + if amount.isEmpty and self.status == PR_UNPAID: # unspecified amount + return + + if self.invoiceType == QEInvoice.Type.LightningInvoice: + if self.status in [PR_UNPAID, PR_FAILED]: + if self.get_max_spendable_lightning() >= amount.satsInt: + lnaddr = self._effectiveInvoice._lnaddr + if not (lnaddr.amount and amount.satsInt < lnaddr.amount * COIN): + self.canPay = True + elif self.address and self.get_max_spendable_onchain() > amount.satsInt: + # TODO: validate address? + # TODO: subtract fee? + self.canPay = True + elif self.invoiceType == QEInvoice.Type.OnchainInvoice: + if self.status in [PR_UNPAID, PR_FAILED]: + if amount.isMax and self.get_max_spendable_onchain() > 0: + # TODO: dust limit? + self.canPay = True + elif self.get_max_spendable_onchain() >= amount.satsInt: + # TODO: subtract fee? + self.canPay = True + def setValidOnchainInvoice(self, invoice: Invoice): self._logger.debug('setValidOnchainInvoice') if invoice.is_lightning():