manage membership revoke

This commit is contained in:
poka 2022-06-05 02:22:22 +02:00
parent 36bc2f571f
commit 684974cd59
6 changed files with 360 additions and 59 deletions

View File

@ -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(

View File

@ -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);

View File

@ -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)),
]),
),
);
}
}

View File

@ -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,47 +395,79 @@ class WalletOptions extends StatelessWidget {
);
}
Widget manageMemberStatus(BuildContext context) {
WalletOptionsProvider _walletOptions =
Provider.of<WalletOptionsProvider>(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: <Widget>[
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: <Widget>[
const SizedBox(width: 31),
CircleAvatar(
backgroundColor:
Colors.grey[walletProvider.isDefaultWallet ? 300 : 500],
child: Image.asset(
'assets/walletOptions/android-checkmark.png',
height: 25,
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)),
]),
),
);
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 {

View File

@ -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),
],
)),
),
),
);
}
}

View File

@ -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'),