mirror of
https://github.com/logos-blockchain/logos-execution-zone-wallet-ui.git
synced 2026-07-29 22:23:30 +00:00
better updates
This commit is contained in:
parent
5f93ea3648
commit
cd2e3d8861
@ -125,8 +125,10 @@ void LEZWalletBackend::openIfPathsConfigured()
|
||||
if (err == WALLET_FFI_SUCCESS) {
|
||||
qDebug() << "LEZWalletBackend: wallet opened successfully";
|
||||
setIsWalletOpen(true);
|
||||
refreshAccounts();
|
||||
refreshBlockHeights();
|
||||
QJsonArray arr = m_logos->logos_execution_zone.list_accounts();
|
||||
m_accountModel->replaceFromJsonArray(arr);
|
||||
fetchAndUpdateBlockHeights();
|
||||
startChunkedSync();
|
||||
refreshSequencerAddr();
|
||||
} else {
|
||||
qWarning() << "LEZWalletBackend: failed to open wallet, error" << err
|
||||
@ -138,21 +140,66 @@ void LEZWalletBackend::refreshAccounts()
|
||||
{
|
||||
QJsonArray arr = m_logos->logos_execution_zone.list_accounts();
|
||||
m_accountModel->replaceFromJsonArray(arr);
|
||||
refreshBalances();
|
||||
fetchAndUpdateBlockHeights();
|
||||
if (!m_syncing)
|
||||
startChunkedSync();
|
||||
}
|
||||
|
||||
void LEZWalletBackend::refreshBalances()
|
||||
{
|
||||
refreshBlockHeights();
|
||||
syncToBlock(currentBlockHeight());
|
||||
fetchAndUpdateBlockHeights();
|
||||
if (!m_syncing)
|
||||
startChunkedSync();
|
||||
}
|
||||
|
||||
void LEZWalletBackend::startChunkedSync()
|
||||
{
|
||||
m_syncTarget = static_cast<quint64>(currentBlockHeight());
|
||||
if (m_syncTarget == 0 || static_cast<quint64>(lastSyncedBlock()) >= m_syncTarget) {
|
||||
updateBalances();
|
||||
return;
|
||||
}
|
||||
m_syncing = true;
|
||||
syncNextChunk();
|
||||
}
|
||||
|
||||
void LEZWalletBackend::syncNextChunk()
|
||||
{
|
||||
const quint64 synced = static_cast<quint64>(lastSyncedBlock());
|
||||
if (synced >= m_syncTarget) {
|
||||
m_syncing = false;
|
||||
fetchAndUpdateBlockHeights();
|
||||
updateBalances();
|
||||
return;
|
||||
}
|
||||
const quint64 next = qMin(synced + SYNC_CHUNK_SIZE, m_syncTarget);
|
||||
m_logos->logos_execution_zone.sync_to_block(next);
|
||||
// Only read lastSyncedBlock between chunks — avoids a sequencer network
|
||||
// call (get_current_block_height) on every iteration.
|
||||
const int lastVal = m_logos->logos_execution_zone.get_last_synced_block();
|
||||
if (lastSyncedBlock() != lastVal)
|
||||
setLastSyncedBlock(lastVal);
|
||||
QTimer::singleShot(0, this, &LEZWalletBackend::syncNextChunk);
|
||||
}
|
||||
|
||||
void LEZWalletBackend::updateBalances()
|
||||
{
|
||||
if (!m_accountModel) return;
|
||||
bool anyFailed = false;
|
||||
for (int i = 0; i < m_accountModel->count(); ++i) {
|
||||
const QModelIndex idx = m_accountModel->index(i, 0);
|
||||
const QString addr = m_accountModel->data(idx, LEZWalletAccountModel::AddressRole).toString();
|
||||
const bool isPub = m_accountModel->data(idx, LEZWalletAccountModel::IsPublicRole).toBool();
|
||||
m_accountModel->setBalanceByAddress(addr, getBalance(addr, isPub));
|
||||
const QString bal = getBalance(addr, isPub);
|
||||
if (!bal.isEmpty())
|
||||
m_accountModel->setBalanceByAddress(addr, bal);
|
||||
else
|
||||
anyFailed = true;
|
||||
}
|
||||
saveWallet();
|
||||
if (anyFailed)
|
||||
QTimer::singleShot(3000, this, &LEZWalletBackend::updateBalances);
|
||||
else
|
||||
saveWallet();
|
||||
}
|
||||
|
||||
void LEZWalletBackend::fetchAndUpdateBlockHeights()
|
||||
@ -165,16 +212,6 @@ void LEZWalletBackend::fetchAndUpdateBlockHeights()
|
||||
setCurrentBlockHeight(currentVal);
|
||||
}
|
||||
|
||||
void LEZWalletBackend::refreshBlockHeights()
|
||||
{
|
||||
fetchAndUpdateBlockHeights();
|
||||
if (currentBlockHeight() > 0
|
||||
&& lastSyncedBlock() < currentBlockHeight()
|
||||
&& syncToBlock(currentBlockHeight()))
|
||||
{
|
||||
fetchAndUpdateBlockHeights();
|
||||
}
|
||||
}
|
||||
|
||||
void LEZWalletBackend::refreshSequencerAddr()
|
||||
{
|
||||
@ -331,7 +368,6 @@ bool LEZWalletBackend::createNew(QString configPath, QString storagePath, QStrin
|
||||
persistStoragePath(localStoragePath);
|
||||
setIsWalletOpen(true);
|
||||
refreshAccounts();
|
||||
refreshBlockHeights();
|
||||
refreshSequencerAddr();
|
||||
return true;
|
||||
}
|
||||
|
||||
@ -48,16 +48,25 @@ public slots:
|
||||
bool createNew(QString configPath, QString storagePath, QString password, QString sequencerAddr) override;
|
||||
void copyToClipboard(QString text) override;
|
||||
|
||||
private slots:
|
||||
void syncNextChunk();
|
||||
|
||||
private:
|
||||
void persistConfigPath(const QString& path);
|
||||
void persistStoragePath(const QString& path);
|
||||
void applySequencerAddrToConfig(const QString& configPath, const QString& sequencerAddr);
|
||||
void refreshBlockHeights();
|
||||
void fetchAndUpdateBlockHeights();
|
||||
void startChunkedSync();
|
||||
|
||||
void updateBalances();
|
||||
void refreshSequencerAddr();
|
||||
void saveWallet();
|
||||
void fetchAndUpdateBlockHeights();
|
||||
void openIfPathsConfigured();
|
||||
|
||||
bool m_syncing = false;
|
||||
quint64 m_syncTarget = 0;
|
||||
static constexpr quint64 SYNC_CHUNK_SIZE = 100;
|
||||
|
||||
LEZWalletAccountModel* m_accountModel;
|
||||
LEZAccountFilterModel* m_filteredAccountModel;
|
||||
LEZAccountFilterModel* m_privateAccountModel;
|
||||
|
||||
@ -137,6 +137,8 @@ Rectangle {
|
||||
accountModel: root.accountModel
|
||||
publicAccountModel: root.publicAccountModel
|
||||
privateAccountModel: root.privateAccountModel
|
||||
lastSyncedBlock: backend ? backend.lastSyncedBlock : 0
|
||||
currentBlockHeight: backend ? backend.currentBlockHeight : 0
|
||||
|
||||
onCreatePublicAccountRequested: {
|
||||
if (!backend) { console.warn("backend is null"); return }
|
||||
|
||||
@ -13,6 +13,8 @@ Rectangle {
|
||||
|
||||
// --- Public API: data in ---
|
||||
property var accountModel: null
|
||||
property int lastSyncedBlock: 0
|
||||
property int currentBlockHeight: 0
|
||||
|
||||
// --- Public API: signals out ---
|
||||
signal createPublicAccountRequested()
|
||||
@ -57,6 +59,34 @@ Rectangle {
|
||||
}
|
||||
}
|
||||
|
||||
// Sync progress
|
||||
ColumnLayout {
|
||||
Layout.fillWidth: true
|
||||
spacing: Theme.spacing.xsmall
|
||||
visible: root.currentBlockHeight > 0 && root.lastSyncedBlock < root.currentBlockHeight
|
||||
|
||||
RowLayout {
|
||||
Layout.fillWidth: true
|
||||
LogosText {
|
||||
text: qsTr("Syncing")
|
||||
font.pixelSize: Theme.typography.secondaryText
|
||||
color: Theme.palette.textSecondary
|
||||
}
|
||||
Item { Layout.fillWidth: true }
|
||||
LogosText {
|
||||
text: root.lastSyncedBlock + " / " + root.currentBlockHeight
|
||||
font.pixelSize: Theme.typography.secondaryText
|
||||
color: Theme.palette.textSecondary
|
||||
}
|
||||
}
|
||||
ProgressBar {
|
||||
Layout.fillWidth: true
|
||||
from: 0
|
||||
to: root.currentBlockHeight
|
||||
value: root.lastSyncedBlock
|
||||
}
|
||||
}
|
||||
|
||||
// Empty state (when no real model and we don't show showcase)
|
||||
LogosText {
|
||||
Layout.fillWidth: true
|
||||
|
||||
@ -15,6 +15,8 @@ Rectangle {
|
||||
property string transferResult: ""
|
||||
property bool transferResultIsError: false
|
||||
property bool transferPending: false
|
||||
property int lastSyncedBlock: 0
|
||||
property int currentBlockHeight: 0
|
||||
|
||||
// --- Public API: output signals (parent connects and calls backend) ---
|
||||
signal createPublicAccountRequested()
|
||||
@ -41,6 +43,8 @@ Rectangle {
|
||||
Layout.fillHeight: true
|
||||
|
||||
accountModel: root.accountModel
|
||||
lastSyncedBlock: root.lastSyncedBlock
|
||||
currentBlockHeight: root.currentBlockHeight
|
||||
|
||||
onCreatePublicAccountRequested: root.createPublicAccountRequested()
|
||||
onCreatePrivateAccountRequested: root.createPrivateAccountRequested()
|
||||
|
||||
Loading…
x
Reference in New Issue
Block a user