diff --git a/src/app/chat/event_handling.nim b/src/app/chat/event_handling.nim index 29b2e8d009..6848715b35 100644 --- a/src/app/chat/event_handling.nim +++ b/src/app/chat/event_handling.nim @@ -77,11 +77,9 @@ proc handleChatEvents(self: ChatController) = self.status.events.on(PendingTransactionType.BuyStickerPack.confirmed) do(e: Args): var tx = TransactionMinedArgs(e) + self.view.transactionCompleted(tx.success, tx.transactionHash) if tx.success: self.view.installStickerPack(tx.data.parseInt) - else: - discard - # TODO: self.view.toastMessage(message = tx.revertReason, error = true) # for when the toast messages in the design are implemented proc handleMailserverEvents(self: ChatController) = self.status.events.on("mailserverTopics") do(e: Args): diff --git a/src/app/chat/view.nim b/src/app/chat/view.nim index a392fc49eb..90c346979b 100644 --- a/src/app/chat/view.nim +++ b/src/app/chat/view.nim @@ -112,10 +112,15 @@ QtObject: except: result = 325000 + proc transactionWasSent*(self: ChatsView, txResult: string) {.signal.} + proc transactionCompleted*(self: ChatsView, success: bool, txHash: string) {.signal.} + proc buyStickerPack*(self: ChatsView, packId: int, address: string, price: string, gas: string, gasPrice: string, password: string): string {.slot.} = try: let response = self.status.stickers.buyPack(packId, address, price, gas, gasPrice, password) result = $(%* { "result": %response }) + self.transactionWasSent(response) + # TODO: # check if response["error"] is not null and handle the error except RpcException as e: diff --git a/src/app/profile/core.nim b/src/app/profile/core.nim index 334b8344a1..bd4d8ac91d 100644 --- a/src/app/profile/core.nim +++ b/src/app/profile/core.nim @@ -83,15 +83,13 @@ proc init*(self: ProfileController, account: Account) = self.status.events.on(PendingTransactionType.RegisterENS.confirmed) do(e: Args): let tx = TransactionMinedArgs(e) if tx.success: - self.view.ens.confirm(TransactionMinedArgs(e).data) + self.view.ens.confirm(PendingTransactionType.RegisterENS, tx.data, tx.transactionHash) else: - discard - # TODO: show toast message indicating transaction reverted + self.view.ens.revert(PendingTransactionType.RegisterENS, tx.data, tx.transactionHash) self.status.events.on(PendingTransactionType.SetPubKey.confirmed) do(e: Args): let tx = TransactionMinedArgs(e) if tx.success: - self.view.ens.confirm(TransactionMinedArgs(e).data) + self.view.ens.confirm(PendingTransactionType.SetPubKey, tx.data, tx.transactionHash) else: - discard - # TODO: show toast message indicating transaction reverted \ No newline at end of file + self.view.ens.revert(PendingTransactionType.SetPubKey, tx.data, tx.transactionHash) diff --git a/src/app/profile/views/ens_manager.nim b/src/app/profile/views/ens_manager.nim index 1b5a11727b..bc3425dcd4 100644 --- a/src/app/profile/views/ens_manager.nim +++ b/src/app/profile/views/ens_manager.nim @@ -156,8 +156,10 @@ QtObject: }.toTable proc usernameConfirmed(self: EnsManager, username: string) {.signal.} + proc transactionWasSent(self: EnsManager, txResult: string) {.signal.} + proc transactionCompleted(self: EnsManager, success: bool, txHash: string, username: string, trxType: string) {.signal.} - proc confirm*(self: EnsManager, ensUsername: string) = + proc confirm*(self: EnsManager, trxType: PendingTransactionType, ensUsername: string, transactionHash: string) = self.connect(ensUsername) self.pendingUsernames.excl ensUsername let msgIdx = self.usernames.find(ensUsername) @@ -165,6 +167,8 @@ QtObject: let bottomRight = self.createIndex(msgIdx, 0, nil) self.dataChanged(topLeft, bottomRight, @[EnsRoles.IsPending.int]) self.usernameConfirmed(ensUsername) + self.transactionCompleted(true, transactionHash, ensUsername, $trxType) + proc getPrice(self: EnsManager): string {.slot.} = result = libstatus_utils.wei2Eth(getPrice()) @@ -188,12 +192,25 @@ QtObject: self.connect(ensUsername) + proc revert*(self: EnsManager, trxType: PendingTransactionType, ensUsername: string, transactionHash: string) = + self.pendingUsernames.excl ensUsername + let msgIdx = self.usernames.find(ensUsername) + + if msgIdx == -1: return + + self.beginResetModel() + self.usernames.del(msgIdx) + self.endResetModel() + self.transactionCompleted(false, transactionHash, ensUsername, $trxType) + proc registerENS(self: EnsManager, username: string, password: string) {.slot.} = let pubKey = status_settings.getSetting[string](Setting.PublicKey, "0x0") let address = status_wallet.getWalletAccounts()[0].address let walletAddress = parseAddress(address) let trxHash = registerUsername(username, walletAddress, pubKey, password) + self.transactionWasSent(trxHash) + # TODO: handle transaction failure var ensUsername = formatUsername(username, true) self.pendingUsernames.incl(ensUsername) @@ -205,6 +222,8 @@ QtObject: let walletAddress = parseAddress(address) let trxHash = setPubKey(username, walletAddress, pubKey, password) + self.transactionWasSent(trxHash) + # TODO: handle transaction failure self.pendingUsernames.incl(username) self.add username diff --git a/ui/app/AppLayouts/Chat/ChatColumn/ChatComponents/SignTransactionModal.qml b/ui/app/AppLayouts/Chat/ChatColumn/ChatComponents/SignTransactionModal.qml index b3bdf1e7fc..458fd2f002 100644 --- a/ui/app/AppLayouts/Chat/ChatColumn/ChatComponents/SignTransactionModal.qml +++ b/ui/app/AppLayouts/Chat/ChatColumn/ChatComponents/SignTransactionModal.qml @@ -59,7 +59,7 @@ ModalPopup { return sendingError.open() } - sendingSuccess.text = qsTr("Transaction sent to the blockchain. You can watch the progress on Etherscan: %2/%1").arg(response.result).arg(walletModel.etherscanLink) + sendingSuccess.text = qsTr("Transaction sent to the blockchain. You can watch the progress on Etherscan: %2%1").arg(response.result).arg(walletModel.etherscanLink) sendingSuccess.open() } diff --git a/ui/app/AppLayouts/Chat/components/StickerPackPurchaseModal.qml b/ui/app/AppLayouts/Chat/components/StickerPackPurchaseModal.qml index 691eb001f9..0b6d763997 100644 --- a/ui/app/AppLayouts/Chat/components/StickerPackPurchaseModal.qml +++ b/ui/app/AppLayouts/Chat/components/StickerPackPurchaseModal.qml @@ -52,7 +52,7 @@ ModalPopup { return sendingError.open() } - sendingSuccess.text = qsTr("Transaction sent to the blockchain. You can watch the progress on Etherscan: %2/%1").arg(response.result).arg(walletModel.etherscanLink) + sendingSuccess.text = qsTr("Transaction sent to the blockchain. You can watch the progress on Etherscan: %2%1").arg(response.result).arg(walletModel.etherscanLink) sendingSuccess.open() } @@ -225,6 +225,31 @@ ModalPopup { } } } + + Connections { + target: chatsModel + onTransactionWasSent: { + toastMessage.title = qsTr("Transaction pending...") + toastMessage.source = "../../../img/loading.svg" + toastMessage.iconColor = Style.current.primary + toastMessage.iconRotates = true + toastMessage.link = `${walletModel.etherscanLink}/${txResult}` + toastMessage.open() + } + onTransactionCompleted: { + toastMessage.title = !success ? qsTr("Could not buy Stickerpack"): qsTr("Stickerpack bought successfully"); + if (success) { + toastMessage.source = "../../../img/check-circle.svg" + toastMessage.iconColor = Style.current.success + } else { + toastMessage.source = "../../../img/block-icon.svg" + toastMessage.iconColor = Style.current.danger + } + + toastMessage.link = `${walletModel.etherscanLink}/${txHash}` + toastMessage.open() + } + } } } diff --git a/ui/app/AppLayouts/Profile/Sections/EnsContainer.qml b/ui/app/AppLayouts/Profile/Sections/EnsContainer.qml index 7249fbc4c7..459bedd6c0 100644 --- a/ui/app/AppLayouts/Profile/Sections/EnsContainer.qml +++ b/ui/app/AppLayouts/Profile/Sections/EnsContainer.qml @@ -273,4 +273,37 @@ Item { addedUsername = ensUsername; } } + + Connections { + target: profileModel.ens + onTransactionWasSent: { + toastMessage.title = qsTr("Transaction pending...") + toastMessage.source = "../../../img/loading.svg" + toastMessage.iconColor = Style.current.primary + toastMessage.iconRotates = true + toastMessage.link = `${walletModel.etherscanLink}/${txResult}` + toastMessage.open() + } + onTransactionCompleted: { + switch(trxType){ + case "RegisterENS": + toastMessage.title = !success ? qsTr("ENS Registration failed"): qsTr("ENS Registration completed"); + break; + case "SetPubKey": + toastMessage.title = !success ? qsTr("Updating ENS pubkey failed"): qsTr("Updating ENS pubkey completed"); + break; + } + + if (success) { + toastMessage.source = "../../../img/check-circle.svg" + toastMessage.iconColor = Style.current.success + } else { + toastMessage.source = "../../../img/block-icon.svg" + toastMessage.iconColor = Style.current.danger + } + + toastMessage.link = `${walletModel.etherscanLink}/${txHash}` + toastMessage.open() + } + } }