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