CAKE-329 | added unspent coins list page to the app

OleksandrSobol committed May 25, 2021 at 20:32 UTC aca8e8a292d413782821ba4bb48038384955a9ba
9 files changed +220 -17
lib/di.dart
+8
@@ -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_list_page.dart';
44 import 'package:cake_wallet/src/screens/wallet_keys/wallet_keys_page.dart';
45 import 'package:cake_wallet/src/screens/exchange/exchange_page.dart';
46 import 'package:cake_wallet/src/screens/exchange/exchange_template_page.dart';
@@ -76,6 +77,7 @@ import 'package:cake_wallet/view_model/setup_pin_code_view_model.dart';
77 import 'package:cake_wallet/view_model/support_view_model.dart';
78 import 'package:cake_wallet/view_model/transaction_details_view_model.dart';
79 import 'package:cake_wallet/view_model/trade_details_view_model.dart';
80 +import 'package:cake_wallet/view_model/unspent_coins/unspent_coins_list_view_model.dart';
81 import 'package:cake_wallet/view_model/wallet_address_list/wallet_address_edit_or_create_view_model.dart';
82 import 'package:cake_wallet/view_model/auth_view_model.dart';
83 import 'package:cake_wallet/view_model/dashboard/dashboard_view_model.dart';
@@ -561,5 +563,11 @@ Future setup(
563
564 getIt.registerFactory(() => SupportPage(getIt.get<SupportViewModel>()));
565
566 + getIt.registerFactory(() => UnspentCoinsListViewModel());
567 +
568 + getIt.registerFactory(() => UnspentCoinsListPage(
569 + unspentCoinsListViewModel: getIt.get<UnspentCoinsListViewModel>()
570 + ));
571 +
572 _isSetupFinished = true;
573 }
lib/router.dart
+5
@@ -9,6 +9,7 @@ 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_list_page.dart';
13 import 'package:cake_wallet/src/screens/wyre/wyre_page.dart';
14 import 'package:cake_wallet/store/settings_store.dart';
15 import 'package:cake_wallet/view_model/monero_account_list/account_list_item.dart';
@@ -355,6 +356,10 @@ Route<dynamic> createRoute(RouteSettings settings) {
356 return CupertinoPageRoute<void>(
357 builder: (_) => getIt.get<SupportPage>());
358
359 + case Routes.unspentCoinsList:
360 + return MaterialPageRoute<void>(
361 + builder: (_) => getIt.get<UnspentCoinsListPage>());
362 +
363 default:
364 return MaterialPageRoute<void>(
365 builder: (_) => Scaffold(
lib/routes.dart
+1
@@ -54,4 +54,5 @@ class Routes {
54 static const support = '/support';
55 static const orderDetails = '/order_details';
56 static const wyre = '/wyre';
57 + static const unspentCoinsList = '/unspent_coins_list';
58 }
\ No newline at end of file
lib/src/screens/send/send_page.dart
+27 -14
@@ -558,22 +558,35 @@ class SendPage extends BasePage {
558 ),
559 bottomSectionPadding:
560 EdgeInsets.only(left: 24, right: 24, bottom: 24),
561 - bottomSection: Observer(builder: (_) {
562 - return LoadingPrimaryButton(
563 - onPressed: () async {
564 - if (_formKey.currentState.validate()) {
565 - await sendViewModel.createTransaction();
566 - }
567 - },
568 - text: S.of(context).send,
569 - color: Theme.of(context).accentTextTheme.body2.color,
570 - textColor: Colors.white,
571 - isLoading: sendViewModel.state is IsExecutingState ||
572 - sendViewModel.state is TransactionCommitting,
573 - isDisabled:
561 + bottomSection: Column(
562 + children: [
563 + Observer(builder: (_) {
564 + return LoadingPrimaryButton(
565 + onPressed: () async {
566 + if (_formKey.currentState.validate()) {
567 + await sendViewModel.createTransaction();
568 + }
569 + },
570 + text: S.of(context).send,
571 + color: Theme.of(context).accentTextTheme.body2.color,
572 + textColor: Colors.white,
573 + isLoading: sendViewModel.state is IsExecutingState ||
574 + sendViewModel.state is TransactionCommitting,
575 + isDisabled:
576 false // FIXME !(syncStore.status is SyncedSyncStatus),
577 );
576 - })),
578 + }),
579 + Padding(
580 + padding: EdgeInsets.only(top: 12),
581 + child: PrimaryButton(
582 + onPressed: () => Navigator.of(context).pushNamed(Routes.unspentCoinsList),
583 + text: 'Unspent coins',
584 + color: Colors.green,
585 + textColor: Colors.white,
586 + )
587 + )
588 + ],
589 + )),
590 ));
591 }
592
lib/src/screens/unspent_coins/unspent_coins_list_page.dart new
+38
@@ -0,0 +1,38 @@
1 +import 'package:cake_wallet/src/screens/unspent_coins/widgets/unspent_coins_list_item.dart';
2 +import 'package:cake_wallet/src/widgets/standard_list.dart';
3 +import 'package:cake_wallet/view_model/unspent_coins/unspent_coins_list_view_model.dart';
4 +import 'package:flutter/material.dart';
5 +import 'package:flutter/cupertino.dart';
6 +import 'package:cake_wallet/src/screens/base_page.dart';
7 +
8 +class UnspentCoinsListPage extends BasePage {
9 + UnspentCoinsListPage({this.unspentCoinsListViewModel});
10 +
11 + @override
12 + String get title => 'Unspent coins';
13 +
14 + final UnspentCoinsListViewModel unspentCoinsListViewModel;
15 +
16 + @override
17 + Widget body(BuildContext context) {
18 + return SectionStandardList(
19 + sectionCount: 1,
20 + itemCounter: (int _) => unspentCoinsListViewModel.items.length,
21 + itemBuilder: (_, __, index) {
22 + final item = unspentCoinsListViewModel.items[index];
23 +
24 + return GestureDetector(
25 + onTap: () {print('Item taped');},
26 + child: UnspentCoinsListItem(
27 + address: item.address,
28 + amount: item.amount,
29 + isFrozen: item.isFrozen,
30 + note: item.note,
31 + isSending: item.isSending,
32 + onCheckBoxTap: (value) {print('CheckBox taped');},
33 + )
34 + );
35 + });
36 + }
37 +
38 +}
\ No newline at end of file
lib/src/screens/unspent_coins/widgets/unspent_coins_list_item.dart new
+77
@@ -0,0 +1,77 @@
1 +import 'package:auto_size_text/auto_size_text.dart';
2 +import 'package:cake_wallet/src/widgets/standard_checkbox.dart';
3 +import 'package:flutter/material.dart';
4 +import 'package:flutter/cupertino.dart';
5 +
6 +class UnspentCoinsListItem extends StatelessWidget {
7 + UnspentCoinsListItem({
8 + @required this.address,
9 + @required this.amount,
10 + @required this.isFrozen,
11 + @required this.note,
12 + @required this.isSending,
13 + @required this.onCheckBoxTap,
14 +});
15 +
16 + final String address;
17 + final String amount;
18 + final bool isFrozen;
19 + final String note;
20 + final bool isSending;
21 + final Function(bool) onCheckBoxTap;
22 +
23 + @override
24 + Widget build(BuildContext context) {
25 + final textStyle = TextStyle(
26 + fontSize: 16,
27 + fontWeight: FontWeight.w500,
28 + color: Theme.of(context)
29 + .primaryTextTheme
30 + .title
31 + .color);
32 +
33 + return Container(
34 + padding: EdgeInsets.fromLTRB(24, 16, 24, 16),
35 + color: Theme.of(context).backgroundColor,
36 + child: Column(
37 + crossAxisAlignment: CrossAxisAlignment.start,
38 + children: [
39 + Text(
40 + address ?? 'Address',
41 + style: textStyle,
42 + ),
43 + Padding(
44 + padding: EdgeInsets.only(top: 12),
45 + child: Text(
46 + amount ?? 'Amount',
47 + style: textStyle,
48 + )
49 + ),
50 + if (isFrozen ?? false) Padding(
51 + padding: EdgeInsets.only(top: 12),
52 + child: Text(
53 + 'Freeze',
54 + style: textStyle,
55 + )
56 + ),
57 + if (note?.isNotEmpty ?? false) Padding(
58 + padding: EdgeInsets.only(top: 12),
59 + child: AutoSizeText(
60 + note,
61 + style: textStyle,
62 + maxLines: 1
63 + )
64 + ),
65 + Padding(
66 + padding: EdgeInsets.only(top: 12),
67 + child: StandardCheckbox(
68 + value: isSending,
69 + caption: 'Sending',
70 + onChanged: onCheckBoxTap
71 + )
72 + )
73 + ],
74 + )
75 + );
76 + }
77 +}
\ No newline at end of file
lib/view_model/unspent_coins/unspent_coins_item.dart new
+14
@@ -0,0 +1,14 @@
1 +class UnspentCoinsItem {
2 + UnspentCoinsItem({
3 + this.address,
4 + this.amount,
5 + this.isFrozen,
6 + this.note,
7 + this.isSending = true});
8 +
9 + final String address;
10 + final String amount;
11 + final bool isFrozen;
12 + final String note;
13 + final bool isSending;
14 +}
\ No newline at end of file
lib/view_model/unspent_coins/unspent_coins_list_view_model.dart new
+47
@@ -0,0 +1,47 @@
1 +import 'package:cake_wallet/view_model/unspent_coins/unspent_coins_item.dart';
2 +import 'package:mobx/mobx.dart';
3 +
4 +part 'unspent_coins_list_view_model.g.dart';
5 +
6 +const List<Map<String, dynamic>> unspentCoinsMap = [
7 + <String, dynamic>{
8 + "address" : "11111111111111121111132432432432432432432443124324324234324324324324332424",
9 + "amount" : "222",
10 + "isFrozen" : true,
11 + "note" : "333cvgf23132132132132131321321314rwrtdggfdddewq ewqasfdxgdhgfgfszczcxgbhhhbcgbc"},
12 + <String, dynamic>{
13 + "address" : "444",
14 + "amount" : "555",
15 + "note" : "sfjskf"},
16 + <String, dynamic>{
17 + "address" : "777",
18 + "amount" : "888",
19 + "isFrozen" : false},
20 + <String, dynamic>{
21 + "address" : "11111111111111121111132432432432432432432443124324324234324324324324332424",
22 + "amount" : "222",
23 + "isFrozen" : true,
24 + "note" : "333cvgf23132132132132131321321314rwrtdggfdddewq ewqasfdxgdhgfgfszczcxgbhhhbcgbc"},
25 + <String, dynamic>{
26 + "address" : "444",
27 + "amount" : "555",
28 + "note" : "sffsfsdsgs"},
29 + <String, dynamic>{
30 + "address" : "777",
31 + "amount" : "888",
32 + "isFrozen" : false},
33 + <String, dynamic>{},
34 +];
35 +
36 +class UnspentCoinsListViewModel = UnspentCoinsListViewModelBase with _$UnspentCoinsListViewModel;
37 +
38 +abstract class UnspentCoinsListViewModelBase with Store {
39 + @computed
40 + List<UnspentCoinsItem> get items => unspentCoinsMap.map((elem) =>
41 + UnspentCoinsItem(
42 + address: elem["address"] as String,
43 + amount: elem["amount"] as String,
44 + isFrozen: elem["isFrozen"] as bool,
45 + note: elem["note"] as String
46 + )).toList();
47 +}
\ No newline at end of file
pubspec.lock
+3 -3
@@ -70,7 +70,7 @@ packages:
70 path: "."
71 ref: cake
72 resolved-ref: "02fef082f20af13de00b4e64efb93a2c1e5e1cf2"
73 - url: "git@github.com:cake-tech/bech32.git"
73 + url: "https://github.com/cake-tech/bech32.git"
74 source: git
75 version: "0.2.0"
76 bip32:
@@ -92,8 +92,8 @@ packages:
92 description:
93 path: "."
94 ref: cake
95 - resolved-ref: b3ab2926c665f0e68b74a4a5f31059f7fcd817b7
96 - url: "git@github.com:cake-tech/bitcoin_flutter.git"
95 + resolved-ref: cbabfd87b6ce3cae6051a3e86ddb56e7a934e188
96 + url: "https://github.com/cake-tech/bitcoin_flutter.git"
97 source: git
98 version: "2.0.2"
99 boolean_selector: