From bad65f559bd9844776ea69db6459489db1f1c0ba Mon Sep 17 00:00:00 2001 From: poka Date: Sun, 26 Nov 2023 17:56:55 +0100 Subject: [PATCH] refacto: widgetized wallets_home screen --- lib/providers/my_wallets.dart | 4 +- lib/screens/home.dart | 2 +- lib/screens/myWallets/wallets_home.dart | 210 +----------------- .../buttons/add_new_derivation_button.dart | 79 +++++++ .../buttons/chest_options_buttons.dart | 106 +++++++++ lib/widgets/{ => buttons}/home_buttons.dart | 0 lib/widgets/drag_tule_action.dart | 10 +- lib/widgets/drag_wallets_info.dart | 47 ++++ 8 files changed, 250 insertions(+), 208 deletions(-) create mode 100644 lib/widgets/buttons/add_new_derivation_button.dart create mode 100644 lib/widgets/buttons/chest_options_buttons.dart rename lib/widgets/{ => buttons}/home_buttons.dart (100%) create mode 100644 lib/widgets/drag_wallets_info.dart diff --git a/lib/providers/my_wallets.dart b/lib/providers/my_wallets.dart index 236875e..2e4e683 100644 --- a/lib/providers/my_wallets.dart +++ b/lib/providers/my_wallets.dart @@ -13,8 +13,8 @@ class MyWalletsProvider with ChangeNotifier { late String mnemonic; int? pinLenght; bool isNewDerivationLoading = false; - String lastFlyBy = ''; - String dragAddress = ''; + WalletData? lastFlyBy; + WalletData? dragAddress; bool isPinValid = false; bool isPinLoading = true; diff --git a/lib/screens/home.dart b/lib/screens/home.dart index 5e70648..df22b2e 100644 --- a/lib/screens/home.dart +++ b/lib/screens/home.dart @@ -19,7 +19,7 @@ import 'package:gecko/widgets/commons/common_elements.dart'; import 'package:gecko/screens/myWallets/restore_chest.dart'; import 'package:gecko/screens/onBoarding/1.dart'; import 'package:gecko/widgets/drawer.dart'; -import 'package:gecko/widgets/home_buttons.dart'; +import 'package:gecko/widgets/buttons/home_buttons.dart'; import 'package:hive_flutter/hive_flutter.dart'; import 'package:provider/provider.dart'; diff --git a/lib/screens/myWallets/wallets_home.dart b/lib/screens/myWallets/wallets_home.dart index 36d58ab..41bd53b 100644 --- a/lib/screens/myWallets/wallets_home.dart +++ b/lib/screens/myWallets/wallets_home.dart @@ -1,25 +1,22 @@ // ignore_for_file: use_build_context_synchronously import 'package:easy_localization/easy_localization.dart'; -import 'package:flutter_markdown/flutter_markdown.dart'; import 'package:gecko/globals.dart'; import 'package:gecko/models/chest_data.dart'; import 'package:gecko/models/widgets_keys.dart'; -import 'package:gecko/providers/duniter_indexer.dart'; import 'package:gecko/providers/my_wallets.dart'; import 'package:gecko/models/wallet_data.dart'; import 'package:flutter/material.dart'; import 'package:gecko/providers/substrate_sdk.dart'; -import 'package:gecko/screens/myWallets/chest_options.dart'; -import 'package:gecko/screens/myWallets/import_g1_v1.dart'; -import 'package:gecko/screens/myWallets/unlocking_wallet.dart'; import 'package:gecko/widgets/bottom_app_bar.dart'; +import 'package:gecko/widgets/buttons/add_new_derivation_button.dart'; +import 'package:gecko/widgets/buttons/chest_options_buttons.dart'; import 'package:gecko/widgets/commons/offline_info.dart'; import 'package:gecko/widgets/drag_tule_action.dart'; +import 'package:gecko/widgets/drag_wallets_info.dart'; import 'package:gecko/widgets/wallet_tile.dart'; import 'package:gecko/widgets/wallet_tile_membre.dart'; import 'package:provider/provider.dart'; -import 'package:flutter_svg/flutter_svg.dart'; import 'package:tutorial_coach_mark/tutorial_coach_mark.dart'; class WalletsHome extends StatefulWidget { @@ -79,11 +76,14 @@ class _WalletsHomeState extends State { ), bottomNavigationBar: Consumer(builder: (context, _, __) { - return myWalletProvider.lastFlyBy == '' + return myWalletProvider.lastFlyBy == null ? const GeckoBottomAppBar( actualRoute: 'safeHome', ) - : dragInfo(context); + : DragWalletsInfo( + lastFlyBy: myWalletProvider.lastFlyBy!, + dragAddress: myWalletProvider.dragAddress!, + ); }), body: FutureBuilder( future: myWalletProvider.readAllWallets(currentChestNumber), @@ -112,134 +112,6 @@ class _WalletsHomeState extends State { ); } - Widget dragInfo(BuildContext context) { - final myWalletProvider = - Provider.of(context, listen: false); - final duniterIndexer = Provider.of(context, listen: false); - - final walletDataFrom = - myWalletProvider.getWalletDataByAddress(myWalletProvider.dragAddress); - final walletDataTo = - myWalletProvider.getWalletDataByAddress(myWalletProvider.lastFlyBy); - - final bool isSameAddress = - myWalletProvider.dragAddress == myWalletProvider.lastFlyBy; - - final screenWidth = MediaQuery.of(homeContext).size.width; - - final fromName = - duniterIndexer.walletNameIndexer[walletDataFrom!.address] ?? - walletDataFrom.name; - - final toName = duniterIndexer.walletNameIndexer[walletDataTo!.address] ?? - walletDataTo.name; - - return Container( - color: yellowC, - width: screenWidth, - height: 80, - child: Center( - child: Column( - children: [ - const SizedBox(height: 5), - Text('${'executeATransfer'.tr()}:'), - MarkdownBody(data: '${'from'.tr()} **$fromName**'), - if (isSameAddress) Text('chooseATargetWallet'.tr()), - if (!isSameAddress) MarkdownBody(data: 'Vers: **$toName**'), - ], - )), - ); - } - - Widget chestOptions(BuildContext context, final myWalletProvider) { - return Column(children: [ - const SizedBox(height: 50), - SizedBox( - height: 80, - width: 420, - child: ElevatedButton.icon( - icon: Image.asset( - 'assets/chests/config.png', - height: 60, - ), - style: ElevatedButton.styleFrom( - foregroundColor: Colors.black, elevation: 2, - backgroundColor: floattingYellow, // foreground - ), - onPressed: () => Navigator.push( - context, - MaterialPageRoute(builder: (context) { - return ChestOptions(walletProvider: myWalletProvider); - }), - ), - label: Text( - " ${"manageChest".tr()}", - style: const TextStyle( - fontSize: 22, - fontWeight: FontWeight.w700, - color: Color(0xff8a3c0f), - ), - ), - )), - const SizedBox(height: 30), - Row( - mainAxisAlignment: MainAxisAlignment.center, - children: [ - SvgPicture.asset( - 'assets/cesium_bw2.svg', - semanticsLabel: 'CS', - height: 50, - ), - const SizedBox(width: 5), - InkWell( - key: keyImportG1v1, - onTap: () { - Navigator.push( - context, - MaterialPageRoute(builder: (context) { - return const ImportG1v1(); - }), - ); - }, - child: SizedBox( - width: 350, - height: 60, - child: Center( - child: Text('importG1v1'.tr(), - style: TextStyle( - fontSize: 22, - color: Colors.blue[900], - fontWeight: FontWeight.w500))), - ), - ), - ], - ), - const SizedBox(height: 20), - InkWell( - key: keyChangeChest, - onTap: () { - // Navigator.push( - // context, - // MaterialPageRoute(builder: (context) { - // return const ChooseChest(); - // }), - // ); - }, - child: SizedBox( - width: 400, - height: 60, - child: Center( - child: Text('changeChest'.tr(), - style: const TextStyle( - fontSize: 22, - color: Colors.grey, //orangeC - fontWeight: FontWeight.w500))), - ), - ), - const SizedBox(height: 30) - ]); - } - Widget myWalletsTiles(BuildContext context, int currentChestNumber) { final myWalletProvider = Provider.of(context); final bool isWalletsExists = myWalletProvider.checkIfWalletExist(); @@ -348,73 +220,11 @@ class _WalletsHomeState extends State { Consumer(builder: (context, sub, _) { return sub.nodeConnected && myWalletProvider.listWallets.length < maxWalletsInSafe - ? addNewDerivation(context) + ? const AddNewDerivationButton() : const Text(''); }), ]), - SliverToBoxAdapter(child: chestOptions(context, myWalletProvider)), + const SliverToBoxAdapter(child: ChestOptionsButtons()), ]); } - - Widget addNewDerivation(context) { - final myWalletProvider = Provider.of(context); - - String newDerivationName = - '${'wallet'.tr()} ${myWalletProvider.listWallets.last.number! + 2}'; - return Padding( - padding: const EdgeInsets.all(16), - child: ClipRRect( - borderRadius: const BorderRadius.all(Radius.circular(12)), - child: Column(children: [ - Expanded( - child: InkWell( - key: keyAddDerivation, - onTap: () async { - if (!myWalletProvider.isNewDerivationLoading) { - WalletData? defaultWallet = - myWalletProvider.getDefaultWallet(); - String? pin; - if (myWalletProvider.pinCode == '') { - pin = await Navigator.push( - context, - MaterialPageRoute( - builder: (homeContext) { - return UnlockingWallet(wallet: defaultWallet); - }, - ), - ); - } - if (pin != null || myWalletProvider.pinCode != '') { - await myWalletProvider.generateNewDerivation( - context, newDerivationName); - } - } - }, - child: Container( - width: double.infinity, - height: double.infinity, - decoration: const BoxDecoration(color: floattingYellow), - child: Center( - child: myWalletProvider.isNewDerivationLoading - ? const SizedBox( - height: 60, - width: 60, - child: CircularProgressIndicator( - color: orangeC, - strokeWidth: 7, - ), - ) - : const Text( - '+', - style: TextStyle( - fontSize: 150, - fontWeight: FontWeight.w700, - color: Color(0xFFFCB437)), - )), - )), - ), - ]), - ), - ); - } } diff --git a/lib/widgets/buttons/add_new_derivation_button.dart b/lib/widgets/buttons/add_new_derivation_button.dart new file mode 100644 index 0000000..ed86d4e --- /dev/null +++ b/lib/widgets/buttons/add_new_derivation_button.dart @@ -0,0 +1,79 @@ +// ignore_for_file: use_build_context_synchronously + +import 'package:easy_localization/easy_localization.dart'; +import 'package:flutter/material.dart'; +import 'package:gecko/globals.dart'; +import 'package:gecko/models/wallet_data.dart'; +import 'package:gecko/models/widgets_keys.dart'; +import 'package:gecko/providers/my_wallets.dart'; +import 'package:gecko/screens/myWallets/unlocking_wallet.dart'; +import 'package:provider/provider.dart'; + +class AddNewDerivationButton extends StatelessWidget { + const AddNewDerivationButton({ + Key? key, + }) : super(key: key); + + @override + Widget build(BuildContext context) { + final myWalletProvider = Provider.of(context); + + String newDerivationName = + '${'wallet'.tr()} ${myWalletProvider.listWallets.last.number! + 2}'; + return Padding( + padding: const EdgeInsets.all(16), + child: ClipRRect( + borderRadius: const BorderRadius.all(Radius.circular(12)), + child: Column(children: [ + Expanded( + child: InkWell( + key: keyAddDerivation, + onTap: () async { + if (!myWalletProvider.isNewDerivationLoading) { + WalletData? defaultWallet = + myWalletProvider.getDefaultWallet(); + String? pin; + if (myWalletProvider.pinCode == '') { + pin = await Navigator.push( + context, + MaterialPageRoute( + builder: (homeContext) { + return UnlockingWallet(wallet: defaultWallet); + }, + ), + ); + } + if (pin != null || myWalletProvider.pinCode != '') { + await myWalletProvider.generateNewDerivation( + context, newDerivationName); + } + } + }, + child: Container( + width: double.infinity, + height: double.infinity, + decoration: const BoxDecoration(color: floattingYellow), + child: Center( + child: myWalletProvider.isNewDerivationLoading + ? const SizedBox( + height: 60, + width: 60, + child: CircularProgressIndicator( + color: orangeC, + strokeWidth: 7, + ), + ) + : const Text( + '+', + style: TextStyle( + fontSize: 150, + fontWeight: FontWeight.w700, + color: Color(0xFFFCB437)), + )), + )), + ), + ]), + ), + ); + } +} diff --git a/lib/widgets/buttons/chest_options_buttons.dart b/lib/widgets/buttons/chest_options_buttons.dart new file mode 100644 index 0000000..91fa11d --- /dev/null +++ b/lib/widgets/buttons/chest_options_buttons.dart @@ -0,0 +1,106 @@ +import 'package:easy_localization/easy_localization.dart'; +import 'package:flutter/material.dart'; +import 'package:flutter_svg/flutter_svg.dart'; +import 'package:gecko/globals.dart'; +import 'package:gecko/models/widgets_keys.dart'; +import 'package:gecko/providers/my_wallets.dart'; +import 'package:gecko/screens/myWallets/chest_options.dart'; +import 'package:gecko/screens/myWallets/import_g1_v1.dart'; +import 'package:provider/provider.dart'; + +class ChestOptionsButtons extends StatelessWidget { + const ChestOptionsButtons({ + Key? key, + }) : super(key: key); + + @override + Widget build(BuildContext context) { + final myWalletProvider = Provider.of(context); + return Column(children: [ + const SizedBox(height: 50), + SizedBox( + height: 80, + width: 420, + child: ElevatedButton.icon( + icon: Image.asset( + 'assets/chests/config.png', + height: 60, + ), + style: ElevatedButton.styleFrom( + foregroundColor: Colors.black, elevation: 2, + backgroundColor: floattingYellow, // foreground + ), + onPressed: () => Navigator.push( + context, + MaterialPageRoute(builder: (context) { + return ChestOptions(walletProvider: myWalletProvider); + }), + ), + label: Text( + " ${"manageChest".tr()}", + style: const TextStyle( + fontSize: 22, + fontWeight: FontWeight.w700, + color: Color(0xff8a3c0f), + ), + ), + )), + const SizedBox(height: 30), + Row( + mainAxisAlignment: MainAxisAlignment.center, + children: [ + SvgPicture.asset( + 'assets/cesium_bw2.svg', + semanticsLabel: 'CS', + height: 50, + ), + const SizedBox(width: 5), + InkWell( + key: keyImportG1v1, + onTap: () { + Navigator.push( + context, + MaterialPageRoute(builder: (context) { + return const ImportG1v1(); + }), + ); + }, + child: SizedBox( + width: 350, + height: 60, + child: Center( + child: Text('importG1v1'.tr(), + style: TextStyle( + fontSize: 22, + color: Colors.blue[900], + fontWeight: FontWeight.w500))), + ), + ), + ], + ), + const SizedBox(height: 20), + InkWell( + key: keyChangeChest, + onTap: () { + // Navigator.push( + // context, + // MaterialPageRoute(builder: (context) { + // return const ChooseChest(); + // }), + // ); + }, + child: SizedBox( + width: 400, + height: 60, + child: Center( + child: Text('changeChest'.tr(), + style: const TextStyle( + fontSize: 22, + color: Colors.grey, //orangeC + fontWeight: FontWeight.w500))), + ), + ), + const SizedBox(height: 30) + ]); + } +} diff --git a/lib/widgets/home_buttons.dart b/lib/widgets/buttons/home_buttons.dart similarity index 100% rename from lib/widgets/home_buttons.dart rename to lib/widgets/buttons/home_buttons.dart diff --git a/lib/widgets/drag_tule_action.dart b/lib/widgets/drag_tule_action.dart index 7684670..1c3e640 100644 --- a/lib/widgets/drag_tule_action.dart +++ b/lib/widgets/drag_tule_action.dart @@ -26,10 +26,10 @@ class DragTuleAction extends StatelessWidget { const Offset(0, 0), // feedbackOffset: const Offset(-500, -500), // dragAnchorStrategy: childDragAnchorStrategy, - onDragStarted: () => myWalletProvider.dragAddress = wallet.address, + onDragStarted: () => myWalletProvider.dragAddress = wallet, onDragEnd: (_) { - myWalletProvider.lastFlyBy = ''; - myWalletProvider.dragAddress = ''; + myWalletProvider.lastFlyBy = null; + myWalletProvider.dragAddress = null; myWalletProvider.reload(); }, feedback: ElevatedButton( @@ -56,8 +56,8 @@ class DragTuleAction extends StatelessWidget { g1WalletsBox.get(wallet.address)!.username ?? wallet.name!); }, onMove: (details) { - if (wallet.address != myWalletProvider.lastFlyBy) { - myWalletProvider.lastFlyBy = wallet.address; + if (wallet.address != myWalletProvider.lastFlyBy?.address) { + myWalletProvider.lastFlyBy = wallet; myWalletProvider.reload(); } }, diff --git a/lib/widgets/drag_wallets_info.dart b/lib/widgets/drag_wallets_info.dart new file mode 100644 index 0000000..293eb20 --- /dev/null +++ b/lib/widgets/drag_wallets_info.dart @@ -0,0 +1,47 @@ +import 'package:easy_localization/easy_localization.dart'; +import 'package:flutter/material.dart'; +import 'package:flutter_markdown/flutter_markdown.dart'; +import 'package:gecko/globals.dart'; +import 'package:gecko/models/wallet_data.dart'; +import 'package:gecko/providers/duniter_indexer.dart'; +import 'package:provider/provider.dart'; + +class DragWalletsInfo extends StatelessWidget { + const DragWalletsInfo( + {Key? key, required this.dragAddress, required this.lastFlyBy}) + : super(key: key); + + final WalletData dragAddress; + final WalletData lastFlyBy; + + @override + Widget build(BuildContext context) { + final duniterIndexer = Provider.of(context, listen: false); + + final bool isSameAddress = dragAddress == lastFlyBy; + + final screenWidth = MediaQuery.of(homeContext).size.width; + + final fromName = duniterIndexer.walletNameIndexer[dragAddress.address] ?? + dragAddress.name; + + final toName = + duniterIndexer.walletNameIndexer[lastFlyBy.address] ?? lastFlyBy.name; + + return Container( + color: yellowC, + width: screenWidth, + height: 80, + child: Center( + child: Column( + children: [ + const SizedBox(height: 5), + Text('${'executeATransfer'.tr()}:'), + MarkdownBody(data: '${'from'.tr()} **$fromName**'), + if (isSameAddress) Text('chooseATargetWallet'.tr()), + if (!isSameAddress) MarkdownBody(data: 'Vers: **$toName**'), + ], + )), + ); + } +}