enh: refactor checks for wallets import (#40)

This commit is contained in:
poka 2024-01-03 22:37:32 +01:00
parent 5718d170f3
commit ee88042b0e
4 changed files with 66 additions and 79 deletions

View File

@ -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});
}

View File

@ -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<List> getBalanceAndIdtyStatus(
Future<MigrateWalletChecks> getBalanceAndIdtyStatus(
String fromAddress, String toAddress) async {
final sub = Provider.of<SubstrateSdk>(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,
);
}
//////////////////////////////////////

View File

@ -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<List> status) {
builder: (BuildContext context,
AsyncSnapshot<MigrateWalletChecks> 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]),

View File

@ -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<List> status) {
builder: (BuildContext context,
AsyncSnapshot<MigrateWalletChecks> 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]),