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,