diff --git a/assets/translations/en.json b/assets/translations/en.json index f49029c..fde3597 100644 --- a/assets/translations/en.json +++ b/assets/translations/en.json @@ -177,7 +177,9 @@ "noContacts": "You don't have any contact", "addContact": "Add\nto contacts", "removeContact": "Remove\nthis contact", - "derivationsScanProgress": "Scan address {}/{}", + "scanRootDerivationInProgress": "Scan root address", + "derivationsScanProgress": "Scan {} firsts addresses", + "importDerivationsInProgress": "Import address {}/{}", "youAreOffline": "You are offline...", "importG1v1": "Import old G1v1 account", "selectDestWallet": "Select a target wallet:", diff --git a/assets/translations/es.json b/assets/translations/es.json index bb7a1d4..d641978 100644 --- a/assets/translations/es.json +++ b/assets/translations/es.json @@ -178,7 +178,9 @@ "noContacts": "No tienes ningún contacto", "addContact": "Añadir\na contactos", "removeContact": "Eliminar\neste contacto", - "derivationsScanProgress": "Escaneado de la dirección {}/{}", + "scanRootDerivationInProgress": "Scan root address", + "derivationsScanProgress": "Scan {} firsts addresses", + "importDerivationsInProgress": "Import address {}/{}", "youAreOffline": "Estás desconectado...", "importG1v1": "Importar la cuenta antigua de G1v1", "selectDestWallet": "Selecciona un monedero destino:", diff --git a/assets/translations/fr.json b/assets/translations/fr.json index 445e827..ff8c14a 100644 --- a/assets/translations/fr.json +++ b/assets/translations/fr.json @@ -177,7 +177,9 @@ "noContacts": "Vous n'avez aucun contact", "addContact": "Ajouter\naux contacts", "removeContact": "Supprimer\nce contact", - "derivationsScanProgress": "Scan de l'adresse {}/{}", + "scanRootDerivationInProgress": "Scan de l'adresse racine", + "derivationsScanProgress": "Scan des {} premières adresses", + "importDerivationsInProgress": "Importation de l'adresse {}/{}", "youAreOffline": "Vous êtes hors ligne...", "importG1v1": "Importer un ancien compte G1v1", "selectDestWallet": "Sélectionnez un portefeuille cible:", diff --git a/lib/providers/generate_wallets.dart b/lib/providers/generate_wallets.dart index 8ac8834..3d5d926 100644 --- a/lib/providers/generate_wallets.dart +++ b/lib/providers/generate_wallets.dart @@ -9,6 +9,7 @@ import 'package:gecko/models/bip39_words.dart'; import 'package:gecko/models/chest_data.dart'; import 'package:gecko/models/wallet_data.dart'; import 'package:gecko/providers/substrate_sdk.dart'; +import 'package:gecko/widgets/scan_derivations_info.dart'; import 'package:polkawallet_sdk/api/apiKeyring.dart'; import 'package:provider/provider.dart'; import "package:unorm_dart/unorm_dart.dart" as unorm; @@ -19,6 +20,7 @@ class GenerateWalletsProvider with ChangeNotifier { final walletNameFocus = FocusNode(); Color? askedWordColor = Colors.black; bool isAskedWordValid = false; + var scanStatus = ScanDerivationsStatus.none; int scanedValidWalletNumber = -1; int scanedWalletNumber = -1; int numberScan = 60; @@ -296,7 +298,6 @@ class GenerateWalletsProvider with ChangeNotifier { final sub = Provider.of(context, listen: false); final currentChestNumber = configBox.get('currentChest'); bool isAlive = false; - scanedValidWalletNumber = 0; scanedWalletNumber = 0; Map addressToScan = {}; notifyListeners(); @@ -305,14 +306,14 @@ class GenerateWalletsProvider with ChangeNotifier { return false; } + scanStatus = ScanDerivationsStatus.rootScanning; final hasRoot = await scanRootBalance(sub, currentChestNumber); - scanedWalletNumber = 1; notifyListeners(); if (hasRoot) { - scanedValidWalletNumber = 1; isAlive = true; } + scanStatus = ScanDerivationsStatus.scanning; for (int derivationNbr in [for (var i = 0; i < numberScan; i += 1) i]) { final addressData = await sub.sdk.api.keyring.addressFromMnemonic( sub.currencyParameters['ss58']!, @@ -328,35 +329,37 @@ class GenerateWalletsProvider with ChangeNotifier { onTimeout: () => {}, ); - for (String scannedWallet in balanceList.keys) { - if (balanceList[scannedWallet]!['transferableBalance'] != 0) { - isAlive = true; - String walletName = scanedValidWalletNumber == 0 - ? 'currentWallet'.tr() - : '${'wallet'.tr()} ${scanedValidWalletNumber + 1}'; - await sub.importAccount( - mnemonic: generatedMnemonic!, - derivePath: "//${addressToScan[scannedWallet]}", - password: pin.text); + // Remove unused wallets + balanceList.removeWhere((key, value) => value['transferableBalance'] == 0); + scanedValidWalletNumber = balanceList.length + scanedWalletNumber; - WalletData myWallet = WalletData( - chest: currentChestNumber, - address: scannedWallet, - number: scanedValidWalletNumber, - name: walletName, - derivation: addressToScan[scannedWallet], - imageDefaultPath: '${scanedValidWalletNumber % 4}.png', - isOwned: true); - await walletBox.put(myWallet.address, myWallet); - scanedValidWalletNumber = scanedValidWalletNumber + 1; - } - scanedWalletNumber = scanedWalletNumber + 1; + scanStatus = ScanDerivationsStatus.import; + for (String scannedWallet in balanceList.keys) { + isAlive = true; + String walletName = scanedWalletNumber == 0 + ? 'currentWallet'.tr() + : '${'wallet'.tr()} ${scanedWalletNumber + 1}'; + await sub.importAccount( + mnemonic: generatedMnemonic!, + derivePath: "//${addressToScan[scannedWallet]}", + password: pin.text); + + WalletData myWallet = WalletData( + chest: currentChestNumber, + address: scannedWallet, + number: scanedWalletNumber, + name: walletName, + derivation: addressToScan[scannedWallet], + imageDefaultPath: '${scanedWalletNumber % 4}.png', + isOwned: true); + await walletBox.put(myWallet.address, myWallet); + scanedWalletNumber++; notifyListeners(); } log.d(scanedWalletNumber); - scanedWalletNumber = -1; - scanedValidWalletNumber = -1; + scanStatus = ScanDerivationsStatus.none; + scanedWalletNumber = scanedValidWalletNumber = -1; notifyListeners(); return isAlive; } @@ -387,6 +390,7 @@ class GenerateWalletsProvider with ChangeNotifier { imageDefaultPath: '0.png', isOwned: true); await walletBox.put(myWallet.address, myWallet); + scanedWalletNumber++; return true; } else { return false; diff --git a/lib/providers/my_wallets.dart b/lib/providers/my_wallets.dart index 2e4e683..e36d63d 100644 --- a/lib/providers/my_wallets.dart +++ b/lib/providers/my_wallets.dart @@ -43,6 +43,7 @@ class MyWalletsProvider with ChangeNotifier { Map walletsToScan = {}; for (var walletFromBox in wallets) { if (walletFromBox.chest == chest) { + // log.d('${walletFromBox.number} - ${walletFromBox.name}'); if (walletFromBox.identityStatus == IdtyStatus.unknown) { walletsToScan.putIfAbsent( walletFromBox.address, (() => walletFromBox)); @@ -61,7 +62,6 @@ class MyWalletsProvider with ChangeNotifier { listWallets.add(wallet); n++; } - return listWallets; } @@ -201,6 +201,7 @@ class MyWalletsProvider with ChangeNotifier { isOwned: true); await walletBox.put(newWallet.address, newWallet); + await readAllWallets(); isNewDerivationLoading = false; notifyListeners(); diff --git a/lib/screens/myWallets/custom_derivations.dart b/lib/screens/myWallets/custom_derivations.dart index 0d2efaa..b806e7a 100644 --- a/lib/screens/myWallets/custom_derivations.dart +++ b/lib/screens/myWallets/custom_derivations.dart @@ -135,8 +135,8 @@ class _CustomDerivationState extends State { int.parse(dropdownValue!), ); } - Navigator.pop(context); - Navigator.pop(context); + Navigator.popUntil( + context, ModalRoute.withName('/mywallets')); } }, child: Text( diff --git a/lib/screens/myWallets/wallet_options.dart b/lib/screens/myWallets/wallet_options.dart index 8633669..50a83dd 100644 --- a/lib/screens/myWallets/wallet_options.dart +++ b/lib/screens/myWallets/wallet_options.dart @@ -560,7 +560,8 @@ class WalletOptions extends StatelessWidget { walletOptions.balanceCache[walletOptions.address.text] ?? -1; final bool canDelete = !isDefaultWallet && !hasConsumers.data! && - (balance > 2 || balance == 0); + (balance > 2 || balance == 0) && + !wallet.hasIdentity(); return InkWell( key: keyDeleteWallet, onTap: canDelete diff --git a/lib/screens/onBoarding/10.dart b/lib/screens/onBoarding/10.dart index 29a595c..81ed468 100644 --- a/lib/screens/onBoarding/10.dart +++ b/lib/screens/onBoarding/10.dart @@ -16,6 +16,7 @@ import 'package:gecko/widgets/commons/build_text.dart'; import 'package:gecko/screens/onBoarding/11_congratulations.dart'; import 'package:gecko/widgets/commons/fader_transition.dart'; import 'package:gecko/widgets/commons/offline_info.dart'; +import 'package:gecko/widgets/scan_derivations_info.dart'; import 'package:pin_code_fields/pin_code_fields.dart'; import 'package:provider/provider.dart'; @@ -66,30 +67,7 @@ class OnboardingStepTen extends StatelessWidget { SizedBox(height: isTall ? 40 : 20), BuildText(text: "geckoWillCheckPassword".tr()), SizedBox(height: isTall ? 60 : 10), - Visibility( - visible: generateWalletProvider.scanedValidWalletNumber != -1, - child: Padding( - padding: const EdgeInsets.only(bottom: 15), - child: Row( - mainAxisAlignment: MainAxisAlignment.center, - children: [ - Text("derivationsScanProgress".tr(args: [ - '${generateWalletProvider.scanedWalletNumber}', - '${generateWalletProvider.numberScan + 1}' - ])), - const SizedBox(width: 10), - const SizedBox( - height: 22, - width: 22, - child: CircularProgressIndicator( - color: orangeC, - strokeWidth: 3, - ), - ), - ], - ), - ), - ), + const ScanDerivationsInfo(), Consumer(builder: (context, mw, _) { return Visibility( visible: !myWalletProvider.isPinValid && diff --git a/lib/screens/transaction_in_progress.dart b/lib/screens/transaction_in_progress.dart index 7aa9f39..62a247e 100644 --- a/lib/screens/transaction_in_progress.dart +++ b/lib/screens/transaction_in_progress.dart @@ -27,7 +27,7 @@ class TransactionInProgress extends StatelessWidget { Provider.of(context, listen: false); final myWalletProvider = Provider.of(context, listen: false); - var txStatus = TransactionStatus.nothing; + var txStatus = TransactionStatus.none; final result = sub.transactionStatus; final from = fromAddress ?? @@ -68,7 +68,7 @@ class TransactionInProgress extends StatelessWidget { }; if (result == null) { - txStatus = TransactionStatus.nothing; + txStatus = TransactionStatus.none; } else if (result.contains('blockHash: ')) { txStatus = TransactionStatus.success; resultText = 'extrinsicValidated' @@ -192,7 +192,7 @@ class TransactionInProgress extends StatelessWidget { ), const SizedBox(height: 10), Visibility( - visible: txStatus != TransactionStatus.nothing, + visible: txStatus != TransactionStatus.none, child: Text( resultText, textAlign: TextAlign.center, @@ -235,4 +235,4 @@ class TransactionInProgress extends StatelessWidget { } } -enum TransactionStatus { loading, failed, success, nothing } +enum TransactionStatus { loading, failed, success, none } diff --git a/lib/widgets/scan_derivations_info.dart b/lib/widgets/scan_derivations_info.dart new file mode 100644 index 0000000..9fe338a --- /dev/null +++ b/lib/widgets/scan_derivations_info.dart @@ -0,0 +1,52 @@ +import 'package:easy_localization/easy_localization.dart'; +import 'package:flutter/material.dart'; +import 'package:gecko/globals.dart'; +import 'package:gecko/providers/generate_wallets.dart'; +import 'package:provider/provider.dart'; + +class ScanDerivationsInfo extends StatelessWidget { + const ScanDerivationsInfo({ + Key? key, + }) : super(key: key); + + @override + Widget build(BuildContext context) { + final generateWalletProvider = + Provider.of(context); + return Visibility( + visible: generateWalletProvider.scanStatus != ScanDerivationsStatus.none, + child: Padding( + padding: const EdgeInsets.only(bottom: 15), + child: Row( + mainAxisAlignment: MainAxisAlignment.center, + children: [ + if (generateWalletProvider.scanStatus == + ScanDerivationsStatus.rootScanning) + Text('scanRootDerivationInProgress'.tr()), + if (generateWalletProvider.scanStatus == + ScanDerivationsStatus.scanning) + Text('derivationsScanProgress' + .tr(args: [generateWalletProvider.numberScan.toString()])), + if (generateWalletProvider.scanStatus == + ScanDerivationsStatus.import) + Text("importDerivationsInProgress".tr(args: [ + '${generateWalletProvider.scanedWalletNumber}', + '${generateWalletProvider.scanedValidWalletNumber}' + ])), + const SizedBox(width: 10), + const SizedBox( + height: 22, + width: 22, + child: CircularProgressIndicator( + color: orangeC, + strokeWidth: 3, + ), + ), + ], + ), + ), + ); + } +} + +enum ScanDerivationsStatus { none, rootScanning, scanning, import }