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) {