From e485af5194f493a480168106963d5a8cb3ea5de7 Mon Sep 17 00:00:00 2001 From: poka Date: Sun, 21 Jan 2024 21:58:18 +0100 Subject: [PATCH] enh: refactor askPinCode() --- lib/providers/my_wallets.dart | 15 ++++++++++++++ lib/providers/substrate_sdk.dart | 4 ++-- lib/providers/v2s_datapod.dart | 9 +++++++++ lib/providers/wallet_options.dart | 17 +--------------- lib/screens/myWallets/change_pin.dart | 17 ++-------------- lib/screens/myWallets/chest_options.dart | 14 +------------ lib/screens/myWallets/choose_chest.dart | 18 ++--------------- lib/screens/myWallets/custom_derivations.dart | 16 +-------------- lib/screens/myWallets/manage_membership.dart | 17 +--------------- lib/screens/myWallets/migrate_identity.dart | 20 ++----------------- lib/widgets/bottom_app_bar.dart | 16 +-------------- .../buttons/add_new_derivation_button.dart | 17 ++-------------- lib/widgets/payment_popup.dart | 14 ++----------- 13 files changed, 41 insertions(+), 153 deletions(-) diff --git a/lib/providers/my_wallets.dart b/lib/providers/my_wallets.dart index 367f80f..98a9381 100644 --- a/lib/providers/my_wallets.dart +++ b/lib/providers/my_wallets.dart @@ -6,6 +6,7 @@ import 'dart:async'; import 'package:gecko/globals.dart'; import 'package:gecko/models/wallet_data.dart'; import 'package:gecko/providers/substrate_sdk.dart'; +import 'package:gecko/screens/myWallets/unlocking_wallet.dart'; import 'package:gecko/widgets/commons/common_elements.dart'; import 'package:path_provider/path_provider.dart'; import 'package:provider/provider.dart'; @@ -76,6 +77,20 @@ class MyWalletsProvider with ChangeNotifier { return targetedWallet; } + Future askPinCode() async { + final defaultWallet = getDefaultWallet(); + + if (pinCode.isEmpty) { + await Navigator.push( + homeContext, + MaterialPageRoute( + builder: (homeContext) => UnlockingWallet(wallet: defaultWallet), + ), + ); + } + return pinCode.isNotEmpty; + } + WalletData? getWalletDataByAddress(String address) { WalletData? targetedWallet; diff --git a/lib/providers/substrate_sdk.dart b/lib/providers/substrate_sdk.dart index 54f2c5e..520c54e 100644 --- a/lib/providers/substrate_sdk.dart +++ b/lib/providers/substrate_sdk.dart @@ -183,12 +183,12 @@ class SubstrateSdk with ChangeNotifier { } Future signDatapod(String document, String address) async { - final myWallets = + final myWalletProvider = Provider.of(homeContext, listen: false); final messageToSign = Uint8List.fromList(document.codeUnits); final signatureString = - await _signMessage(messageToSign, address, myWallets.pinCode); + await _signMessage(messageToSign, address, myWalletProvider.pinCode); final signatureInt = HEX.decode(signatureString.substring(2)); final signature64 = base64Encode(signatureInt); diff --git a/lib/providers/v2s_datapod.dart b/lib/providers/v2s_datapod.dart index e2e3829..21a8443 100644 --- a/lib/providers/v2s_datapod.dart +++ b/lib/providers/v2s_datapod.dart @@ -5,6 +5,7 @@ import 'package:flutter/material.dart'; import 'package:gecko/globals.dart'; import 'package:gecko/models/queries_datapod.dart'; import 'package:gecko/models/scale_functions.dart'; +import 'package:gecko/providers/my_wallets.dart'; import 'package:gecko/providers/substrate_sdk.dart'; import 'package:graphql_flutter/graphql_flutter.dart'; import 'package:provider/provider.dart'; @@ -15,9 +16,13 @@ class V2sDatapodProvider with ChangeNotifier { Future> _setSignedVariables( String address, Map messageToSign) async { + final myWalletProvider = + Provider.of(homeContext, listen: false); + final sub = Provider.of(homeContext, listen: false); final hashDocBytes = utf8.encode(jsonEncode(messageToSign)); final hashDoc = sha256.convert(hashDocBytes).toString().toUpperCase(); + if (!await myWalletProvider.askPinCode()) return {}; final signature = await sub.signDatapod(hashDoc, address); return { @@ -53,6 +58,7 @@ class V2sDatapodProvider with ChangeNotifier { 'socials': socials }; final variables = await _setSignedVariables(address, messageToSign); + if (variables.isEmpty) return false; final result = await _execQuery(updateProfileQ, variables); if (result.hasException) { @@ -66,6 +72,7 @@ class V2sDatapodProvider with ChangeNotifier { Future deleteProfile({required String address}) async { final messageToSign = {'address': address}; final variables = await _setSignedVariables(address, messageToSign); + if (variables.isEmpty) return false; final result = await _execQuery(deleteProfileQ, variables); if (result.hasException) { @@ -80,6 +87,7 @@ class V2sDatapodProvider with ChangeNotifier { {required String addressOld, required String addressNew}) async { final messageToSign = {'addressOld': addressOld, 'addressNew': addressNew}; final variables = await _setSignedVariables(addressOld, messageToSign); + if (variables.isEmpty) return false; final result = await _execQuery(migrateProfileQ, variables); if (result.hasException) { @@ -101,6 +109,7 @@ class V2sDatapodProvider with ChangeNotifier { 'comment': comment, }; final variables = await _setSignedVariables(issuer, messageToSign); + if (variables.isEmpty) return false; final result = await _execQuery(addTransactionCommentQ, variables); if (result.hasException) { diff --git a/lib/providers/wallet_options.dart b/lib/providers/wallet_options.dart index ebb1fd2..adf8b11 100644 --- a/lib/providers/wallet_options.dart +++ b/lib/providers/wallet_options.dart @@ -13,7 +13,6 @@ import 'package:gecko/models/wallet_data.dart'; import 'package:gecko/providers/substrate_sdk.dart'; import 'package:gecko/providers/v2s_datapod.dart'; import 'package:gecko/widgets/commons/common_elements.dart'; -import 'package:gecko/screens/myWallets/unlocking_wallet.dart'; import 'package:gecko/screens/transaction_in_progress.dart'; import 'package:image_picker/image_picker.dart'; import 'package:provider/provider.dart'; @@ -224,21 +223,7 @@ class WalletOptionsProvider with ChangeNotifier { return; } - WalletData? defaultWallet = - myWalletProvider.getDefaultWallet(); - - if (myWalletProvider.pinCode == '') { - await Navigator.push( - context, - MaterialPageRoute( - builder: (homeContext) { - return UnlockingWallet( - wallet: defaultWallet); - }, - ), - ); - } - if (myWalletProvider.pinCode == '') return; + if (!await myWalletProvider.askPinCode()) return; final wallet = myWalletProvider .getWalletDataByAddress(address.text); diff --git a/lib/screens/myWallets/change_pin.dart b/lib/screens/myWallets/change_pin.dart index 349f5a5..f44d243 100644 --- a/lib/screens/myWallets/change_pin.dart +++ b/lib/screens/myWallets/change_pin.dart @@ -4,10 +4,8 @@ import 'package:easy_localization/easy_localization.dart'; import 'package:flutter/material.dart'; import 'package:durt/durt.dart'; import 'package:gecko/globals.dart'; -import 'package:gecko/models/wallet_data.dart'; import 'package:gecko/providers/my_wallets.dart'; import 'package:gecko/providers/substrate_sdk.dart'; -import 'package:gecko/screens/myWallets/unlocking_wallet.dart'; import 'package:gecko/widgets/commons/top_appbar.dart'; import 'package:provider/provider.dart'; @@ -92,20 +90,9 @@ class _ChangePinScreenState extends State { backgroundColor: Colors.green[400], ), onPressed: () async { - WalletData defaultWallet = - myWalletProvider.getDefaultWallet(); + final defaultWallet = myWalletProvider.getDefaultWallet(); - if (myWalletProvider.pinCode == '') { - await Navigator.push( - context, - MaterialPageRoute( - builder: (homeContext) { - return UnlockingWallet(wallet: defaultWallet); - }, - ), - ); - } - if (myWalletProvider.pinCode == '') return; + if (!await myWalletProvider.askPinCode()) return; await sub.changePassword(context, defaultWallet.address, widget.walletProvider.pinCode, newPin.text); diff --git a/lib/screens/myWallets/chest_options.dart b/lib/screens/myWallets/chest_options.dart index 4a8f581..7305553 100644 --- a/lib/screens/myWallets/chest_options.dart +++ b/lib/screens/myWallets/chest_options.dart @@ -5,14 +5,12 @@ import 'package:flutter/material.dart'; import 'package:gecko/globals.dart'; import 'package:gecko/models/chest_data.dart'; import 'package:gecko/models/scale_functions.dart'; -import 'package:gecko/models/wallet_data.dart'; import 'package:gecko/models/widgets_keys.dart'; import 'package:gecko/providers/chest_provider.dart'; import 'package:gecko/providers/my_wallets.dart'; import 'package:gecko/providers/substrate_sdk.dart'; import 'package:gecko/screens/myWallets/custom_derivations.dart'; import 'package:gecko/screens/myWallets/show_seed.dart'; -import 'package:gecko/screens/myWallets/unlocking_wallet.dart'; import 'package:gecko/widgets/bottom_app_bar.dart'; import 'package:gecko/widgets/commons/offline_info.dart'; import 'package:gecko/widgets/commons/top_appbar.dart'; @@ -44,18 +42,8 @@ class ChestOptions extends StatelessWidget { onTap: () async { final myWalletProvider = Provider.of(context, listen: false); - WalletData? defaultWallet = - myWalletProvider.getDefaultWallet(); - final String? pin = await Navigator.push( - context, - MaterialPageRoute( - builder: (homeContext) { - return UnlockingWallet(wallet: defaultWallet); - }, - ), - ); + if (!await myWalletProvider.askPinCode()) return; - if (pin == null) return; Navigator.push( context, MaterialPageRoute(builder: (context) { diff --git a/lib/screens/myWallets/choose_chest.dart b/lib/screens/myWallets/choose_chest.dart index 0285e12..264817b 100644 --- a/lib/screens/myWallets/choose_chest.dart +++ b/lib/screens/myWallets/choose_chest.dart @@ -5,10 +5,8 @@ import 'package:gecko/globals.dart'; import 'package:gecko/models/scale_functions.dart'; import 'package:gecko/models/widgets_keys.dart'; import 'package:gecko/providers/my_wallets.dart'; -import 'package:gecko/models/wallet_data.dart'; import 'package:flutter/material.dart'; import 'package:gecko/screens/myWallets/restore_chest.dart'; -import 'package:gecko/screens/myWallets/unlocking_wallet.dart'; import 'package:carousel_slider/carousel_slider.dart'; import 'package:gecko/screens/onBoarding/5.dart'; import 'package:provider/provider.dart'; @@ -110,25 +108,13 @@ class _ChooseChestState extends State { onPressed: () async { await configBox.put('currentChest', currentChest); myWalletProvider.pinCode = ''; - WalletData? defaultWallet = - myWalletProvider.getDefaultWallet(); - myWalletProvider.reload(); + if (!await myWalletProvider.askPinCode()) return; - await Navigator.push( - context, - MaterialPageRoute( - builder: (homeContext) { - return UnlockingWallet(wallet: defaultWallet); - }, - ), - ); Navigator.popUntil( context, ModalRoute.withName('/'), ); - if (myWalletProvider.pinCode != '') { - Navigator.pushNamed(context, '/mywallets'); - } + Navigator.pushNamed(context, '/mywallets'); }, child: Text( 'openThisChest'.tr(), diff --git a/lib/screens/myWallets/custom_derivations.dart b/lib/screens/myWallets/custom_derivations.dart index 76e2885..a6ec14f 100644 --- a/lib/screens/myWallets/custom_derivations.dart +++ b/lib/screens/myWallets/custom_derivations.dart @@ -6,7 +6,6 @@ import 'package:flutter/material.dart'; import 'package:gecko/models/scale_functions.dart'; import 'package:gecko/models/wallet_data.dart'; import 'package:gecko/providers/my_wallets.dart'; -import 'package:gecko/screens/myWallets/unlocking_wallet.dart'; import 'package:gecko/widgets/commons/top_appbar.dart'; import 'package:provider/provider.dart'; @@ -109,20 +108,7 @@ class _CustomDerivationState extends State { backgroundColor: orangeC, ), onPressed: () async { - WalletData? defaultWallet = - myWalletProvider.getDefaultWallet(); - if (myWalletProvider.pinCode == '') { - await Navigator.push( - context, - MaterialPageRoute( - builder: (homeContext) { - return UnlockingWallet(wallet: defaultWallet); - }, - ), - ); - } - - if (myWalletProvider.pinCode == '') return; + if (!await myWalletProvider.askPinCode()) return; String newDerivationName = '${'wallet'.tr()} ${myWalletProvider.listWallets.last.number! + 2}'; if (dropdownValue == 'root') { diff --git a/lib/screens/myWallets/manage_membership.dart b/lib/screens/myWallets/manage_membership.dart index 03f3c36..33e85c1 100644 --- a/lib/screens/myWallets/manage_membership.dart +++ b/lib/screens/myWallets/manage_membership.dart @@ -4,13 +4,11 @@ import 'package:easy_localization/easy_localization.dart'; import 'package:gecko/globals.dart'; import 'package:flutter/material.dart'; import 'package:gecko/models/scale_functions.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/providers/substrate_sdk.dart'; import 'package:gecko/widgets/commons/common_elements.dart'; import 'package:gecko/screens/myWallets/migrate_identity.dart'; -import 'package:gecko/screens/myWallets/unlocking_wallet.dart'; import 'package:gecko/screens/transaction_in_progress.dart'; import 'package:gecko/widgets/commons/top_appbar.dart'; import 'package:provider/provider.dart'; @@ -113,20 +111,7 @@ class ManageMembership extends StatelessWidget { Provider.of(context, listen: false); final sub = Provider.of(context, listen: false); - 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 == '') return; + if (!await myWalletProvider.askPinCode()) return; final transactionId = await sub.revokeIdentity(address, myWalletProvider.pinCode); diff --git a/lib/screens/myWallets/migrate_identity.dart b/lib/screens/myWallets/migrate_identity.dart index dc44cc3..8e77832 100644 --- a/lib/screens/myWallets/migrate_identity.dart +++ b/lib/screens/myWallets/migrate_identity.dart @@ -6,7 +6,6 @@ import 'package:gecko/globals.dart'; import 'package:flutter/material.dart'; import 'package:gecko/models/migrate_wallet_checks.dart'; import 'package:gecko/models/scale_functions.dart'; -import 'package:gecko/models/wallet_data.dart'; import 'package:gecko/models/widgets_keys.dart'; import 'package:gecko/providers/duniter_indexer.dart'; import 'package:gecko/providers/generate_wallets.dart'; @@ -14,7 +13,6 @@ import 'package:gecko/providers/my_wallets.dart'; import 'package:gecko/providers/substrate_sdk.dart'; import 'package:gecko/providers/wallet_options.dart'; import 'package:gecko/providers/wallets_profiles.dart'; -import 'package:gecko/screens/myWallets/unlocking_wallet.dart'; import 'package:gecko/screens/transaction_in_progress.dart'; import 'package:gecko/widgets/commons/top_appbar.dart'; import 'package:polkawallet_sdk/api/apiKeyring.dart'; @@ -189,21 +187,7 @@ class MigrateIdentityScreen extends StatelessWidget { ), onPressed: statusData.canValidate && mnemonicIsValid ? () async { - WalletData? defaultWallet = - myWalletProvider.getDefaultWallet(); - - String? pin; - if (myWalletProvider.pinCode == '') { - pin = await Navigator.push( - context, - MaterialPageRoute( - builder: (homeContext) { - return UnlockingWallet(wallet: defaultWallet); - }, - ), - ); - } - if (myWalletProvider.pinCode == '') return; + if (!await myWalletProvider.askPinCode()) return; await sub.importAccount( mnemonic: newMnemonicSentence.text, @@ -215,7 +199,7 @@ class MigrateIdentityScreen extends StatelessWidget { final transactionId = await sub.migrateIdentity( fromAddress: fromAddress, destAddress: newWalletAddress.text, - fromPassword: pin ?? myWalletProvider.pinCode, + fromPassword: myWalletProvider.pinCode, destPassword: 'password', withBalance: true, fromBalance: statusData.balance); diff --git a/lib/widgets/bottom_app_bar.dart b/lib/widgets/bottom_app_bar.dart index 7f8af23..c7bc459 100644 --- a/lib/widgets/bottom_app_bar.dart +++ b/lib/widgets/bottom_app_bar.dart @@ -4,12 +4,10 @@ import 'dart:io'; import 'package:flutter/material.dart'; import 'package:gecko/globals.dart'; import 'package:gecko/models/scale_functions.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/providers/search.dart'; import 'package:gecko/providers/wallets_profiles.dart'; -import 'package:gecko/screens/myWallets/unlocking_wallet.dart'; import 'package:provider/provider.dart'; class GeckoBottomAppBar extends StatelessWidget { @@ -93,20 +91,8 @@ class GeckoBottomAppBar extends StatelessWidget { onPressed: lockAction ? null : () async { - WalletData? defaultWallet = - myWalletProvider.getDefaultWallet(); - if (myWalletProvider.pinCode == '') { - await Navigator.push( - context, - MaterialPageRoute( - builder: (homeContext) { - return UnlockingWallet(wallet: defaultWallet); - }, - ), - ); - } + if (!await myWalletProvider.askPinCode()) return; - if (myWalletProvider.pinCode == '') return; Navigator.popUntil(context, ModalRoute.withName('/')); //FIXME: Should not have to wait 300 milliseconds when /mywallets exist in navigator... sleep(const Duration(milliseconds: 300)); diff --git a/lib/widgets/buttons/add_new_derivation_button.dart b/lib/widgets/buttons/add_new_derivation_button.dart index b2c5f3e..7ddb374 100644 --- a/lib/widgets/buttons/add_new_derivation_button.dart +++ b/lib/widgets/buttons/add_new_derivation_button.dart @@ -4,10 +4,8 @@ import 'package:easy_localization/easy_localization.dart'; import 'package:flutter/material.dart'; import 'package:gecko/globals.dart'; import 'package:gecko/models/scale_functions.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 { @@ -31,19 +29,8 @@ class AddNewDerivationButton extends StatelessWidget { key: keyAddDerivation, onTap: () async { if (!myWalletProvider.isNewDerivationLoading) { - WalletData? defaultWallet = - myWalletProvider.getDefaultWallet(); - if (myWalletProvider.pinCode == '') { - await Navigator.push( - context, - MaterialPageRoute( - builder: (homeContext) { - return UnlockingWallet(wallet: defaultWallet); - }, - ), - ); - } - if (myWalletProvider.pinCode == '') return; + if (!await myWalletProvider.askPinCode()) return; + await myWalletProvider.generateNewDerivation( context, newDerivationName); } diff --git a/lib/widgets/payment_popup.dart b/lib/widgets/payment_popup.dart index 268d8a9..2037b24 100644 --- a/lib/widgets/payment_popup.dart +++ b/lib/widgets/payment_popup.dart @@ -12,7 +12,6 @@ import 'package:gecko/providers/substrate_sdk.dart'; import 'package:gecko/providers/wallet_options.dart'; import 'package:gecko/providers/wallets_profiles.dart'; import 'package:gecko/screens/activity.dart'; -import 'package:gecko/screens/myWallets/unlocking_wallet.dart'; import 'package:gecko/screens/transaction_in_progress.dart'; import 'package:gecko/widgets/balance.dart'; import 'package:gecko/widgets/name_by_address.dart'; @@ -34,17 +33,8 @@ void paymentPopup(BuildContext context, String toAddress, String? username) { walletViewProvider.payAmount.text = ''; Future executeTransfert() async { - if (myWalletProvider.pinCode == '') { - await Navigator.push( - context, - MaterialPageRoute( - builder: (homeContext) { - return UnlockingWallet(wallet: defaultWallet); - }, - ), - ); - } - if (myWalletProvider.pinCode == '') return; + if (!await myWalletProvider.askPinCode()) return; + // Payment workflow ! final sub = Provider.of(context, listen: false); final acc = sub.getCurrentWallet();