diff --git a/lib/providers/substrate_sdk.dart b/lib/providers/substrate_sdk.dart index 8856ce0d9dacc2f808daa17d7bfef62af7200424..c2b89f3eeba97f6a7a8c293700fa3aa8eb2b0a7c 100644 --- a/lib/providers/substrate_sdk.dart +++ b/lib/providers/substrate_sdk.dart @@ -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); diff --git a/lib/screens/myWallets/wallet_options.dart b/lib/screens/myWallets/wallet_options.dart index 2578e6a300c95bdae404f0ca8b94d73124037fe0..04d4ba84de00b979df4b56933a02a1a2e8703891 100644 --- a/lib/screens/myWallets/wallet_options.dart +++ b/lib/screens/myWallets/wallet_options.dart @@ -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, diff --git a/lib/screens/transaction_in_progress.dart b/lib/screens/transaction_in_progress.dart index 63bfb45a781d95d289639041648a0127160aadc8..8a5e54f9958b981cb4316969c87412bf6ee67354 100644 --- a/lib/screens/transaction_in_progress.dart +++ b/lib/screens/transaction_in_progress.dart @@ -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; + } } } } diff --git a/lib/screens/wallet_view.dart b/lib/screens/wallet_view.dart index 92b6455825582083ddad883e1561584c75c2ca9f..18d143866779df57b9d018c54552195425ee59c8 100644 --- a/lib/screens/wallet_view.dart +++ b/lib/screens/wallet_view.dart @@ -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'); + }), + ); + } } }), ),