From c53b6676b2737f0465b3d03863352bc2c3091115 Mon Sep 17 00:00:00 2001 From: M Date: Tue, 22 Sep 2020 16:35:23 +0300 Subject: [PATCH] Fixes for monero transaction history updates. --- ios/Flutter/.last_build_id | 1 - lib/core/transaction_history.dart | 6 ++-- lib/entities/transaction_info.dart | 6 +++- lib/monero/monero_transaction_history.dart | 1 + lib/monero/monero_wallet.dart | 7 +++- lib/utils/mobx.dart | 32 ++++++++++++++++++- .../dashboard/dashboard_view_model.dart | 10 ++++++ .../dashboard/transaction_list_item.dart | 18 +++++------ .../node_list/node_list_view_model.dart | 2 +- 9 files changed, 66 insertions(+), 17 deletions(-) delete mode 100644 ios/Flutter/.last_build_id diff --git a/ios/Flutter/.last_build_id b/ios/Flutter/.last_build_id deleted file mode 100644 index 969ed63e6..000000000 --- a/ios/Flutter/.last_build_id +++ /dev/null @@ -1 +0,0 @@ -09c81fe0a3d701eb6da3bd2c6fc5ec65 \ No newline at end of file diff --git a/lib/core/transaction_history.dart b/lib/core/transaction_history.dart index 6fa5bd228..02cff8351 100644 --- a/lib/core/transaction_history.dart +++ b/lib/core/transaction_history.dart @@ -10,15 +10,17 @@ abstract class TransactionHistoryBase { bool _isUpdating; + @action Future update() async { if (_isUpdating) { return; } try { - _isUpdating = false; - transactions.addAll(await fetchTransactions()); _isUpdating = true; + final _transactions = await fetchTransactions(); + _transactions.forEach((key, value) => transactions[key] = value); + _isUpdating = false; } catch (e) { _isUpdating = false; rethrow; diff --git a/lib/entities/transaction_info.dart b/lib/entities/transaction_info.dart index 7dfaa64d3..c9ad89c71 100644 --- a/lib/entities/transaction_info.dart +++ b/lib/entities/transaction_info.dart @@ -1,6 +1,7 @@ import 'package:cake_wallet/entities/transaction_direction.dart'; +import 'package:cake_wallet/utils/mobx.dart'; -abstract class TransactionInfo extends Object { +abstract class TransactionInfo extends Object with Keyable { String id; int amount; TransactionDirection direction; @@ -11,4 +12,7 @@ abstract class TransactionInfo extends Object { String amountFormatted(); String fiatAmount(); void changeFiatAmount(String amount); + + @override + dynamic get keyIndex => id; } \ No newline at end of file diff --git a/lib/monero/monero_transaction_history.dart b/lib/monero/monero_transaction_history.dart index 5d8b99a8c..93c00f376 100644 --- a/lib/monero/monero_transaction_history.dart +++ b/lib/monero/monero_transaction_history.dart @@ -34,6 +34,7 @@ abstract class MoneroTransactionHistoryBase } @override + @action void updateAsync({void Function() onFinished}) { fetchTransactionsAsync( (transaction) => transactions[transaction.id] = transaction, diff --git a/lib/monero/monero_wallet.dart b/lib/monero/monero_wallet.dart index 7d7e0c9c5..6f0ea6d79 100644 --- a/lib/monero/monero_wallet.dart +++ b/lib/monero/monero_wallet.dart @@ -92,6 +92,7 @@ abstract class MoneroWalletBase extends WalletBase with Store { monero_wallet.getFullBalance(accountIndex: account.id)); address = subaddress.address; _setListeners(); + await transactionHistory.update(); } void close() { @@ -245,7 +246,11 @@ abstract class MoneroWalletBase extends WalletBase with Store { } } - void _askForUpdateTransactionHistory() => transactionHistory.updateAsync(); + Future _askForUpdateTransactionHistory() async { + print('start'); + await transactionHistory.update(); + print('end'); + } int _getFullBalance() => monero_wallet.getFullBalance(accountIndex: account.id); diff --git a/lib/utils/mobx.dart b/lib/utils/mobx.dart index 25925df1f..cb2d810e5 100644 --- a/lib/utils/mobx.dart +++ b/lib/utils/mobx.dart @@ -6,7 +6,7 @@ mixin Keyable { dynamic keyIndex; } -void connectDifferent( +void connectWithTransform( ObservableList source, ObservableList dest, Y Function(T) transform, {bool Function(T) filter}) { source.observe((ListChange change) { @@ -36,6 +36,36 @@ void connectDifferent( }); } +void connectMapToListWithTransform( + ObservableMap source, + ObservableList dest, + Y Function(T) transform, + {bool Function(T) filter}) { + source.observe((MapChange change) { + switch (change.type) { + case OperationType.add: + if (filter?.call(change.newValue) ?? true) { + dest.add(transform(change.newValue)); + } + break; + case OperationType.remove: + // Hive could has equal index and key + dest.removeWhere( + (elem) => elem.keyIndex == (change.key ?? change.newValue.keyIndex)); + break; + case OperationType.update: + for (var i = 0; i < dest.length; i++) { + final item = dest[i]; + + if (item.keyIndex == change.key) { + dest[i] = transform(change.newValue); + } + } + break; + } + }); +} + void connect( ObservableList source, ObservableList dest) { source.observe((ListChange change) { diff --git a/lib/view_model/dashboard/dashboard_view_model.dart b/lib/view_model/dashboard/dashboard_view_model.dart index da6bdde61..54a6297eb 100644 --- a/lib/view_model/dashboard/dashboard_view_model.dart +++ b/lib/view_model/dashboard/dashboard_view_model.dart @@ -7,6 +7,7 @@ import 'package:cake_wallet/entities/transaction_direction.dart'; import 'package:cake_wallet/entities/transaction_info.dart'; import 'package:cake_wallet/exchange/exchange_provider_description.dart'; import 'package:cake_wallet/exchange/trade.dart'; +import 'package:cake_wallet/utils/mobx.dart'; import 'package:cake_wallet/view_model/dashboard/balance_view_model.dart'; import 'package:cake_wallet/view_model/dashboard/filter_item.dart'; import 'package:cake_wallet/view_model/dashboard/trade_list_item.dart'; @@ -82,6 +83,15 @@ abstract class DashboardViewModelBase with Store { displayMode: balanceDisplayMode))); _reaction = reaction((_) => appStore.wallet, _onWalletChange); + // FIXME: fixme + connectMapToListWithTransform( + appStore.wallet.transactionHistory.transactions, + transactions, + (TransactionInfo val) => TransactionListItem( + transaction: val, + price: price, + fiatCurrency: appStore.settingsStore.fiatCurrency, + displayMode: balanceDisplayMode)); final _wallet = wallet; diff --git a/lib/view_model/dashboard/transaction_list_item.dart b/lib/view_model/dashboard/transaction_list_item.dart index cba206ad0..909f22472 100644 --- a/lib/view_model/dashboard/transaction_list_item.dart +++ b/lib/view_model/dashboard/transaction_list_item.dart @@ -1,6 +1,7 @@ import 'package:cake_wallet/entities/balance_display_mode.dart'; import 'package:cake_wallet/entities/fiat_currency.dart'; import 'package:cake_wallet/entities/transaction_info.dart'; +import 'package:cake_wallet/utils/mobx.dart'; import 'package:cake_wallet/view_model/dashboard/action_list_item.dart'; import 'package:cake_wallet/bitcoin/bitcoin_transaction_info.dart'; import 'package:cake_wallet/monero/monero_transaction_info.dart'; @@ -8,28 +9,25 @@ import 'package:cake_wallet/monero/monero_amount_format.dart'; import 'package:cake_wallet/bitcoin/bitcoin_amount_format.dart'; import 'package:cake_wallet/entities/calculate_fiat_amount_raw.dart'; -class TransactionListItem extends ActionListItem { - TransactionListItem({ - this.transaction, - this.price, - this.fiatCurrency, - this.displayMode - }); +class TransactionListItem extends ActionListItem with Keyable { + TransactionListItem( + {this.transaction, this.price, this.fiatCurrency, this.displayMode}); final TransactionInfo transaction; final double price; final FiatCurrency fiatCurrency; final BalanceDisplayMode displayMode; - String get formattedCryptoAmount { + @override + dynamic get keyIndex => transaction.id; + String get formattedCryptoAmount { return displayMode == BalanceDisplayMode.hiddenBalance ? '---' : transaction.amountFormatted(); } String get formattedFiatAmount { - if (transaction is MoneroTransactionInfo) { final amount = calculateFiatAmountRaw( cryptoAmount: moneroAmountToDouble(amount: transaction.amount), @@ -51,4 +49,4 @@ class TransactionListItem extends ActionListItem { @override DateTime get date => transaction.date; -} \ No newline at end of file +} diff --git a/lib/view_model/node_list/node_list_view_model.dart b/lib/view_model/node_list/node_list_view_model.dart index 66b7e446c..4ca46c9fc 100644 --- a/lib/view_model/node_list/node_list_view_model.dart +++ b/lib/view_model/node_list/node_list_view_model.dart @@ -24,7 +24,7 @@ abstract class NodeListViewModelBase with Store { nodes.addAll(values.where((Node node) => node.type == _wallet.type).map( (Node val) => ItemCell(val, isSelected: val.key == currentNode.key, key: val.key))); - connectDifferent( + connectWithTransform( _nodeListStore.nodes, nodes, (Node val) => ItemCell(val,