feat: detect if a wallet can cert an address; improve errors view;

This commit is contained in:
poka 2022-06-04 17:24:33 +02:00
parent 6280517f8d
commit 9eacbef2a8
4 changed files with 108 additions and 35 deletions

View File

@ -213,7 +213,7 @@ class SubstrateSdk with ChangeNotifier {
Future<List<int>> getCerts(String address) async {
final idtyIndex = await sdk.webView!
.evalJavascript('api.query.identity.identityIndexOf("$address")');
log.d(idtyIndex);
log.d('u32: ' + idtyIndex.toString());
final _certsReceiver = await sdk.webView!
.evalJavascript('api.query.cert.storageIdtyCertMeta($idtyIndex)') ??
@ -222,6 +222,23 @@ class SubstrateSdk with ChangeNotifier {
return [_certsReceiver['receivedCount'], _certsReceiver['issuedCount']];
}
Future<Map> getCertData(String from, String to) async {
final idtyIndexFrom = await sdk.webView!
.evalJavascript('api.query.identity.identityIndexOf("$from")');
final idtyIndexTo = await sdk.webView!
.evalJavascript('api.query.identity.identityIndexOf("$to")');
final _certData = await sdk.webView!.evalJavascript(
'api.query.cert.storageCertsByIssuer($idtyIndexFrom, $idtyIndexTo)') ??
'';
log.d(_certData);
if (_certData == '') return {};
return _certData;
}
// Future<bool> isAccountExit(String address) async {
// final _accountInfo = await sdk.webView!
// .evalJavascript('api.query.system.account("$address")');
@ -527,6 +544,34 @@ class SubstrateSdk with ChangeNotifier {
return await idtyStatus(address) == 'Validated';
}
Future<bool> canCertify(String from, String to) async {
bool _result = false;
if (from != to && await isMember(from)) {
final _certData = await getCertData(from, to);
final _certMeta = await getCertMeta(from);
final int _removableOn = _certData['removableOn'] ?? 0;
final int _nextIssuableOn = _certMeta['nextIssuableOn'] ?? 0;
log.d(_removableOn);
if (_removableOn == 0 && _nextIssuableOn == 0) {
_result = true;
}
}
return _result;
}
Future<Map> getCertMeta(String address) async {
var idtyIndex = await sdk.webView!
.evalJavascript('api.query.identity.identityIndexOf("$address")');
final _certMeta = await sdk.webView!
.evalJavascript('api.query.cert.storageIdtyCertMeta($idtyIndex)') ??
'';
// if (_certMeta['nextIssuableOn'] != 0) return {};
log.d(_certMeta);
return _certMeta;
}
Future<String> derive(
BuildContext context, String address, int number, String password) async {
final keypair = getKeypair(address);

View File

@ -169,8 +169,8 @@ class WalletOptions extends StatelessWidget {
width: 110,
)
: Container(
width: 120,
height: 120,
width: 180,
height: 180,
decoration: BoxDecoration(
shape: BoxShape.circle,
color: Colors.transparent,

View File

@ -76,7 +76,28 @@ class TransactionInProgress extends StatelessWidget {
if (_result.contains('blockHash: ')) {
_resultText = '$_actionName validé !';
} else {
_resultText = "Une erreur s'est produite:\n\n$_result";
_resultText = "Une erreur s'est produite:\n";
final String _exception = _result.split('Exception: ')[1];
switch (_exception) {
case 'cert.NotRespectCertPeriod':
case 'identity.CreatorNotAllowedToCreateIdty':
{
_resultText +=
"Vous devez attendre 24h entre chaque certification";
}
break;
case 'cert.CannotCertifySelf':
{
_resultText +=
"Vous ne pouvez pas vous certifier\nvous même ...";
}
break;
default:
{
_resultText += "\n$_exception";
}
break;
}
}
}
}

View File

@ -9,6 +9,7 @@ import 'package:gecko/providers/my_wallets.dart';
import 'package:gecko/models/wallet_data.dart';
import 'package:gecko/providers/wallets_profiles.dart';
import 'package:gecko/screens/avatar_fullscreen.dart';
import 'package:gecko/screens/common_elements.dart';
import 'package:gecko/screens/myWallets/choose_wallet.dart';
import 'package:gecko/screens/myWallets/unlocking_wallet.dart';
import 'package:gecko/screens/transaction_in_progress.dart';
@ -108,7 +109,7 @@ class WalletViewScreen extends StatelessWidget {
WalletData? _defaultWallet =
_myWalletProvider.getDefaultWallet();
return FutureBuilder(
future: _sub.isMember(_defaultWallet.address!),
future: _sub.canCertify(_defaultWallet.address!, pubkey!),
builder: (context, AsyncSnapshot<bool?> snapshot) {
return Visibility(
visible: (snapshot.data ?? false),
@ -128,38 +129,44 @@ class WalletViewScreen extends StatelessWidget {
'assets/gecko_certify.png')),
),
onTap: () async {
String? _pin;
if (_myWalletProvider.pinCode == '') {
_pin = await Navigator.push(
final bool? _result = await confirmPopup(
context,
MaterialPageRoute(
builder: (homeContext) {
return UnlockingWallet(
wallet: defaultWallet);
},
),
);
}
if (_pin != null ||
_myWalletProvider.pinCode != '') {
WalletsProfilesProvider
_walletViewProvider =
Provider.of<WalletsProfilesProvider>(
context,
listen: false);
final acc = _sub.getCurrentWallet();
_sub.certify(
acc.address!,
_pin ?? _myWalletProvider.pinCode,
_walletViewProvider.address!);
"Êtes-vous certain de vouloir certifier l'adresse:\n\n${getShortPubkey(pubkey!)}");
Navigator.push(
context,
MaterialPageRoute(builder: (context) {
return const TransactionInProgress(
transType: 'cert');
}),
);
if (_result ?? false) {
String? _pin;
if (_myWalletProvider.pinCode == '') {
_pin = await Navigator.push(
context,
MaterialPageRoute(
builder: (homeContext) {
return UnlockingWallet(
wallet: defaultWallet);
},
),
);
}
if (_pin != null ||
_myWalletProvider.pinCode != '') {
WalletsProfilesProvider
_walletViewProvider = Provider.of<
WalletsProfilesProvider>(
context,
listen: false);
final acc = _sub.getCurrentWallet();
_sub.certify(
acc.address!,
_pin ?? _myWalletProvider.pinCode,
_walletViewProvider.address!);
Navigator.push(
context,
MaterialPageRoute(builder: (context) {
return const TransactionInProgress(
transType: 'cert');
}),
);
}
}
}),
),