fix: transaction history handling

- Determine if the recent transaction history is being fetched or available before obtaining the first 20 transactions
- On account change, reset the selected tab to show the asset list
- Collectibles were kinda pixelated/blurry (not anymore)

Fixes #806
This commit is contained in:
Richard Ramos 2020-09-04 11:37:38 -04:00 committed by RichΛrd
parent c334127179
commit 98aaa69e9d
12 changed files with 67 additions and 41 deletions

View File

@ -47,9 +47,15 @@ proc init*(self: WalletController) =
self.status.events.on(SignalType.Wallet.event) do(e:Args):
var data = WalletSignal(e)
if data.eventType == "newblock":
for acc in data.accounts:
self.status.wallet.updateAccount(acc)
# TODO: show notification
# TODO: data.eventType == history, reorg, recent-history-fetching, recent-history-ready:
case data.eventType:
of "newblock":
for acc in data.accounts:
self.status.wallet.updateAccount(acc)
# TODO: show notification
of "recent-history-fetching":
self.view.setHistoryFetchState(data.accounts, true)
of "recent-history-ready":
self.view.setHistoryFetchState(data.accounts, false)
# TODO: handle these data.eventType: history, reorg
# see status-react/src/status_im/ethereum/subscriptions.cljs

View File

@ -1,4 +1,4 @@
import NimQml, Tables, strformat, strutils, chronicles, json, std/wrapnils, parseUtils, stint
import NimQml, Tables, strformat, strutils, chronicles, json, std/wrapnils, parseUtils, stint, tables
import ../../status/[status, wallet, threads]
import ../../status/wallet/collectibles as status_collectibles
import ../../status/libstatus/wallet as status_wallet
@ -25,6 +25,7 @@ QtObject:
fastestGasPrice: string
defaultGasLimit: string
signingPhrase: string
fetchingHistoryState: Table[string, bool]
proc delete(self: WalletView) =
self.accounts.delete
@ -54,6 +55,7 @@ QtObject:
result.fastestGasPrice = "0"
result.defaultGasLimit = "21000"
result.signingPhrase = ""
result.fetchingHistoryState = initTable[string, bool]()
result.setup
proc etherscanLinkChanged*(self: WalletView) {.signal.}
@ -115,8 +117,6 @@ QtObject:
notify = currentTransactionsChanged
proc loadCollectiblesForAccount*(self: WalletView, address: string, currentCollectiblesList: seq[CollectibleList])
proc loadTransactionsForAccount*(self: WalletView, address: string)
proc currentAccountChanged*(self: WalletView) {.signal.}
proc setCurrentAccountByIndex*(self: WalletView, index: int) {.slot.} =
@ -131,10 +131,8 @@ QtObject:
# Display currently known collectibles, and get latest from API/Contracts
self.setCurrentCollectiblesLists(selectedAccount.collectiblesLists)
self.loadCollectiblesForAccount(selectedAccount.address, selectedAccount.collectiblesLists)
# Display currently known transactions, and get latest transactions from status-go
self.setCurrentTransactions(selectedAccount.transactions)
self.loadTransactionsForAccount(selectedAccount.address)
proc getCurrentAccount*(self: WalletView): QVariant {.slot.} =
result = newQVariant(self.currentAccount)
@ -390,28 +388,6 @@ QtObject:
self.currentCollectiblesLists.setLoadingByType(collectibleType, 1)
proc loadingTrxHistory*(self: WalletView, isLoading: bool) {.signal.}
proc loadTransactionsForAccount*(self: WalletView, address: string) {.slot.} =
self.loadingTrxHistory(true)
spawnAndSend(self, "setTrxHistoryResult") do:
$(%*{
"address": address,
"history": getTransfersByAddress(address)
})
proc setTrxHistoryResult(self: WalletView, historyJSON: string) {.slot.} =
let historyData = parseJson(historyJSON)
let transactions = historyData["history"].to(seq[Transaction]);
let address = historyData["address"].getStr
let index = self.accounts.getAccountindexByAddress(address)
if index == -1: return
self.accounts.getAccount(index).transactions = transactions
if address == self.currentAccount.address:
self.setCurrentTransactions(transactions)
self.loadingTrxHistory(false)
proc gasPricePredictionsChanged*(self: WalletView) {.signal.}
proc getGasPricePredictions*(self: WalletView) {.slot.} =
@ -462,3 +438,35 @@ QtObject:
QtProperty[QVariant] defaultTokenList:
read = getDefaultTokenList
proc historyWasFetched*(self: WalletView) {.signal.}
proc setHistoryFetchState*(self: WalletView, accounts: seq[string], isFetching: bool) =
for acc in accounts:
self.fetchingHistoryState[acc] = isFetching
if not isFetching: self.historyWasFetched()
proc isFetchingHistory*(self: WalletView, address: string): bool {.slot.} =
if self.fetchingHistoryState.hasKey(address):
return self.fetchingHistoryState[address]
return true
proc loadingTrxHistory*(self: WalletView, isLoading: bool) {.signal.}
proc loadTransactionsForAccount*(self: WalletView, address: string) {.slot.} =
self.loadingTrxHistory(true)
spawnAndSend(self, "setTrxHistoryResult") do:
$(%*{
"address": address,
"history": getTransfersByAddress(address)
})
proc setTrxHistoryResult(self: WalletView, historyJSON: string) {.slot.} =
let historyData = parseJson(historyJSON)
let transactions = historyData["history"].to(seq[Transaction]);
let address = historyData["address"].getStr
let index = self.accounts.getAccountindexByAddress(address)
if index == -1: return
self.accounts.getAccount(index).transactions = transactions
if address == self.currentAccount.address:
self.setCurrentTransactions(transactions)
self.loadingTrxHistory(false)

View File

@ -5,6 +5,14 @@ import "../../../imports"
import "../../../shared"
Item {
function checkIfHistoryIsBeingFetched(){
if(walletModel.isFetchingHistory(walletModel.currentAccount.address)){
loadingImg.active = true;
} else {
walletModel.loadTransactionsForAccount(walletModel.currentAccount.address)
}
}
Loader {
id: loadingImg
active: false
@ -22,6 +30,7 @@ Item {
Connections {
target: walletModel
onHistoryWasFetched: checkIfHistoryIsBeingFetched()
onLoadingTrxHistory: {
loadingImg.active = isLoading
}

View File

@ -14,6 +14,7 @@ Item {
}
selectedAccount = newIndex
walletModel.setCurrentAccountByIndex(newIndex)
walletTabBar.currentIndex = 0;
}
id: walletInfoContainer

View File

@ -87,9 +87,7 @@ SplitView {
anchors.leftMargin: 32
//% "History"
btnText: qsTrId("history")
onClicked: {
walletModel.loadTransactionsForAccount(walletModel.currentAccount.address)
}
onClicked: historyTab.checkIfHistoryIsBeingFetched()
}
}

View File

@ -86,6 +86,8 @@ ScrollView {
height: root.imageSize
z: 1
source: modelData.image
sourceSize.width: width
sourceSize.height: height
fillMode: Image.PreserveAspectCrop
anchors.verticalCenter: parent.verticalCenter
anchors.horizontalCenter: parent.horizontalCenter

View File

@ -18,6 +18,8 @@ Item {
height: 248
anchors.horizontalCenter: parent.horizontalCenter
source: root.collectibleImage
sourceSize.width: width
sourceSize.height: height
fillMode: Image.PreserveAspectCrop
}

2
vendor/DOtherSide vendored

@ -1 +1 @@
Subproject commit 7d8edc6db225057af5592e2f20c7470fac83fbaf
Subproject commit d663d22df625837f329aebd038d2b2e003c4dccb

@ -1 +1 @@
Subproject commit 8a013591bda4c5357154207060e62b5cc1eff6c8
Subproject commit 474bdbf49cf1634ba504888ad1a1927a2703bd3f

2
vendor/nim-stew vendored

@ -1 +1 @@
Subproject commit 32b86bfd1ff97764e94447675559bf37a4ffb407
Subproject commit 1db43c7234acb9554e3e80bf2e7b61c4cf0435cf

@ -1 +1 @@
Subproject commit 767c8e0fb433da5276c4ac3e61b3360e003536a7
Subproject commit a8cafce7c0d16c3c5a0d928b4a0e31207d399de0

2
vendor/nimqml vendored

@ -1 +1 @@
Subproject commit 57d6e6459daab1d357adafcbf7cb008f5b8969e5
Subproject commit d48ed1ea37a800793ed756ac5a69628d920b1dc0