Fixes for monero transaction history updates.

M committed Sep 22, 2020 at 16:35 UTC c53b6676b2737f0465b3d03863352bc2c3091115
9 files changed +66 -17
ios/Flutter/.last_build_id deleted
-1
@@ -1 +0,0 @@
1 -09c81fe0a3d701eb6da3bd2c6fc5ec65
\ No newline at end of file
lib/core/transaction_history.dart
+4 -2
@@ -10,15 +10,17 @@ abstract class TransactionHistoryBase<TransactionType extends TransactionInfo> {
10
11 bool _isUpdating;
12
13 + @action
14 Future<void> update() async {
15 if (_isUpdating) {
16 return;
17 }
18
19 try {
19 - _isUpdating = false;
20 - transactions.addAll(await fetchTransactions());
20 _isUpdating = true;
21 + final _transactions = await fetchTransactions();
22 + _transactions.forEach((key, value) => transactions[key] = value);
23 + _isUpdating = false;
24 } catch (e) {
25 _isUpdating = false;
26 rethrow;
lib/entities/transaction_info.dart
+5 -1
@@ -1,6 +1,7 @@
1 import 'package:cake_wallet/entities/transaction_direction.dart';
2 +import 'package:cake_wallet/utils/mobx.dart';
3
3 -abstract class TransactionInfo extends Object {
4 +abstract class TransactionInfo extends Object with Keyable {
5 String id;
6 int amount;
7 TransactionDirection direction;
@@ -11,4 +12,7 @@ abstract class TransactionInfo extends Object {
12 String amountFormatted();
13 String fiatAmount();
14 void changeFiatAmount(String amount);
15 +
16 + @override
17 + dynamic get keyIndex => id;
18 }
\ No newline at end of file
lib/monero/monero_transaction_history.dart
+1
@@ -34,6 +34,7 @@ abstract class MoneroTransactionHistoryBase
34 }
35
36 @override
37 + @action
38 void updateAsync({void Function() onFinished}) {
39 fetchTransactionsAsync(
40 (transaction) => transactions[transaction.id] = transaction,
lib/monero/monero_wallet.dart
+6 -1
@@ -92,6 +92,7 @@ abstract class MoneroWalletBase extends WalletBase<MoneroBalance> with Store {
92 monero_wallet.getFullBalance(accountIndex: account.id));
93 address = subaddress.address;
94 _setListeners();
95 + await transactionHistory.update();
96 }
97
98 void close() {
@@ -245,7 +246,11 @@ abstract class MoneroWalletBase extends WalletBase<MoneroBalance> with Store {
246 }
247 }
248
248 - void _askForUpdateTransactionHistory() => transactionHistory.updateAsync();
249 + Future<void> _askForUpdateTransactionHistory() async {
250 + print('start');
251 + await transactionHistory.update();
252 + print('end');
253 + }
254
255 int _getFullBalance() =>
256 monero_wallet.getFullBalance(accountIndex: account.id);
lib/utils/mobx.dart
+31 -1
@@ -6,7 +6,7 @@ mixin Keyable {
6 dynamic keyIndex;
7 }
8
9 -void connectDifferent<T extends Keyable, Y extends Keyable>(
9 +void connectWithTransform<T extends Keyable, Y extends Keyable>(
10 ObservableList<T> source, ObservableList<Y> dest, Y Function(T) transform,
11 {bool Function(T) filter}) {
12 source.observe((ListChange<T> change) {
@@ -36,6 +36,36 @@ void connectDifferent<T extends Keyable, Y extends Keyable>(
36 });
37 }
38
39 +void connectMapToListWithTransform<T extends Keyable, Y extends Keyable>(
40 + ObservableMap<dynamic, T> source,
41 + ObservableList<Y> dest,
42 + Y Function(T) transform,
43 + {bool Function(T) filter}) {
44 + source.observe((MapChange<dynamic, T> change) {
45 + switch (change.type) {
46 + case OperationType.add:
47 + if (filter?.call(change.newValue) ?? true) {
48 + dest.add(transform(change.newValue));
49 + }
50 + break;
51 + case OperationType.remove:
52 + // Hive could has equal index and key
53 + dest.removeWhere(
54 + (elem) => elem.keyIndex == (change.key ?? change.newValue.keyIndex));
55 + break;
56 + case OperationType.update:
57 + for (var i = 0; i < dest.length; i++) {
58 + final item = dest[i];
59 +
60 + if (item.keyIndex == change.key) {
61 + dest[i] = transform(change.newValue);
62 + }
63 + }
64 + break;
65 + }
66 + });
67 +}
68 +
69 void connect<T extends Keyable>(
70 ObservableList<T> source, ObservableList<T> dest) {
71 source.observe((ListChange<T> change) {
lib/view_model/dashboard/dashboard_view_model.dart
+10
@@ -7,6 +7,7 @@ import 'package:cake_wallet/entities/transaction_direction.dart';
7 import 'package:cake_wallet/entities/transaction_info.dart';
8 import 'package:cake_wallet/exchange/exchange_provider_description.dart';
9 import 'package:cake_wallet/exchange/trade.dart';
10 +import 'package:cake_wallet/utils/mobx.dart';
11 import 'package:cake_wallet/view_model/dashboard/balance_view_model.dart';
12 import 'package:cake_wallet/view_model/dashboard/filter_item.dart';
13 import 'package:cake_wallet/view_model/dashboard/trade_list_item.dart';
@@ -82,6 +83,15 @@ abstract class DashboardViewModelBase with Store {
83 displayMode: balanceDisplayMode)));
84
85 _reaction = reaction((_) => appStore.wallet, _onWalletChange);
86 + // FIXME: fixme
87 + connectMapToListWithTransform(
88 + appStore.wallet.transactionHistory.transactions,
89 + transactions,
90 + (TransactionInfo val) => TransactionListItem(
91 + transaction: val,
92 + price: price,
93 + fiatCurrency: appStore.settingsStore.fiatCurrency,
94 + displayMode: balanceDisplayMode));
95
96 final _wallet = wallet;
97
lib/view_model/dashboard/transaction_list_item.dart
+8 -10
@@ -1,6 +1,7 @@
1 import 'package:cake_wallet/entities/balance_display_mode.dart';
2 import 'package:cake_wallet/entities/fiat_currency.dart';
3 import 'package:cake_wallet/entities/transaction_info.dart';
4 +import 'package:cake_wallet/utils/mobx.dart';
5 import 'package:cake_wallet/view_model/dashboard/action_list_item.dart';
6 import 'package:cake_wallet/bitcoin/bitcoin_transaction_info.dart';
7 import 'package:cake_wallet/monero/monero_transaction_info.dart';
@@ -8,28 +9,25 @@ import 'package:cake_wallet/monero/monero_amount_format.dart';
9 import 'package:cake_wallet/bitcoin/bitcoin_amount_format.dart';
10 import 'package:cake_wallet/entities/calculate_fiat_amount_raw.dart';
11
11 -class TransactionListItem extends ActionListItem {
12 - TransactionListItem({
13 - this.transaction,
14 - this.price,
15 - this.fiatCurrency,
16 - this.displayMode
17 - });
12 +class TransactionListItem extends ActionListItem with Keyable {
13 + TransactionListItem(
14 + {this.transaction, this.price, this.fiatCurrency, this.displayMode});
15
16 final TransactionInfo transaction;
17 final double price;
18 final FiatCurrency fiatCurrency;
19 final BalanceDisplayMode displayMode;
20
24 - String get formattedCryptoAmount {
21 + @override
22 + dynamic get keyIndex => transaction.id;
23
24 + String get formattedCryptoAmount {
25 return displayMode == BalanceDisplayMode.hiddenBalance
26 ? '---'
27 : transaction.amountFormatted();
28 }
29
30 String get formattedFiatAmount {
32 -
31 if (transaction is MoneroTransactionInfo) {
32 final amount = calculateFiatAmountRaw(
33 cryptoAmount: moneroAmountToDouble(amount: transaction.amount),
@@ -51,4 +49,4 @@ class TransactionListItem extends ActionListItem {
49
50 @override
51 DateTime get date => transaction.date;
54 -}
\ No newline at end of file
52 +}
lib/view_model/node_list/node_list_view_model.dart
+1 -1
@@ -24,7 +24,7 @@ abstract class NodeListViewModelBase with Store {
24 nodes.addAll(values.where((Node node) => node.type == _wallet.type).map(
25 (Node val) => ItemCell<Node>(val,
26 isSelected: val.key == currentNode.key, key: val.key)));
27 - connectDifferent(
27 + connectWithTransform(
28 _nodeListStore.nodes,
29 nodes,
30 (Node val) => ItemCell<Node>(val,