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 { Future<List<int>> getCerts(String address) async {
final idtyIndex = await sdk.webView! final idtyIndex = await sdk.webView!
.evalJavascript('api.query.identity.identityIndexOf("$address")'); .evalJavascript('api.query.identity.identityIndexOf("$address")');
log.d(idtyIndex); log.d('u32: ' + idtyIndex.toString());
final _certsReceiver = await sdk.webView! final _certsReceiver = await sdk.webView!
.evalJavascript('api.query.cert.storageIdtyCertMeta($idtyIndex)') ?? .evalJavascript('api.query.cert.storageIdtyCertMeta($idtyIndex)') ??
@ -222,6 +222,23 @@ class SubstrateSdk with ChangeNotifier {
return [_certsReceiver['receivedCount'], _certsReceiver['issuedCount']]; 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 { // Future<bool> isAccountExit(String address) async {
// final _accountInfo = await sdk.webView! // final _accountInfo = await sdk.webView!
// .evalJavascript('api.query.system.account("$address")'); // .evalJavascript('api.query.system.account("$address")');
@ -527,6 +544,34 @@ class SubstrateSdk with ChangeNotifier {
return await idtyStatus(address) == 'Validated'; 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( Future<String> derive(
BuildContext context, String address, int number, String password) async { BuildContext context, String address, int number, String password) async {
final keypair = getKeypair(address); final keypair = getKeypair(address);

View File

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

View File

@ -76,7 +76,28 @@ class TransactionInProgress extends StatelessWidget {
if (_result.contains('blockHash: ')) { if (_result.contains('blockHash: ')) {
_resultText = '$_actionName validé !'; _resultText = '$_actionName validé !';
} else { } 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/models/wallet_data.dart';
import 'package:gecko/providers/wallets_profiles.dart'; import 'package:gecko/providers/wallets_profiles.dart';
import 'package:gecko/screens/avatar_fullscreen.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/choose_wallet.dart';
import 'package:gecko/screens/myWallets/unlocking_wallet.dart'; import 'package:gecko/screens/myWallets/unlocking_wallet.dart';
import 'package:gecko/screens/transaction_in_progress.dart'; import 'package:gecko/screens/transaction_in_progress.dart';
@ -108,7 +109,7 @@ class WalletViewScreen extends StatelessWidget {
WalletData? _defaultWallet = WalletData? _defaultWallet =
_myWalletProvider.getDefaultWallet(); _myWalletProvider.getDefaultWallet();
return FutureBuilder( return FutureBuilder(
future: _sub.isMember(_defaultWallet.address!), future: _sub.canCertify(_defaultWallet.address!, pubkey!),
builder: (context, AsyncSnapshot<bool?> snapshot) { builder: (context, AsyncSnapshot<bool?> snapshot) {
return Visibility( return Visibility(
visible: (snapshot.data ?? false), visible: (snapshot.data ?? false),
@ -128,38 +129,44 @@ class WalletViewScreen extends StatelessWidget {
'assets/gecko_certify.png')), 'assets/gecko_certify.png')),
), ),
onTap: () async { onTap: () async {
String? _pin; final bool? _result = await confirmPopup(
if (_myWalletProvider.pinCode == '') {
_pin = await Navigator.push(
context, context,
MaterialPageRoute( "Êtes-vous certain de vouloir certifier l'adresse:\n\n${getShortPubkey(pubkey!)}");
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( if (_result ?? false) {
context, String? _pin;
MaterialPageRoute(builder: (context) { if (_myWalletProvider.pinCode == '') {
return const TransactionInProgress( _pin = await Navigator.push(
transType: 'cert'); 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');
}),
);
}
} }
}), }),
), ),