diff --git a/lib/models/migrate_wallet_checks.dart b/lib/models/migrate_wallet_checks.dart new file mode 100644 index 0000000..4b491fc --- /dev/null +++ b/lib/models/migrate_wallet_checks.dart @@ -0,0 +1,16 @@ +import 'package:gecko/models/wallet_data.dart'; + +class MigrateWalletChecks { + final Map balance; + final IdtyStatus idtyStatus; + final bool isSmith; + final String validationStatus; + final bool canValidate; + + const MigrateWalletChecks( + {required this.balance, + required this.idtyStatus, + required this.isSmith, + required this.validationStatus, + required this.canValidate}); +} diff --git a/lib/providers/substrate_sdk.dart b/lib/providers/substrate_sdk.dart index fc592b1..2caa502 100644 --- a/lib/providers/substrate_sdk.dart +++ b/lib/providers/substrate_sdk.dart @@ -5,6 +5,7 @@ import 'package:flutter/foundation.dart'; import 'package:flutter/material.dart'; import 'package:gecko/globals.dart'; import 'package:gecko/models/chest_data.dart'; +import 'package:gecko/models/migrate_wallet_checks.dart'; import 'package:gecko/models/wallet_data.dart'; import 'package:gecko/providers/duniter_indexer.dart'; import 'package:gecko/providers/home.dart'; @@ -886,12 +887,18 @@ class SubstrateSdk with ChangeNotifier { return g1V1NewAddress; } - Future getBalanceAndIdtyStatus( + Future getBalanceAndIdtyStatus( String fromAddress, String toAddress) async { + final sub = Provider.of(homeContext, listen: false); + bool canValidate = false; + String validationStatus = ''; + final fromBalance = fromAddress == '' ? {'transferableBalance': 0} : await getBalance(fromAddress); + final transferableBalance = fromBalance['transferableBalance']; + final statusList = await idtyStatus([fromAddress, toAddress]); final fromIdtyStatus = statusList[0]; final fromHasConsumer = @@ -899,13 +906,31 @@ class SubstrateSdk with ChangeNotifier { final toIdtyStatus = statusList[1]; final isSmithData = await isSmith(fromAddress); - return [ - fromBalance, - fromIdtyStatus, - toIdtyStatus, - fromHasConsumer, - isSmithData - ]; + // Check conditions to set 'canValidate' and 'validationStatus' + if (transferableBalance != 0 && !fromHasConsumer) { + canValidate = true; + } else if (toIdtyStatus != IdtyStatus.none && + fromIdtyStatus != IdtyStatus.none) { + validationStatus = 'youCannotMigrateIdentityToExistingIdentity'.tr(); + } else if (isSmithData) { + validationStatus = 'smithCantMigrateIdentity'.tr(); + } else if (fromHasConsumer) { + validationStatus = 'youMustWaitBeforeCashoutThisAccount'.tr(); + } else if (transferableBalance == 0) { + validationStatus = 'thisAccountIsEmpty'.tr(); + } + + if (sub.g1V1NewAddress == '') { + validationStatus = ''; + } + + return MigrateWalletChecks( + balance: fromBalance, + idtyStatus: toIdtyStatus, + isSmith: isSmithData, + validationStatus: validationStatus, + canValidate: canValidate, + ); } ////////////////////////////////////// diff --git a/lib/screens/myWallets/import_g1_v1.dart b/lib/screens/myWallets/import_g1_v1.dart index ba682d9..f6b5f0a 100644 --- a/lib/screens/myWallets/import_g1_v1.dart +++ b/lib/screens/myWallets/import_g1_v1.dart @@ -5,6 +5,7 @@ import 'package:easy_localization/easy_localization.dart'; import 'package:flutter/services.dart'; 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'; @@ -29,8 +30,6 @@ class ImportG1v1 extends StatelessWidget { Timer? debounce; WalletData selectedWallet = myWalletProvider.getDefaultWallet(); - bool canValidate = false; - String validationStatus = ''; return PopScope( onPopInvoked: (_) { @@ -44,7 +43,8 @@ class ImportG1v1 extends StatelessWidget { return FutureBuilder( future: sub.getBalanceAndIdtyStatus( sub.g1V1NewAddress, selectedWallet.address), - builder: (BuildContext context, AsyncSnapshot status) { + builder: (BuildContext context, + AsyncSnapshot status) { if (status.data == null) { return Column(children: [ ScaledSizedBox(height: 80), @@ -63,37 +63,7 @@ class ImportG1v1 extends StatelessWidget { ]); } - final Map balance = status.data?[0] ?? {}; - final IdtyStatus idtyStatus = status.data?[1]; - final IdtyStatus myIdtyStatus = status.data?[2]; - final bool hasConsumer = status.data?[3] ?? false; - final bool isSmith = status.data?[4] ?? false; - - if (balance['transferableBalance'] != 0 && !hasConsumer) { - canValidate = true; - validationStatus = ''; - } else { - canValidate = false; - validationStatus = hasConsumer - ? 'youMustWaitBeforeCashoutThisAccount'.tr() - : 'thisAccountIsEmpty'.tr(); - } - - if (idtyStatus != IdtyStatus.none && - myIdtyStatus != IdtyStatus.none) { - canValidate = false; - validationStatus = - 'youCannotMigrateIdentityToExistingIdentity'.tr(); - } - - if (isSmith) { - canValidate = false; - validationStatus = 'smithCantMigrateIdentity'.tr(); - } - - if (sub.g1V1NewAddress == '') { - validationStatus = ''; - } + final statusData = status.data!; final bool isUdUnit = configBox.get('isUdUnit') ?? false; final unit = isUdUnit ? 'ud'.tr(args: ['']) : currencyName; @@ -224,7 +194,7 @@ class ImportG1v1 extends StatelessWidget { Column( children: [ Text( - '${balance['transferableBalance']} $unit', + '${statusData.balance['transferableBalance']} $unit', style: scaledTextStyle(fontSize: 16), ), IdentityStatus( @@ -277,7 +247,7 @@ class ImportG1v1 extends StatelessWidget { elevation: 4, backgroundColor: orangeC, ), - onPressed: canValidate + onPressed: statusData.canValidate ? () async { WalletData? defaultWallet = myWalletProvider.getDefaultWallet(); @@ -301,8 +271,8 @@ class ImportG1v1 extends StatelessWidget { selectedWallet.address, destPassword: pin ?? myWalletProvider.pinCode, - balance: balance, - idtyStatus: idtyStatus); + balance: statusData.balance, + idtyStatus: statusData.idtyStatus); Navigator.pop(context); await Navigator.push( context, @@ -328,7 +298,7 @@ class ImportG1v1 extends StatelessWidget { ), ScaledSizedBox(height: 10), Text( - validationStatus, + statusData.validationStatus, textAlign: TextAlign.center, style: scaledTextStyle( fontSize: 14, color: Colors.grey[600]), diff --git a/lib/screens/myWallets/migrate_identity.dart b/lib/screens/myWallets/migrate_identity.dart index 2e1470b..ced07f1 100644 --- a/lib/screens/myWallets/migrate_identity.dart +++ b/lib/screens/myWallets/migrate_identity.dart @@ -4,6 +4,7 @@ import 'package:easy_localization/easy_localization.dart'; import 'package:flutter_markdown/flutter_markdown.dart'; 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'; @@ -39,8 +40,6 @@ class MigrateIdentityScreen extends StatelessWidget { } else { selectedWallet = defaultWallet; } - bool canValidate = false; - String validationStatus = ''; final mdStyle = MarkdownStyleSheet( p: scaledTextStyle(fontSize: 17, color: Colors.black, letterSpacing: 0.3), @@ -72,7 +71,8 @@ class MigrateIdentityScreen extends StatelessWidget { return FutureBuilder( future: sub.getBalanceAndIdtyStatus( fromAddress, selectedWallet.address), - builder: (BuildContext context, AsyncSnapshot status) { + builder: (BuildContext context, + AsyncSnapshot status) { if (status.data == null) { return Column(children: [ ScaledSizedBox(height: 80), @@ -89,31 +89,7 @@ class MigrateIdentityScreen extends StatelessWidget { ]); } - final Map balance = status.data?[0] ?? {}; - final IdtyStatus idtyStatus = status.data?[1]; - final IdtyStatus myIdtyStatus = status.data?[2]; - final bool hasConsumer = status.data?[3] ?? false; - final bool isSmith = status.data?[4] ?? false; - - if (isSmith) { - canValidate = false; - validationStatus = 'smithCantMigrateIdentity'.tr(); - } else if (balance['transferableBalance'] != 0 && - !hasConsumer) { - canValidate = true; - validationStatus = ''; - } else if (idtyStatus != IdtyStatus.none && - myIdtyStatus != IdtyStatus.none) { - canValidate = false; - validationStatus = - 'youCannotMigrateIdentityToExistingIdentity'.tr(); - } else { - canValidate = false; - validationStatus = hasConsumer - ? 'youMustWaitBeforeCashoutThisAccount'.tr(args: ['X']) - : 'thisAccountIsEmpty'.tr(); - } - + final statusData = status.data!; final walletsList = myWalletProvider.listWallets.toList(); walletsList @@ -131,7 +107,7 @@ class MigrateIdentityScreen extends StatelessWidget { data: 'areYouSureMigrateIdentity'.tr(args: [ duniterIndexer.walletNameIndexer[fromAddress] ?? '???', - '${balance['transferableBalance']} $unit' + '${statusData.balance['transferableBalance']} $unit' ]), styleSheet: mdStyle), ), @@ -171,7 +147,7 @@ class MigrateIdentityScreen extends StatelessWidget { elevation: 4, backgroundColor: orangeC, ), - onPressed: canValidate + onPressed: statusData.canValidate ? () async { WalletData? defaultWallet = myWalletProvider.getDefaultWallet(); @@ -196,7 +172,7 @@ class MigrateIdentityScreen extends StatelessWidget { fromPassword: pin ?? myWalletProvider.pinCode, destPassword: pin ?? myWalletProvider.pinCode, withBalance: true, - fromBalance: balance); + fromBalance: statusData.balance); Navigator.push( context, MaterialPageRoute(builder: (context) { @@ -221,7 +197,7 @@ class MigrateIdentityScreen extends StatelessWidget { ), ScaledSizedBox(height: 10), Text( - validationStatus, + statusData.validationStatus, textAlign: TextAlign.center, style: scaledTextStyle(fontSize: 15, color: Colors.grey[600]),