Block explorer row in transaction details is now implemented as an item subclass rather than being index dependent in the list
Tanner Silva committed
Jan 20, 2021 at 20:01 UTC
248cb3a0da3c238e3a613b417cf2bd4e137d4594
3 files changed
+41
-45
lib/src/screens/transaction_details/blockexplorer_list_item.dart
new
+8
@@ -0,0 +1,8 @@
1
+import 'package:flutter/material.dart';
2
+import 'package:cake_wallet/src/screens/transaction_details/transaction_details_list_item.dart';
3
+
4
+class BlockExplorerListItem extends TransactionDetailsListItem {
5
+ BlockExplorerListItem({String title, String value, this.onTap})
6
+ : super(title: title, value: value);
7
+ final Function() onTap;
8
+}
lib/src/screens/transaction_details/transaction_details_page.dart
+18
-38
@@ -7,6 +7,7 @@ import 'package:flutter/material.dart';
7
import 'package:flutter/services.dart';
8
import 'package:cake_wallet/generated/i18n.dart';
9
import 'package:cake_wallet/src/widgets/standart_list_row.dart';
10
+import 'package:cake_wallet/src/screens/transaction_details/blockexplorer_list_item.dart';
11
import 'package:cake_wallet/src/screens/transaction_details/standart_list_item.dart';
12
import 'package:cake_wallet/src/screens/base_page.dart';
13
import 'package:cake_wallet/utils/date_formatter.dart';
@@ -15,19 +16,6 @@ import 'package:url_launcher/url_launcher.dart';
16
17
import 'package:hive/hive.dart';
18
18
-String stripURLToTXID(String inputString) {
19
- final RegExp txidRegex = new RegExp('[a-z0-9]{64}');
20
- return txidRegex.allMatches(inputString).first.group(0);
21
-}
22
-
23
-String blockExplorerName(String inputName) {
24
- if (inputName.contains("xmrchain")) {
25
- return "XMRChain.net";
26
- } else {
27
- return "Blockchain.com";
28
- }
29
-}
30
-
19
class TransactionDetailsPage extends BasePage {
20
TransactionDetailsPage({this.transactionDetailsViewModel});
21
@@ -45,31 +33,23 @@ class TransactionDetailsPage extends BasePage {
33
final item = transactionDetailsViewModel.items[index];
34
35
if (item is StandartListItem) {
48
- final isFinalBlockExplorerItem =
49
- index == transactionDetailsViewModel.items.length - 1
50
- ? true
51
- : false;
52
- if (isFinalBlockExplorerItem == false) {
53
- return GestureDetector(
54
- onTap: () {
55
- Clipboard.setData(ClipboardData(text: item.value));
56
- showBar<void>(context,
57
- S.of(context).transaction_details_copied(item.title));
58
- },
59
- child:
60
- StandartListRow(title: '${item.title}:', value: item.value),
61
- );
62
- } else {
63
- return GestureDetector(
64
- onTap: () {
65
- launch(item.value);
66
- },
67
- child: StandartListRow(
68
- title: '${item.title}:',
69
- value:
70
- "View transaction on ${blockExplorerName(item.value)}"),
71
- );
72
- }
36
+ return GestureDetector(
37
+ onTap: () {
38
+ Clipboard.setData(ClipboardData(text: item.value));
39
+ showBar<void>(context,
40
+ S.of(context).transaction_details_copied(item.title));
41
+ },
42
+ child:
43
+ StandartListRow(title: '${item.title}:', value: item.value),
44
+ );
45
+ }
46
+
47
+ if (item is BlockExplorerListItem) {
48
+ return GestureDetector(
49
+ onTap: item.onTap,
50
+ child:
51
+ StandartListRow(title: '${item.title}:', value: item.value),
52
+ );
53
}
54
55
if (item is TextFieldListItem) {
lib/view_model/transaction_details_view_model.dart
+15
-7
@@ -4,12 +4,14 @@ import 'package:cake_wallet/monero/monero_transaction_info.dart';
4
import 'package:cake_wallet/src/screens/transaction_details/standart_list_item.dart';
5
import 'package:cake_wallet/src/screens/transaction_details/textfield_list_item.dart';
6
import 'package:cake_wallet/src/screens/transaction_details/transaction_details_list_item.dart';
7
+import 'package:cake_wallet/src/screens/transaction_details/blockexplorer_list_item.dart';
8
import 'package:cake_wallet/utils/date_formatter.dart';
9
import 'package:cake_wallet/entities/transaction_description.dart';
10
import 'package:hive/hive.dart';
11
import 'package:mobx/mobx.dart';
12
import 'package:cake_wallet/store/settings_store.dart';
13
import 'package:cake_wallet/generated/i18n.dart';
14
+import 'package:url_launcher/url_launcher.dart';
15
16
part 'transaction_details_view_model.g.dart';
17
@@ -41,6 +43,12 @@ abstract class TransactionDetailsViewModelBase with Store {
43
value: tx.amountFormatted()),
44
StandartListItem(
45
title: S.current.transaction_details_fee, value: tx.feeFormatted()),
46
+ BlockExplorerListItem(
47
+ title: "View in Block Explorer",
48
+ value: "View Transaction on XMRChain.net",
49
+ onTap: () {
50
+ launch("https://xmrchain.net/search?value=${tx.id}");
51
+ })
52
];
53
54
if (tx.key?.isNotEmpty ?? null) {
@@ -49,9 +57,6 @@ abstract class TransactionDetailsViewModelBase with Store {
57
}
58
59
items.addAll(_items);
52
- items.add(StandartListItem(
53
- title: "View in Block Explorer",
54
- value: "https://xmrchain.net/search?value=${tx.id}"));
60
}
61
62
if (tx is BitcoinTransactionInfo) {
@@ -72,13 +77,16 @@ abstract class TransactionDetailsViewModelBase with Store {
77
if (tx.feeFormatted()?.isNotEmpty)
78
StandartListItem(
79
title: S.current.transaction_details_fee,
75
- value: tx.feeFormatted())
80
+ value: tx.feeFormatted()),
81
+ BlockExplorerListItem(
82
+ title: "View in Block Explorer",
83
+ value: "View Transaction on Blockchain.com",
84
+ onTap: () {
85
+ launch("https://www.blockchain.com/btc/tx/${tx.id}");
86
+ })
87
];
88
89
items.addAll(_items);
79
- items.add(StandartListItem(
80
- title: "View in Block Explorer",
81
- value: "https://www.blockchain.com/btc/tx/${tx.id}"));
90
}
91
92
if (showRecipientAddress) {