CAKE-330 | added unspent coins details page to the app
OleksandrSobol committed
May 27, 2021 at 20:57 UTC
e36c07b0da6377849f363c5fb94bd4f01bfd5af4
8 files changed
+189
-1
lib/di.dart
+12
@@ -40,6 +40,7 @@ import 'package:cake_wallet/src/screens/setup_pin_code/setup_pin_code.dart';
40
import 'package:cake_wallet/src/screens/support/support_page.dart';
41
import 'package:cake_wallet/src/screens/trade_details/trade_details_page.dart';
42
import 'package:cake_wallet/src/screens/transaction_details/transaction_details_page.dart';
43
+import 'package:cake_wallet/src/screens/unspent_coins/unspent_coins_details_page.dart';
44
import 'package:cake_wallet/src/screens/unspent_coins/unspent_coins_list_page.dart';
45
import 'package:cake_wallet/src/screens/wallet_keys/wallet_keys_page.dart';
46
import 'package:cake_wallet/src/screens/exchange/exchange_page.dart';
@@ -77,6 +78,8 @@ import 'package:cake_wallet/view_model/setup_pin_code_view_model.dart';
78
import 'package:cake_wallet/view_model/support_view_model.dart';
79
import 'package:cake_wallet/view_model/transaction_details_view_model.dart';
80
import 'package:cake_wallet/view_model/trade_details_view_model.dart';
81
+import 'package:cake_wallet/view_model/unspent_coins/unspent_coins_details_view_model.dart';
82
+import 'package:cake_wallet/view_model/unspent_coins/unspent_coins_item.dart';
83
import 'package:cake_wallet/view_model/unspent_coins/unspent_coins_list_view_model.dart';
84
import 'package:cake_wallet/view_model/wallet_address_list/wallet_address_edit_or_create_view_model.dart';
85
import 'package:cake_wallet/view_model/auth_view_model.dart';
@@ -569,5 +572,14 @@ Future setup(
572
unspentCoinsListViewModel: getIt.get<UnspentCoinsListViewModel>()
573
));
574
575
+ getIt.registerFactoryParam<UnspentCoinsDetailsViewModel,
576
+ UnspentCoinsItem, void>((item, _) =>
577
+ UnspentCoinsDetailsViewModel(unspentCoinsItem: item));
578
+
579
+ getIt.registerFactoryParam<UnspentCoinsDetailsPage,
580
+ UnspentCoinsItem, void>((UnspentCoinsItem item, _) =>
581
+ UnspentCoinsDetailsPage(unspentCoinsDetailsViewModel:
582
+ getIt.get<UnspentCoinsDetailsViewModel>(param1: item)));
583
+
584
_isSetupFinished = true;
585
}
lib/router.dart
+8
@@ -9,10 +9,12 @@ import 'package:cake_wallet/src/screens/restore/restore_from_backup_page.dart';
9
import 'package:cake_wallet/src/screens/restore/wallet_restore_page.dart';
10
import 'package:cake_wallet/src/screens/seed/pre_seed_page.dart';
11
import 'package:cake_wallet/src/screens/support/support_page.dart';
12
+import 'package:cake_wallet/src/screens/unspent_coins/unspent_coins_details_page.dart';
13
import 'package:cake_wallet/src/screens/unspent_coins/unspent_coins_list_page.dart';
14
import 'package:cake_wallet/src/screens/wyre/wyre_page.dart';
15
import 'package:cake_wallet/store/settings_store.dart';
16
import 'package:cake_wallet/view_model/monero_account_list/account_list_item.dart';
17
+import 'package:cake_wallet/view_model/unspent_coins/unspent_coins_item.dart';
18
import 'package:flutter/cupertino.dart';
19
import 'package:flutter/material.dart';
20
import 'package:cake_wallet/routes.dart';
@@ -360,6 +362,12 @@ Route<dynamic> createRoute(RouteSettings settings) {
362
return MaterialPageRoute<void>(
363
builder: (_) => getIt.get<UnspentCoinsListPage>());
364
365
+ case Routes.unspentCoinsDetails:
366
+ return MaterialPageRoute<void>(
367
+ builder: (_) =>
368
+ getIt.get<UnspentCoinsDetailsPage>(
369
+ param1: settings.arguments as UnspentCoinsItem));
370
+
371
default:
372
return MaterialPageRoute<void>(
373
builder: (_) => Scaffold(
lib/routes.dart
+1
@@ -55,4 +55,5 @@ class Routes {
55
static const orderDetails = '/order_details';
56
static const wyre = '/wyre';
57
static const unspentCoinsList = '/unspent_coins_list';
58
+ static const unspentCoinsDetails = '/unspent_coins_details';
59
}
\ No newline at end of file
lib/src/screens/unspent_coins/unspent_coins_details_page.dart
new
+52
@@ -0,0 +1,52 @@
1
+import 'package:cake_wallet/src/screens/transaction_details/textfield_list_item.dart';
2
+import 'package:cake_wallet/src/screens/transaction_details/widgets/textfield_list_row.dart';
3
+import 'package:cake_wallet/src/screens/unspent_coins/widgets/unspent_coins_switch_row.dart';
4
+import 'package:cake_wallet/src/widgets/standard_list.dart';
5
+import 'package:cake_wallet/view_model/unspent_coins/unspent_coins_details_view_model.dart';
6
+import 'package:cake_wallet/view_model/unspent_coins/unspent_coins_switch_item.dart';
7
+import 'package:flutter/material.dart';
8
+import 'package:cake_wallet/src/widgets/standart_list_row.dart';
9
+import 'package:cake_wallet/src/screens/transaction_details/standart_list_item.dart';
10
+import 'package:cake_wallet/src/screens/base_page.dart';
11
+import 'package:flutter_mobx/flutter_mobx.dart';
12
+
13
+class UnspentCoinsDetailsPage extends BasePage {
14
+ UnspentCoinsDetailsPage({this.unspentCoinsDetailsViewModel});
15
+
16
+ @override
17
+ String get title => 'Unspent coins details';
18
+
19
+ final UnspentCoinsDetailsViewModel unspentCoinsDetailsViewModel;
20
+
21
+ @override
22
+ Widget body(BuildContext context) {
23
+ return SectionStandardList(
24
+ sectionCount: 1,
25
+ itemCounter: (int _) => unspentCoinsDetailsViewModel.items.length,
26
+ itemBuilder: (_, __, index) {
27
+ final item = unspentCoinsDetailsViewModel.items[index];
28
+
29
+ if (item is StandartListItem) {
30
+ return StandartListRow(title: '${item.title}:', value: item.value);
31
+ }
32
+
33
+ if (item is TextFieldListItem) {
34
+ return TextFieldListRow(
35
+ title: item.title,
36
+ value: item.value,
37
+ onSubmitted: item.onSubmitted,
38
+ );
39
+ }
40
+
41
+ if (item is UnspentCoinsSwitchItem) {
42
+ return Observer(builder: (_) => UnspentCoinsSwitchRow(
43
+ title: item.title,
44
+ switchValue: item.switchValue(),
45
+ onSwitchValueChange: item.onSwitchValueChange
46
+ ));
47
+ }
48
+
49
+ return null;
50
+ });
51
+ }
52
+}
\ No newline at end of file
lib/src/screens/unspent_coins/unspent_coins_list_page.dart
+4
-1
@@ -1,3 +1,4 @@
1
+import 'package:cake_wallet/routes.dart';
2
import 'package:cake_wallet/src/screens/unspent_coins/widgets/unspent_coins_list_item.dart';
3
import 'package:cake_wallet/src/widgets/standard_list.dart';
4
import 'package:cake_wallet/view_model/unspent_coins/unspent_coins_list_view_model.dart';
@@ -23,7 +24,9 @@ class UnspentCoinsListPage extends BasePage {
24
final item = unspentCoinsListViewModel.items[index];
25
26
return GestureDetector(
26
- onTap: () {print('Item taped');},
27
+ onTap: () =>
28
+ Navigator.of(context).pushNamed(Routes.unspentCoinsDetails,
29
+ arguments: item),
30
child: UnspentCoinsListItem(
31
address: item.address,
32
amount: item.amount,
lib/src/screens/unspent_coins/widgets/unspent_coins_switch_row.dart
new
+45
@@ -0,0 +1,45 @@
1
+import 'package:cake_wallet/src/widgets/standart_switch.dart';
2
+import 'package:flutter/cupertino.dart';
3
+import 'package:flutter/material.dart';
4
+
5
+class UnspentCoinsSwitchRow extends StatelessWidget {
6
+ UnspentCoinsSwitchRow(
7
+ {this.title,
8
+ this.titleFontSize = 14,
9
+ this.switchValue,
10
+ this.onSwitchValueChange});
11
+
12
+ final String title;
13
+ final double titleFontSize;
14
+ final bool switchValue;
15
+ final void Function(bool value) onSwitchValueChange;
16
+
17
+ @override
18
+ Widget build(BuildContext context) {
19
+ return Container(
20
+ width: double.infinity,
21
+ color: Theme.of(context).backgroundColor,
22
+ child: Padding(
23
+ padding:
24
+ const EdgeInsets.only(left: 24, top: 16, bottom: 16, right: 24),
25
+ child: Column(
26
+ crossAxisAlignment: CrossAxisAlignment.start,
27
+ children: <Widget>[
28
+ Text(title,
29
+ style: TextStyle(
30
+ fontSize: titleFontSize,
31
+ fontWeight: FontWeight.w500,
32
+ color: Theme.of(context)
33
+ .primaryTextTheme.overline.color),
34
+ textAlign: TextAlign.left),
35
+ Padding(
36
+ padding: EdgeInsets.only(top: 12),
37
+ child: StandartSwitch(
38
+ value: switchValue,
39
+ onTaped: () => onSwitchValueChange(!switchValue))
40
+ )
41
+ ]),
42
+ ),
43
+ );
44
+ }
45
+}
\ No newline at end of file
lib/view_model/unspent_coins/unspent_coins_details_view_model.dart
new
+55
@@ -0,0 +1,55 @@
1
+import 'package:cake_wallet/src/screens/transaction_details/standart_list_item.dart';
2
+import 'package:cake_wallet/src/screens/transaction_details/textfield_list_item.dart';
3
+import 'package:cake_wallet/src/screens/transaction_details/transaction_details_list_item.dart';
4
+import 'package:cake_wallet/view_model/unspent_coins/unspent_coins_item.dart';
5
+import 'package:cake_wallet/generated/i18n.dart';
6
+import 'package:cake_wallet/view_model/unspent_coins/unspent_coins_switch_item.dart';
7
+import 'package:mobx/mobx.dart';
8
+
9
+part 'unspent_coins_details_view_model.g.dart';
10
+
11
+class UnspentCoinsDetailsViewModel = UnspentCoinsDetailsViewModelBase
12
+ with _$UnspentCoinsDetailsViewModel;
13
+
14
+abstract class UnspentCoinsDetailsViewModelBase with Store {
15
+ UnspentCoinsDetailsViewModelBase({this.unspentCoinsItem}) {
16
+ final amount = unspentCoinsItem.amount ?? '';
17
+ final address = unspentCoinsItem.address ?? '';
18
+ isFrozen = unspentCoinsItem.isFrozen ?? false;
19
+ note = unspentCoinsItem.note ?? '';
20
+
21
+ items = [
22
+ StandartListItem(
23
+ title: 'Amount',
24
+ value: amount
25
+ ),
26
+ StandartListItem(
27
+ title: 'Address',
28
+ value: address
29
+ ),
30
+ TextFieldListItem(
31
+ title: S.current.note_tap_to_change,
32
+ value: note,
33
+ onSubmitted: (value) {
34
+ note = value;
35
+ }),
36
+ UnspentCoinsSwitchItem(
37
+ title: 'Freeze',
38
+ value: '',
39
+ switchValue: () => isFrozen,
40
+ onSwitchValueChange: (value) {
41
+ isFrozen = value;
42
+ }
43
+ )
44
+ ];
45
+ }
46
+
47
+ @observable
48
+ bool isFrozen;
49
+
50
+ @observable
51
+ String note;
52
+
53
+ final UnspentCoinsItem unspentCoinsItem;
54
+ List<TransactionDetailsListItem> items;
55
+}
\ No newline at end of file
lib/view_model/unspent_coins/unspent_coins_switch_item.dart
new
+12
@@ -0,0 +1,12 @@
1
+import 'package:cake_wallet/src/screens/transaction_details/transaction_details_list_item.dart';
2
+
3
+class UnspentCoinsSwitchItem extends TransactionDetailsListItem {
4
+ UnspentCoinsSwitchItem({
5
+ String title,
6
+ String value,
7
+ this.switchValue,
8
+ this.onSwitchValueChange}) : super(title: title, value: value);
9
+
10
+ final bool Function() switchValue;
11
+ final void Function(bool value) onSwitchValueChange;
12
+}
\ No newline at end of file