diff --git a/lib/providers/substrate_sdk.dart b/lib/providers/substrate_sdk.dart index 44dec6857e12b2e7b1bb26b66e4f537c612f5684..2a72912d7727e6c1f4be84803ebf05359a4b99f8 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<String> derive( diff --git a/lib/providers/wallet_options.dart b/lib/providers/wallet_options.dart index 5e7aa7eb717e091bc1f98ea7df5e96a16b0e8ac4..b83e8b76865665c32bf86741a9f9f61967c76e1a 100644 --- a/lib/providers/wallet_options.dart +++ b/lib/providers/wallet_options.dart @@ -165,6 +165,11 @@ class WalletOptionsProvider with ChangeNotifier { }); } + Future<bool> isMember(BuildContext context, String address) async { + SubstrateSdk _sub = Provider.of<SubstrateSdk>(context, listen: false); + return await _sub. idtyStatus(address) == 'Validated'; + } + Future<String?> validateIdentity(BuildContext context) async { TextEditingController idtyName = TextEditingController(); SubstrateSdk _sub = Provider.of<SubstrateSdk>(context, listen: false); diff --git a/lib/screens/myWallets/manage_membership.dart b/lib/screens/myWallets/manage_membership.dart new file mode 100644 index 0000000000000000000000000000000000000000..1677f85d6e3eb079140ace76aa0d7409f95c2eed --- /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<HomeProvider>(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: <Widget>[ + 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<MyWalletsProvider>(context, listen: false); + SubstrateSdk _sub = Provider.of<SubstrateSdk>(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 <Widget>[ + 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 a694f96525319fba2888a584969d9a69f8c1b586..fa1a4bf5657560f29a79cf42b19894d3036f5f8c 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<WalletsProfilesProvider>(context, listen: false); MyWalletsProvider _myWalletProvider = - Provider.of<MyWalletsProvider>(context); + Provider.of<MyWalletsProvider>(context, listen: false); HomeProvider _homeProvider = Provider.of<HomeProvider>(context, listen: false); @@ -118,30 +120,67 @@ class WalletOptions extends StatelessWidget { }), Expanded( child: SingleChildScrollView( - child: Column(children: <Widget>[ - QrImageWidget( - data: _walletOptions.address.text, - version: QrVersions.auto, - size: isTall ? 300 : 270, - ), - SizedBox(height: 15 * ratio), - Consumer<WalletOptionsProvider>( - 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: <Widget>[ + 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<WalletOptionsProvider>( + 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<bool> _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,49 +395,81 @@ class WalletOptions extends StatelessWidget { ); } - Widget setDefaultWalletWidget( - BuildContext context, - WalletOptionsProvider walletProvider, - MyWalletsProvider _myWalletProvider, - WalletOptionsProvider _walletOptions, - int _currentChest) { - WalletData defaultWallet = _myWalletProvider.getDefaultWallet(); - _walletOptions.isDefaultWallet = (defaultWallet.number == wallet.id()[1]); - + Widget manageMemberStatus(BuildContext context) { + WalletOptionsProvider _walletOptions = + Provider.of<WalletOptionsProvider>(context, listen: false); return InkWell( - key: const Key('setDefaultWallet'), - onTap: !walletProvider.isDefaultWallet - ? () async { - await setDefaultWallet(context, _currentChest); - } - : null, + key: const Key('manageStatus'), + onTap: () { + Navigator.push( + context, + MaterialPageRoute(builder: (context) { + return ManageMembership( + address: _walletOptions.address.text, + ); + }), + ); + }, child: SizedBox( - height: 50, + height: 40, child: Row(children: <Widget>[ - 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: 32), + Image.asset( + 'assets/medal.png', + height: 45, ), 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 Text('Gérer mon adhésion', style: TextStyle(fontSize: 20)), ]), ), ); } + Widget setDefaultWalletWidget( + BuildContext context, + WalletOptionsProvider walletProvider, + MyWalletsProvider _myWalletProvider, + WalletOptionsProvider _walletOptions, + int _currentChest) { + return Consumer<MyWalletsProvider>( + 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: <Widget>[ + 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)), + ]), + ), + ); + }); + } + Future setDefaultWallet(BuildContext context, int _currentChest) async { SubstrateSdk _sub = Provider.of<SubstrateSdk>(context, listen: false); MyWalletsProvider _myWalletProvider = diff --git a/lib/screens/qrcode_fullscreen.dart b/lib/screens/qrcode_fullscreen.dart new file mode 100644 index 0000000000000000000000000000000000000000..c789e015c02b7e7d65620a185f79e39aa9a613d4 --- /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 18d143866779df57b9d018c54552195425ee59c8..e790fb3379376a1a2e3de4c14f59010dabb389a1 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'),