From aca8e8a292d413782821ba4bb48038384955a9ba Mon Sep 17 00:00:00 2001 From: OleksandrSobol Date: Tue, 25 May 2021 20:32:36 +0300 Subject: [PATCH] CAKE-329 | added unspent coins list page to the app --- lib/di.dart | 8 ++ lib/router.dart | 5 ++ lib/routes.dart | 1 + lib/src/screens/send/send_page.dart | 41 ++++++---- .../unspent_coins_list_page.dart | 38 +++++++++ .../widgets/unspent_coins_list_item.dart | 77 +++++++++++++++++++ .../unspent_coins/unspent_coins_item.dart | 14 ++++ .../unspent_coins_list_view_model.dart | 47 +++++++++++ pubspec.lock | 6 +- 9 files changed, 220 insertions(+), 17 deletions(-) create mode 100644 lib/src/screens/unspent_coins/unspent_coins_list_page.dart create mode 100644 lib/src/screens/unspent_coins/widgets/unspent_coins_list_item.dart create mode 100644 lib/view_model/unspent_coins/unspent_coins_item.dart create mode 100644 lib/view_model/unspent_coins/unspent_coins_list_view_model.dart diff --git a/lib/di.dart b/lib/di.dart index cae3a068..211bf570 100644 --- a/lib/di.dart +++ b/lib/di.dart @@ -40,6 +40,7 @@ import 'package:cake_wallet/src/screens/setup_pin_code/setup_pin_code.dart'; import 'package:cake_wallet/src/screens/support/support_page.dart'; import 'package:cake_wallet/src/screens/trade_details/trade_details_page.dart'; import 'package:cake_wallet/src/screens/transaction_details/transaction_details_page.dart'; +import 'package:cake_wallet/src/screens/unspent_coins/unspent_coins_list_page.dart'; import 'package:cake_wallet/src/screens/wallet_keys/wallet_keys_page.dart'; import 'package:cake_wallet/src/screens/exchange/exchange_page.dart'; 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'; import 'package:cake_wallet/view_model/support_view_model.dart'; import 'package:cake_wallet/view_model/transaction_details_view_model.dart'; import 'package:cake_wallet/view_model/trade_details_view_model.dart'; +import 'package:cake_wallet/view_model/unspent_coins/unspent_coins_list_view_model.dart'; import 'package:cake_wallet/view_model/wallet_address_list/wallet_address_edit_or_create_view_model.dart'; import 'package:cake_wallet/view_model/auth_view_model.dart'; import 'package:cake_wallet/view_model/dashboard/dashboard_view_model.dart'; @@ -561,5 +563,11 @@ Future setup( getIt.registerFactory(() => SupportPage(getIt.get())); + getIt.registerFactory(() => UnspentCoinsListViewModel()); + + getIt.registerFactory(() => UnspentCoinsListPage( + unspentCoinsListViewModel: getIt.get() + )); + _isSetupFinished = true; } diff --git a/lib/router.dart b/lib/router.dart index 19a6b760..b8967645 100644 --- a/lib/router.dart +++ b/lib/router.dart @@ -9,6 +9,7 @@ import 'package:cake_wallet/src/screens/restore/restore_from_backup_page.dart'; import 'package:cake_wallet/src/screens/restore/wallet_restore_page.dart'; import 'package:cake_wallet/src/screens/seed/pre_seed_page.dart'; import 'package:cake_wallet/src/screens/support/support_page.dart'; +import 'package:cake_wallet/src/screens/unspent_coins/unspent_coins_list_page.dart'; import 'package:cake_wallet/src/screens/wyre/wyre_page.dart'; import 'package:cake_wallet/store/settings_store.dart'; import 'package:cake_wallet/view_model/monero_account_list/account_list_item.dart'; @@ -355,6 +356,10 @@ Route createRoute(RouteSettings settings) { return CupertinoPageRoute( builder: (_) => getIt.get()); + case Routes.unspentCoinsList: + return MaterialPageRoute( + builder: (_) => getIt.get()); + default: return MaterialPageRoute( builder: (_) => Scaffold( diff --git a/lib/routes.dart b/lib/routes.dart index 2bf8ee7b..84a48d5e 100644 --- a/lib/routes.dart +++ b/lib/routes.dart @@ -54,4 +54,5 @@ class Routes { static const support = '/support'; static const orderDetails = '/order_details'; static const wyre = '/wyre'; + static const unspentCoinsList = '/unspent_coins_list'; } \ No newline at end of file diff --git a/lib/src/screens/send/send_page.dart b/lib/src/screens/send/send_page.dart index 9fae0ec2..1fd74e13 100644 --- a/lib/src/screens/send/send_page.dart +++ b/lib/src/screens/send/send_page.dart @@ -558,22 +558,35 @@ class SendPage extends BasePage { ), bottomSectionPadding: EdgeInsets.only(left: 24, right: 24, bottom: 24), - bottomSection: Observer(builder: (_) { - return LoadingPrimaryButton( - onPressed: () async { - if (_formKey.currentState.validate()) { - await sendViewModel.createTransaction(); - } - }, - text: S.of(context).send, - color: Theme.of(context).accentTextTheme.body2.color, - textColor: Colors.white, - isLoading: sendViewModel.state is IsExecutingState || - sendViewModel.state is TransactionCommitting, - isDisabled: + bottomSection: Column( + children: [ + Observer(builder: (_) { + return LoadingPrimaryButton( + onPressed: () async { + if (_formKey.currentState.validate()) { + await sendViewModel.createTransaction(); + } + }, + text: S.of(context).send, + color: Theme.of(context).accentTextTheme.body2.color, + textColor: Colors.white, + isLoading: sendViewModel.state is IsExecutingState || + sendViewModel.state is TransactionCommitting, + isDisabled: false // FIXME !(syncStore.status is SyncedSyncStatus), ); - })), + }), + Padding( + padding: EdgeInsets.only(top: 12), + child: PrimaryButton( + onPressed: () => Navigator.of(context).pushNamed(Routes.unspentCoinsList), + text: 'Unspent coins', + color: Colors.green, + textColor: Colors.white, + ) + ) + ], + )), )); } diff --git a/lib/src/screens/unspent_coins/unspent_coins_list_page.dart b/lib/src/screens/unspent_coins/unspent_coins_list_page.dart new file mode 100644 index 00000000..44a6a34b --- /dev/null +++ b/lib/src/screens/unspent_coins/unspent_coins_list_page.dart @@ -0,0 +1,38 @@ +import 'package:cake_wallet/src/screens/unspent_coins/widgets/unspent_coins_list_item.dart'; +import 'package:cake_wallet/src/widgets/standard_list.dart'; +import 'package:cake_wallet/view_model/unspent_coins/unspent_coins_list_view_model.dart'; +import 'package:flutter/material.dart'; +import 'package:flutter/cupertino.dart'; +import 'package:cake_wallet/src/screens/base_page.dart'; + +class UnspentCoinsListPage extends BasePage { + UnspentCoinsListPage({this.unspentCoinsListViewModel}); + + @override + String get title => 'Unspent coins'; + + final UnspentCoinsListViewModel unspentCoinsListViewModel; + + @override + Widget body(BuildContext context) { + return SectionStandardList( + sectionCount: 1, + itemCounter: (int _) => unspentCoinsListViewModel.items.length, + itemBuilder: (_, __, index) { + final item = unspentCoinsListViewModel.items[index]; + + return GestureDetector( + onTap: () {print('Item taped');}, + child: UnspentCoinsListItem( + address: item.address, + amount: item.amount, + isFrozen: item.isFrozen, + note: item.note, + isSending: item.isSending, + onCheckBoxTap: (value) {print('CheckBox taped');}, + ) + ); + }); + } + +} \ No newline at end of file diff --git a/lib/src/screens/unspent_coins/widgets/unspent_coins_list_item.dart b/lib/src/screens/unspent_coins/widgets/unspent_coins_list_item.dart new file mode 100644 index 00000000..eb8ba33c --- /dev/null +++ b/lib/src/screens/unspent_coins/widgets/unspent_coins_list_item.dart @@ -0,0 +1,77 @@ +import 'package:auto_size_text/auto_size_text.dart'; +import 'package:cake_wallet/src/widgets/standard_checkbox.dart'; +import 'package:flutter/material.dart'; +import 'package:flutter/cupertino.dart'; + +class UnspentCoinsListItem extends StatelessWidget { + UnspentCoinsListItem({ + @required this.address, + @required this.amount, + @required this.isFrozen, + @required this.note, + @required this.isSending, + @required this.onCheckBoxTap, +}); + + final String address; + final String amount; + final bool isFrozen; + final String note; + final bool isSending; + final Function(bool) onCheckBoxTap; + + @override + Widget build(BuildContext context) { + final textStyle = TextStyle( + fontSize: 16, + fontWeight: FontWeight.w500, + color: Theme.of(context) + .primaryTextTheme + .title + .color); + + return Container( + padding: EdgeInsets.fromLTRB(24, 16, 24, 16), + color: Theme.of(context).backgroundColor, + child: Column( + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + Text( + address ?? 'Address', + style: textStyle, + ), + Padding( + padding: EdgeInsets.only(top: 12), + child: Text( + amount ?? 'Amount', + style: textStyle, + ) + ), + if (isFrozen ?? false) Padding( + padding: EdgeInsets.only(top: 12), + child: Text( + 'Freeze', + style: textStyle, + ) + ), + if (note?.isNotEmpty ?? false) Padding( + padding: EdgeInsets.only(top: 12), + child: AutoSizeText( + note, + style: textStyle, + maxLines: 1 + ) + ), + Padding( + padding: EdgeInsets.only(top: 12), + child: StandardCheckbox( + value: isSending, + caption: 'Sending', + onChanged: onCheckBoxTap + ) + ) + ], + ) + ); + } +} \ No newline at end of file diff --git a/lib/view_model/unspent_coins/unspent_coins_item.dart b/lib/view_model/unspent_coins/unspent_coins_item.dart new file mode 100644 index 00000000..94b7d55c --- /dev/null +++ b/lib/view_model/unspent_coins/unspent_coins_item.dart @@ -0,0 +1,14 @@ +class UnspentCoinsItem { + UnspentCoinsItem({ + this.address, + this.amount, + this.isFrozen, + this.note, + this.isSending = true}); + + final String address; + final String amount; + final bool isFrozen; + final String note; + final bool isSending; +} \ No newline at end of file diff --git a/lib/view_model/unspent_coins/unspent_coins_list_view_model.dart b/lib/view_model/unspent_coins/unspent_coins_list_view_model.dart new file mode 100644 index 00000000..4b765d55 --- /dev/null +++ b/lib/view_model/unspent_coins/unspent_coins_list_view_model.dart @@ -0,0 +1,47 @@ +import 'package:cake_wallet/view_model/unspent_coins/unspent_coins_item.dart'; +import 'package:mobx/mobx.dart'; + +part 'unspent_coins_list_view_model.g.dart'; + +const List> unspentCoinsMap = [ + { + "address" : "11111111111111121111132432432432432432432443124324324234324324324324332424", + "amount" : "222", + "isFrozen" : true, + "note" : "333cvgf23132132132132131321321314rwrtdggfdddewq ewqasfdxgdhgfgfszczcxgbhhhbcgbc"}, + { + "address" : "444", + "amount" : "555", + "note" : "sfjskf"}, + { + "address" : "777", + "amount" : "888", + "isFrozen" : false}, + { + "address" : "11111111111111121111132432432432432432432443124324324234324324324324332424", + "amount" : "222", + "isFrozen" : true, + "note" : "333cvgf23132132132132131321321314rwrtdggfdddewq ewqasfdxgdhgfgfszczcxgbhhhbcgbc"}, + { + "address" : "444", + "amount" : "555", + "note" : "sffsfsdsgs"}, + { + "address" : "777", + "amount" : "888", + "isFrozen" : false}, + {}, +]; + +class UnspentCoinsListViewModel = UnspentCoinsListViewModelBase with _$UnspentCoinsListViewModel; + +abstract class UnspentCoinsListViewModelBase with Store { + @computed + List get items => unspentCoinsMap.map((elem) => + UnspentCoinsItem( + address: elem["address"] as String, + amount: elem["amount"] as String, + isFrozen: elem["isFrozen"] as bool, + note: elem["note"] as String + )).toList(); +} \ No newline at end of file diff --git a/pubspec.lock b/pubspec.lock index 3ff59607..207f4b18 100644 --- a/pubspec.lock +++ b/pubspec.lock @@ -70,7 +70,7 @@ packages: path: "." ref: cake resolved-ref: "02fef082f20af13de00b4e64efb93a2c1e5e1cf2" - url: "git@github.com:cake-tech/bech32.git" + url: "https://github.com/cake-tech/bech32.git" source: git version: "0.2.0" bip32: @@ -92,8 +92,8 @@ packages: description: path: "." ref: cake - resolved-ref: b3ab2926c665f0e68b74a4a5f31059f7fcd817b7 - url: "git@github.com:cake-tech/bitcoin_flutter.git" + resolved-ref: cbabfd87b6ce3cae6051a3e86ddb56e7a934e188 + url: "https://github.com/cake-tech/bitcoin_flutter.git" source: git version: "2.0.2" boolean_selector: