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: