From e36c07b0da6377849f363c5fb94bd4f01bfd5af4 Mon Sep 17 00:00:00 2001 From: OleksandrSobol Date: Thu, 27 May 2021 20:57:51 +0300 Subject: [PATCH] CAKE-330 | added unspent coins details page to the app --- lib/di.dart | 12 ++++ lib/router.dart | 8 +++ lib/routes.dart | 1 + .../unspent_coins_details_page.dart | 52 ++++++++++++++++++ .../unspent_coins_list_page.dart | 5 +- .../widgets/unspent_coins_switch_row.dart | 45 +++++++++++++++ .../unspent_coins_details_view_model.dart | 55 +++++++++++++++++++ .../unspent_coins_switch_item.dart | 12 ++++ 8 files changed, 189 insertions(+), 1 deletion(-) create mode 100644 lib/src/screens/unspent_coins/unspent_coins_details_page.dart create mode 100644 lib/src/screens/unspent_coins/widgets/unspent_coins_switch_row.dart create mode 100644 lib/view_model/unspent_coins/unspent_coins_details_view_model.dart create mode 100644 lib/view_model/unspent_coins/unspent_coins_switch_item.dart diff --git a/lib/di.dart b/lib/di.dart index 211bf5708..70f5b4a51 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_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'; @@ -77,6 +78,8 @@ 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_details_view_model.dart'; +import 'package:cake_wallet/view_model/unspent_coins/unspent_coins_item.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'; @@ -569,5 +572,14 @@ Future setup( unspentCoinsListViewModel: getIt.get() )); + getIt.registerFactoryParam((item, _) => + UnspentCoinsDetailsViewModel(unspentCoinsItem: item)); + + getIt.registerFactoryParam((UnspentCoinsItem item, _) => + UnspentCoinsDetailsPage(unspentCoinsDetailsViewModel: + getIt.get(param1: item))); + _isSetupFinished = true; } diff --git a/lib/router.dart b/lib/router.dart index b8967645e..7ecb95026 100644 --- a/lib/router.dart +++ b/lib/router.dart @@ -9,10 +9,12 @@ 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_details_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'; +import 'package:cake_wallet/view_model/unspent_coins/unspent_coins_item.dart'; import 'package:flutter/cupertino.dart'; import 'package:flutter/material.dart'; import 'package:cake_wallet/routes.dart'; @@ -360,6 +362,12 @@ Route createRoute(RouteSettings settings) { return MaterialPageRoute( builder: (_) => getIt.get()); + case Routes.unspentCoinsDetails: + return MaterialPageRoute( + builder: (_) => + getIt.get( + param1: settings.arguments as UnspentCoinsItem)); + default: return MaterialPageRoute( builder: (_) => Scaffold( diff --git a/lib/routes.dart b/lib/routes.dart index 84a48d5ea..65f8253a8 100644 --- a/lib/routes.dart +++ b/lib/routes.dart @@ -55,4 +55,5 @@ class Routes { static const orderDetails = '/order_details'; static const wyre = '/wyre'; static const unspentCoinsList = '/unspent_coins_list'; + static const unspentCoinsDetails = '/unspent_coins_details'; } \ No newline at end of file diff --git a/lib/src/screens/unspent_coins/unspent_coins_details_page.dart b/lib/src/screens/unspent_coins/unspent_coins_details_page.dart new file mode 100644 index 000000000..9f73eaaa3 --- /dev/null +++ b/lib/src/screens/unspent_coins/unspent_coins_details_page.dart @@ -0,0 +1,52 @@ +import 'package:cake_wallet/src/screens/transaction_details/textfield_list_item.dart'; +import 'package:cake_wallet/src/screens/transaction_details/widgets/textfield_list_row.dart'; +import 'package:cake_wallet/src/screens/unspent_coins/widgets/unspent_coins_switch_row.dart'; +import 'package:cake_wallet/src/widgets/standard_list.dart'; +import 'package:cake_wallet/view_model/unspent_coins/unspent_coins_details_view_model.dart'; +import 'package:cake_wallet/view_model/unspent_coins/unspent_coins_switch_item.dart'; +import 'package:flutter/material.dart'; +import 'package:cake_wallet/src/widgets/standart_list_row.dart'; +import 'package:cake_wallet/src/screens/transaction_details/standart_list_item.dart'; +import 'package:cake_wallet/src/screens/base_page.dart'; +import 'package:flutter_mobx/flutter_mobx.dart'; + +class UnspentCoinsDetailsPage extends BasePage { + UnspentCoinsDetailsPage({this.unspentCoinsDetailsViewModel}); + + @override + String get title => 'Unspent coins details'; + + final UnspentCoinsDetailsViewModel unspentCoinsDetailsViewModel; + + @override + Widget body(BuildContext context) { + return SectionStandardList( + sectionCount: 1, + itemCounter: (int _) => unspentCoinsDetailsViewModel.items.length, + itemBuilder: (_, __, index) { + final item = unspentCoinsDetailsViewModel.items[index]; + + if (item is StandartListItem) { + return StandartListRow(title: '${item.title}:', value: item.value); + } + + if (item is TextFieldListItem) { + return TextFieldListRow( + title: item.title, + value: item.value, + onSubmitted: item.onSubmitted, + ); + } + + if (item is UnspentCoinsSwitchItem) { + return Observer(builder: (_) => UnspentCoinsSwitchRow( + title: item.title, + switchValue: item.switchValue(), + onSwitchValueChange: item.onSwitchValueChange + )); + } + + return null; + }); + } +} \ No newline at end of file diff --git a/lib/src/screens/unspent_coins/unspent_coins_list_page.dart b/lib/src/screens/unspent_coins/unspent_coins_list_page.dart index cc175eb01..8a7b7de6c 100644 --- a/lib/src/screens/unspent_coins/unspent_coins_list_page.dart +++ b/lib/src/screens/unspent_coins/unspent_coins_list_page.dart @@ -1,3 +1,4 @@ +import 'package:cake_wallet/routes.dart'; 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'; @@ -23,7 +24,9 @@ class UnspentCoinsListPage extends BasePage { final item = unspentCoinsListViewModel.items[index]; return GestureDetector( - onTap: () {print('Item taped');}, + onTap: () => + Navigator.of(context).pushNamed(Routes.unspentCoinsDetails, + arguments: item), child: UnspentCoinsListItem( address: item.address, amount: item.amount, diff --git a/lib/src/screens/unspent_coins/widgets/unspent_coins_switch_row.dart b/lib/src/screens/unspent_coins/widgets/unspent_coins_switch_row.dart new file mode 100644 index 000000000..c7c1e81b8 --- /dev/null +++ b/lib/src/screens/unspent_coins/widgets/unspent_coins_switch_row.dart @@ -0,0 +1,45 @@ +import 'package:cake_wallet/src/widgets/standart_switch.dart'; +import 'package:flutter/cupertino.dart'; +import 'package:flutter/material.dart'; + +class UnspentCoinsSwitchRow extends StatelessWidget { + UnspentCoinsSwitchRow( + {this.title, + this.titleFontSize = 14, + this.switchValue, + this.onSwitchValueChange}); + + final String title; + final double titleFontSize; + final bool switchValue; + final void Function(bool value) onSwitchValueChange; + + @override + Widget build(BuildContext context) { + return Container( + width: double.infinity, + color: Theme.of(context).backgroundColor, + child: Padding( + padding: + const EdgeInsets.only(left: 24, top: 16, bottom: 16, right: 24), + child: Column( + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + Text(title, + style: TextStyle( + fontSize: titleFontSize, + fontWeight: FontWeight.w500, + color: Theme.of(context) + .primaryTextTheme.overline.color), + textAlign: TextAlign.left), + Padding( + padding: EdgeInsets.only(top: 12), + child: StandartSwitch( + value: switchValue, + onTaped: () => onSwitchValueChange(!switchValue)) + ) + ]), + ), + ); + } +} \ No newline at end of file diff --git a/lib/view_model/unspent_coins/unspent_coins_details_view_model.dart b/lib/view_model/unspent_coins/unspent_coins_details_view_model.dart new file mode 100644 index 000000000..33db96eba --- /dev/null +++ b/lib/view_model/unspent_coins/unspent_coins_details_view_model.dart @@ -0,0 +1,55 @@ +import 'package:cake_wallet/src/screens/transaction_details/standart_list_item.dart'; +import 'package:cake_wallet/src/screens/transaction_details/textfield_list_item.dart'; +import 'package:cake_wallet/src/screens/transaction_details/transaction_details_list_item.dart'; +import 'package:cake_wallet/view_model/unspent_coins/unspent_coins_item.dart'; +import 'package:cake_wallet/generated/i18n.dart'; +import 'package:cake_wallet/view_model/unspent_coins/unspent_coins_switch_item.dart'; +import 'package:mobx/mobx.dart'; + +part 'unspent_coins_details_view_model.g.dart'; + +class UnspentCoinsDetailsViewModel = UnspentCoinsDetailsViewModelBase + with _$UnspentCoinsDetailsViewModel; + +abstract class UnspentCoinsDetailsViewModelBase with Store { + UnspentCoinsDetailsViewModelBase({this.unspentCoinsItem}) { + final amount = unspentCoinsItem.amount ?? ''; + final address = unspentCoinsItem.address ?? ''; + isFrozen = unspentCoinsItem.isFrozen ?? false; + note = unspentCoinsItem.note ?? ''; + + items = [ + StandartListItem( + title: 'Amount', + value: amount + ), + StandartListItem( + title: 'Address', + value: address + ), + TextFieldListItem( + title: S.current.note_tap_to_change, + value: note, + onSubmitted: (value) { + note = value; + }), + UnspentCoinsSwitchItem( + title: 'Freeze', + value: '', + switchValue: () => isFrozen, + onSwitchValueChange: (value) { + isFrozen = value; + } + ) + ]; + } + + @observable + bool isFrozen; + + @observable + String note; + + final UnspentCoinsItem unspentCoinsItem; + List items; +} \ No newline at end of file diff --git a/lib/view_model/unspent_coins/unspent_coins_switch_item.dart b/lib/view_model/unspent_coins/unspent_coins_switch_item.dart new file mode 100644 index 000000000..925f8776e --- /dev/null +++ b/lib/view_model/unspent_coins/unspent_coins_switch_item.dart @@ -0,0 +1,12 @@ +import 'package:cake_wallet/src/screens/transaction_details/transaction_details_list_item.dart'; + +class UnspentCoinsSwitchItem extends TransactionDetailsListItem { + UnspentCoinsSwitchItem({ + String title, + String value, + this.switchValue, + this.onSwitchValueChange}) : super(title: title, value: value); + + final bool Function() switchValue; + final void Function(bool value) onSwitchValueChange; +} \ No newline at end of file