diff --git a/lib/providers/substrate_sdk.dart b/lib/providers/substrate_sdk.dart index 44dec68..2a72912 100644 --- a/lib/providers/substrate_sdk.dart +++ b/lib/providers/substrate_sdk.dart @@ -596,6 +596,53 @@ class SubstrateSdk with ChangeNotifier { return _certMeta; } + Future revokeIdentity(String address, String password) async { + final idtyIndex = await sdk.webView! + .evalJavascript('api.query.identity.identityIndexOf("$address")'); + + final sender = TxSenderData( + keyring.current.address, + keyring.current.pubKey, + ); + + log.d(sender.address); + TxInfoData txInfo; + + txInfo = TxInfoData( + 'membership', + 'revokeMembership', + sender, + ); + + try { + final hash = await sdk.api.tx + .signAndSend( + txInfo, + [idtyIndex], + password, + ) + .timeout( + const Duration(seconds: 12), + onTimeout: () => {}, + ); + log.d(hash); + if (hash.isEmpty) { + transactionStatus = 'timeout'; + notifyListeners(); + + return 'timeout'; + } else { + transactionStatus = hash.toString(); + notifyListeners(); + return hash.toString(); + } + } catch (e) { + transactionStatus = e.toString(); + notifyListeners(); + return e.toString(); + } + } + Future getCurencyName() async {} Future derive( diff --git a/lib/providers/wallet_options.dart b/lib/providers/wallet_options.dart index 5e7aa7e..b83e8b7 100644 --- a/lib/providers/wallet_options.dart +++ b/lib/providers/wallet_options.dart @@ -165,6 +165,11 @@ class WalletOptionsProvider with ChangeNotifier { }); } + Future isMember(BuildContext context, String address) async { + SubstrateSdk _sub = Provider.of(context, listen: false); + return await _sub. idtyStatus(address) == 'Validated'; + } + Future validateIdentity(BuildContext context) async { TextEditingController idtyName = TextEditingController(); SubstrateSdk _sub = Provider.of(context, listen: false); diff --git a/lib/screens/myWallets/manage_membership.dart b/lib/screens/myWallets/manage_membership.dart new file mode 100644 index 0000000..1677f85 --- /dev/null +++ b/lib/screens/myWallets/manage_membership.dart @@ -0,0 +1,101 @@ +import 'package:flutter/services.dart'; +import 'package:gecko/globals.dart'; +import 'package:flutter/material.dart'; +import 'package:gecko/models/wallet_data.dart'; +import 'package:gecko/providers/my_wallets.dart'; +import 'package:gecko/providers/substrate_sdk.dart'; +import 'package:gecko/screens/common_elements.dart'; +import 'package:gecko/screens/myWallets/unlocking_wallet.dart'; +import 'package:gecko/screens/transaction_in_progress.dart'; +import 'package:provider/provider.dart'; + +class ManageMembership extends StatelessWidget { + const ManageMembership({Key? key, required this.address}) : super(key: key); + final String address; + + @override + Widget build(BuildContext context) { + SystemChrome.setPreferredOrientations([DeviceOrientation.portraitUp]); + // HomeProvider _homeProvider = Provider.of(context); + + return Scaffold( + backgroundColor: backgroundColor, + appBar: AppBar( + toolbarHeight: 60 * ratio, + title: const SizedBox( + height: 22, + child: Text('Gérer mon adhésion'), + )), + body: SafeArea( + child: Column(children: [ + const SizedBox(height: 20), + revokeMyIdentity(context), + // const SizedBox(height: 20), + ]), + )); + } + + Widget revokeMyIdentity(BuildContext context) { + return InkWell( + key: const Key('revokeIdty'), + onTap: () async { + final _answer = await confirmPopup(context, + 'Êtes-vous certains de vouloir révoquer définitivement cette identité ?') ?? + false; + + if (_answer) { + MyWalletsProvider _myWalletProvider = + Provider.of(context, listen: false); + SubstrateSdk _sub = Provider.of(context, listen: false); + + MyWalletsProvider _mw = MyWalletsProvider(); + final _wallet = _mw.getWalletDataByAddress(address); + await _sub.setCurrentWallet(_wallet!); + + WalletData? defaultWallet = _myWalletProvider.getDefaultWallet(); + String? _pin; + if (_myWalletProvider.pinCode == '') { + _pin = await Navigator.push( + context, + MaterialPageRoute( + builder: (homeContext) { + return UnlockingWallet(wallet: defaultWallet); + }, + ), + ); + } + if (_pin != null || _myWalletProvider.pinCode != '') { + _sub.revokeIdentity(address, _myWalletProvider.pinCode); + } + Navigator.pop(context); + + Navigator.push( + context, + MaterialPageRoute(builder: (context) { + return const TransactionInProgress(transType: 'revokeIdty'); + }), + ); + } + // Navigator.push( + // context, + // MaterialPageRoute(builder: (context) { + // return ManageMembership( + // address: _walletOptions.address.text, + // ); + // }), + // ); + }, + child: SizedBox( + height: 40, + child: Row(children: const [ + SizedBox(width: 32), + // Image.asset( + // 'assets/medal.png', + // height: 45, + // ), + Text('Révoquer mon adhésion', style: TextStyle(fontSize: 20)), + ]), + ), + ); + } +} diff --git a/lib/screens/myWallets/wallet_options.dart b/lib/screens/myWallets/wallet_options.dart index a694f96..fa1a4bf 100644 --- a/lib/screens/myWallets/wallet_options.dart +++ b/lib/screens/myWallets/wallet_options.dart @@ -8,6 +8,8 @@ import 'package:gecko/models/wallet_data.dart'; import 'package:gecko/providers/substrate_sdk.dart'; import 'package:gecko/providers/wallet_options.dart'; import 'package:gecko/providers/wallets_profiles.dart'; +import 'package:gecko/screens/myWallets/manage_membership.dart'; +import 'package:gecko/screens/qrcode_fullscreen.dart'; import 'package:provider/provider.dart'; import 'package:flutter/services.dart'; import 'package:qr_flutter/qr_flutter.dart'; @@ -25,7 +27,7 @@ class WalletOptions extends StatelessWidget { WalletsProfilesProvider _historyProvider = Provider.of(context, listen: false); MyWalletsProvider _myWalletProvider = - Provider.of(context); + Provider.of(context, listen: false); HomeProvider _homeProvider = Provider.of(context, listen: false); @@ -118,30 +120,67 @@ class WalletOptions extends StatelessWidget { }), Expanded( child: SingleChildScrollView( - child: Column(children: [ - QrImageWidget( - data: _walletOptions.address.text, - version: QrVersions.auto, - size: isTall ? 300 : 270, - ), - SizedBox(height: 15 * ratio), - Consumer( - builder: (context, walletProvider, _) { - return Column(children: [ - pubkeyWidget(walletProvider, ctx), - SizedBox(height: 10 * ratio), - historyWidget( - context, _historyProvider, walletProvider), - SizedBox(height: 12 * ratio), - setDefaultWalletWidget(context, walletProvider, - _myWalletProvider, _walletOptions, _currentChest), - SizedBox(height: 17 * ratio), - if (!walletProvider.isDefaultWallet) - deleteWallet(context, walletProvider, - _myWalletProvider, _currentChest) - ]); - }), - ]), + child: Column( + crossAxisAlignment: CrossAxisAlignment.center, + children: [ + InkWell( + onTap: () { + Navigator.push( + context, + MaterialPageRoute(builder: (context) { + return QrCodeFullscreen( + _walletOptions.address.text, + ); + }), + ); + }, + child: QrImageWidget( + data: _walletOptions.address.text, + version: QrVersions.auto, + size: isTall ? 150 : 80, + ), + ), + SizedBox(height: 15 * ratio), + Consumer( + builder: (context, walletProvider, _) { + return Column(children: [ + pubkeyWidget(walletProvider, ctx), + SizedBox(height: 10 * ratio), + historyWidget( + context, _historyProvider, walletProvider), + SizedBox(height: 12 * ratio), + setDefaultWalletWidget( + context, + walletProvider, + _myWalletProvider, + _walletOptions, + _currentChest), + SizedBox(height: 17 * ratio), + // walletProvider.isMember(context, _walletOptions.address.text) + FutureBuilder( + future: walletProvider.isMember( + context, _walletOptions.address.text), + builder: (BuildContext context, + AsyncSnapshot _isMember) { + if (_isMember.connectionState != + ConnectionState.done || + _isMember.hasError) { + return const Text(''); + } + return Column(children: [ + if (!walletProvider.isDefaultWallet && + !_isMember.data!) + deleteWallet(context, walletProvider, + _myWalletProvider, _currentChest) + else + const SizedBox(), + if (_isMember.data!) + manageMemberStatus(context) + ]); + }), + ]); + }), + ]), ), ), ]), @@ -356,47 +395,79 @@ class WalletOptions extends StatelessWidget { ); } + Widget manageMemberStatus(BuildContext context) { + WalletOptionsProvider _walletOptions = + Provider.of(context, listen: false); + return InkWell( + key: const Key('manageStatus'), + onTap: () { + Navigator.push( + context, + MaterialPageRoute(builder: (context) { + return ManageMembership( + address: _walletOptions.address.text, + ); + }), + ); + }, + child: SizedBox( + height: 40, + child: Row(children: [ + const SizedBox(width: 32), + Image.asset( + 'assets/medal.png', + height: 45, + ), + const SizedBox(width: 22), + const Text('Gérer mon adhésion', style: TextStyle(fontSize: 20)), + ]), + ), + ); + } + Widget setDefaultWalletWidget( BuildContext context, WalletOptionsProvider walletProvider, MyWalletsProvider _myWalletProvider, WalletOptionsProvider _walletOptions, int _currentChest) { - WalletData defaultWallet = _myWalletProvider.getDefaultWallet(); - _walletOptions.isDefaultWallet = (defaultWallet.number == wallet.id()[1]); - - return InkWell( - key: const Key('setDefaultWallet'), - onTap: !walletProvider.isDefaultWallet - ? () async { - await setDefaultWallet(context, _currentChest); - } - : null, - child: SizedBox( - height: 50, - child: Row(children: [ - const SizedBox(width: 31), - CircleAvatar( - backgroundColor: - Colors.grey[walletProvider.isDefaultWallet ? 300 : 500], - child: Image.asset( - 'assets/walletOptions/android-checkmark.png', - height: 25, + return Consumer( + builder: (context, _myWalletProvider, _) { + WalletData defaultWallet = _myWalletProvider.getDefaultWallet(); + _walletOptions.isDefaultWallet = (defaultWallet.number == wallet.id()[1]); + return InkWell( + key: const Key('setDefaultWallet'), + onTap: !walletProvider.isDefaultWallet + ? () async { + await setDefaultWallet(context, _currentChest); + } + : null, + child: SizedBox( + height: 50, + child: Row(children: [ + const SizedBox(width: 31), + CircleAvatar( + backgroundColor: + Colors.grey[walletProvider.isDefaultWallet ? 300 : 500], + child: Image.asset( + 'assets/walletOptions/android-checkmark.png', + height: 25, + ), ), - ), - const SizedBox(width: 22), - Text( - walletProvider.isDefaultWallet - ? 'Ce portefeuille est celui par defaut' - : 'Définir comme portefeuille par défaut', - style: TextStyle( - fontSize: 20, - color: walletProvider.isDefaultWallet - ? Colors.grey[500] - : Colors.black)), - ]), - ), - ); + const SizedBox(width: 22), + Text( + walletProvider.isDefaultWallet + ? 'Ce portefeuille est celui par defaut' + : 'Définir comme portefeuille par défaut', + style: TextStyle( + fontSize: 20, + color: walletProvider.isDefaultWallet + ? Colors.grey[500] + : Colors.black)), + ]), + ), + ); + }); } Future setDefaultWallet(BuildContext context, int _currentChest) async { diff --git a/lib/screens/qrcode_fullscreen.dart b/lib/screens/qrcode_fullscreen.dart new file mode 100644 index 0000000..c789e01 --- /dev/null +++ b/lib/screens/qrcode_fullscreen.dart @@ -0,0 +1,56 @@ +import 'package:flutter/services.dart'; +import 'package:gecko/globals.dart'; +import 'package:flutter/material.dart'; +import 'package:gecko/providers/substrate_sdk.dart'; +import 'package:qr_flutter/qr_flutter.dart'; +// import 'package:gecko/models/home.dart'; +// import 'package:provider/provider.dart'; + +// ignore: must_be_immutable +class QrCodeFullscreen extends StatelessWidget { + TextEditingController tplController = TextEditingController(); + + QrCodeFullscreen(this.address, {this.color, Key? key}) : super(key: key); + final String address; + final Color? color; + + @override + Widget build(BuildContext context) { + SystemChrome.setPreferredOrientations([DeviceOrientation.portraitUp]); + return Scaffold( + appBar: AppBar( + elevation: 0, + backgroundColor: color ?? Colors.black, + toolbarHeight: 60 * ratio, + leading: IconButton( + icon: Icon(Icons.arrow_back, color: orangeC), + onPressed: () { + Navigator.pop(context); + }), + title: SizedBox( + height: 22, + child: Text( + 'QR Code de ${getShortPubkey(address)}', + style: TextStyle(color: orangeC), + ), + )), + body: SafeArea( + child: SizedBox.expand( + child: Container( + color: color ?? backgroundColor, + child: Column( + children: [ + const Spacer(), + QrImageWidget( + data: address, + version: QrVersions.auto, + size: 350, + ), + const Spacer(flex: 2), + ], + )), + ), + ), + ); + } +} diff --git a/lib/screens/wallet_view.dart b/lib/screens/wallet_view.dart index 18d1438..e790fb3 100644 --- a/lib/screens/wallet_view.dart +++ b/lib/screens/wallet_view.dart @@ -12,8 +12,10 @@ 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/qrcode_fullscreen.dart'; import 'package:gecko/screens/transaction_in_progress.dart'; import 'package:provider/provider.dart'; +import 'package:qr_flutter/qr_flutter.dart'; class WalletViewScreen extends StatelessWidget { const WalletViewScreen( @@ -48,6 +50,25 @@ class WalletViewScreen extends StatelessWidget { appBar: AppBar( elevation: 0, toolbarHeight: 60 * ratio, + actions: [ + InkWell( + onTap: () { + Navigator.push( + context, + MaterialPageRoute(builder: (context) { + return QrCodeFullscreen( + _walletViewProvider.address!, + ); + }), + ); + }, + child: QrImageWidget( + data: _walletViewProvider.address!, + version: QrVersions.auto, + size: 80, + ), + ), + ], title: const SizedBox( height: 22, child: Text('Voir un portefeuille'),