Merge branch 'idtystatus-multiqueries' into dev
This commit is contained in:
commit
fc03d4de75
|
@ -40,79 +40,31 @@ class MyWalletsProvider with ChangeNotifier {
|
||||||
chest = chest ?? configBox.get('currentChest') ?? 0;
|
chest = chest ?? configBox.get('currentChest') ?? 0;
|
||||||
listWallets.clear();
|
listWallets.clear();
|
||||||
final wallets = walletBox.toMap().values.toList();
|
final wallets = walletBox.toMap().values.toList();
|
||||||
|
Map<String, WalletData> walletsToScan = {};
|
||||||
for (var walletFromBox in wallets) {
|
for (var walletFromBox in wallets) {
|
||||||
if (walletFromBox.chest == chest) {
|
if (walletFromBox.chest == chest) {
|
||||||
if (walletFromBox.identityStatus == IdtyStatus.unknown) {
|
if (walletFromBox.identityStatus == IdtyStatus.unknown) {
|
||||||
walletFromBox.identityStatus =
|
walletsToScan.putIfAbsent(
|
||||||
await sub.idtyStatus(walletFromBox.address);
|
walletFromBox.address, (() => walletFromBox));
|
||||||
walletBox.put(walletFromBox.address, walletFromBox);
|
} else {
|
||||||
}
|
|
||||||
listWallets.add(walletFromBox);
|
listWallets.add(walletFromBox);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// update all idty status in lists
|
||||||
|
int n = 0;
|
||||||
|
final idtyStatusList = await sub.idtyStatus(walletsToScan.keys.toList());
|
||||||
|
for (final wallet in walletsToScan.values) {
|
||||||
|
wallet.identityStatus = idtyStatusList[n];
|
||||||
|
walletBox.put(wallet.address, wallet);
|
||||||
|
listWallets.add(wallet);
|
||||||
|
n++;
|
||||||
|
}
|
||||||
|
|
||||||
return listWallets;
|
return listWallets;
|
||||||
}
|
}
|
||||||
|
|
||||||
// List<WalletData> readAllWallets([int? chest]) {
|
|
||||||
// final sub = Provider.of<SubstrateSdk>(homeContext, listen: false);
|
|
||||||
// bool hasFetchStatus = false;
|
|
||||||
// List<Future> futures = [];
|
|
||||||
// chest = chest ?? configBox.get('currentChest') ?? 0;
|
|
||||||
// listWallets.clear();
|
|
||||||
// walletBox.toMap().forEach((key, walletFromBox) {
|
|
||||||
// if (walletFromBox.chest == chest) {
|
|
||||||
// if (walletFromBox.identityStatus == IdtyStatus.unknown) {
|
|
||||||
// hasFetchStatus = true;
|
|
||||||
// futures.add(sub.idtyStatus(walletFromBox.address).then((valueStatus) {
|
|
||||||
// walletFromBox.identityStatus = valueStatus;
|
|
||||||
// listWallets.add(walletFromBox);
|
|
||||||
// // walletBox.put(key, walletFromBox);
|
|
||||||
// }));
|
|
||||||
// } else {
|
|
||||||
// listWallets.add(walletFromBox);
|
|
||||||
// }
|
|
||||||
// }
|
|
||||||
// });
|
|
||||||
// // if (hasFetchStatus) {
|
|
||||||
// // sleep(const Duration(milliseconds: 300));
|
|
||||||
// // log.d('yoooooooooo');
|
|
||||||
// // readAllWallets(chest);
|
|
||||||
// // }
|
|
||||||
|
|
||||||
// if (hasFetchStatus) {
|
|
||||||
// Future.wait(futures).then((_) {
|
|
||||||
// return listWallets;
|
|
||||||
// // while (listWallets.any((element) =>
|
|
||||||
// // element.chest == chest &&
|
|
||||||
// // element.identityStatus == IdtyStatus.unknown)) {
|
|
||||||
|
|
||||||
// // List tata = listWallets.toList();
|
|
||||||
// // log.d(listWallets);
|
|
||||||
// // while (tata.length < walletBox.length) {
|
|
||||||
// // tata = listWallets.toList();
|
|
||||||
// // sleep(const Duration(milliseconds: 500));
|
|
||||||
// // Map status = {};
|
|
||||||
// // for (var walletInList in tata) {
|
|
||||||
// // status.putIfAbsent(
|
|
||||||
// // walletInList.name, () => walletInList.identityStatus);
|
|
||||||
// // }
|
|
||||||
// // log.d(status);
|
|
||||||
// // log.d('yoooooo');
|
|
||||||
|
|
||||||
// // status.clear();
|
|
||||||
// // }
|
|
||||||
// });
|
|
||||||
// }
|
|
||||||
|
|
||||||
// // if (hasFetchStatus) {
|
|
||||||
// // walletBox.putAll(
|
|
||||||
// // Map.fromEntries(listWallets.map((e) => MapEntry(e.address, e))));
|
|
||||||
// // }
|
|
||||||
|
|
||||||
// return listWallets;
|
|
||||||
// }
|
|
||||||
|
|
||||||
WalletData? getWalletDataById(List<int?> id) {
|
WalletData? getWalletDataById(List<int?> id) {
|
||||||
if (id.isEmpty) return WalletData(address: '', isOwned: true);
|
if (id.isEmpty) return WalletData(address: '', isOwned: true);
|
||||||
int? chest = id[0];
|
int? chest = id[0];
|
||||||
|
@ -261,7 +213,6 @@ class MyWalletsProvider with ChangeNotifier {
|
||||||
|
|
||||||
chestNumber ??= getCurrentChest();
|
chestNumber ??= getCurrentChest();
|
||||||
|
|
||||||
// List<WalletData> walletConfig = await readAllWallets(chestNumber);
|
|
||||||
listWallets.sort((p1, p2) {
|
listWallets.sort((p1, p2) {
|
||||||
return Comparable.compare(p1.number!, p2.number!);
|
return Comparable.compare(p1.number!, p2.number!);
|
||||||
});
|
});
|
||||||
|
|
|
@ -1,5 +1,7 @@
|
||||||
// ignore_for_file: use_build_context_synchronously, body_might_complete_normally_catch_error
|
// ignore_for_file: use_build_context_synchronously, body_might_complete_normally_catch_error
|
||||||
|
|
||||||
|
import 'dart:convert';
|
||||||
|
|
||||||
import 'package:easy_localization/easy_localization.dart';
|
import 'package:easy_localization/easy_localization.dart';
|
||||||
import 'package:fast_base58/fast_base58.dart';
|
import 'package:fast_base58/fast_base58.dart';
|
||||||
import 'package:flutter/foundation.dart';
|
import 'package:flutter/foundation.dart';
|
||||||
|
@ -90,10 +92,11 @@ class SubstrateSdk with ChangeNotifier {
|
||||||
|
|
||||||
Future _getStorage(String call) async {
|
Future _getStorage(String call) async {
|
||||||
try {
|
try {
|
||||||
|
// log.d(call);
|
||||||
return await sdk.webView!.evalJavascript('api.query.$call');
|
return await sdk.webView!.evalJavascript('api.query.$call');
|
||||||
} catch (e) {
|
} catch (e) {
|
||||||
log.e("_getStorage error: $e");
|
log.e("_getStorage error: $e");
|
||||||
return Future(() {});
|
throw Exception("_getStorage error: $e");
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -141,6 +144,12 @@ class SubstrateSdk with ChangeNotifier {
|
||||||
return await _getStorage('identity.identityIndexOf("$address")');
|
return await _getStorage('identity.identityIndexOf("$address")');
|
||||||
}
|
}
|
||||||
|
|
||||||
|
Future<List<int?>> _getIdentityIndexOfMulti(List<String> addresses) async {
|
||||||
|
String jsonString = jsonEncode(addresses);
|
||||||
|
return List<int?>.from(
|
||||||
|
await _getStorage('identity.identityIndexOf.multi($jsonString)'));
|
||||||
|
}
|
||||||
|
|
||||||
Future<List<int>?> getCertsCounter(String address) async {
|
Future<List<int>?> getCertsCounter(String address) async {
|
||||||
final idtyIndex = await _getIdentityIndexOf(address);
|
final idtyIndex = await _getIdentityIndexOf(address);
|
||||||
if (idtyIndex == null) {
|
if (idtyIndex == null) {
|
||||||
|
@ -318,7 +327,7 @@ class SubstrateSdk with ChangeNotifier {
|
||||||
|
|
||||||
Future<Map<String, int>> certState(String from, String to) async {
|
Future<Map<String, int>> certState(String from, String to) async {
|
||||||
Map<String, int> result = {};
|
Map<String, int> result = {};
|
||||||
final toStatus = await idtyStatus(to);
|
final toStatus = (await idtyStatus([to])).first;
|
||||||
|
|
||||||
final myWallets = MyWalletsProvider();
|
final myWallets = MyWalletsProvider();
|
||||||
|
|
||||||
|
@ -380,36 +389,37 @@ class SubstrateSdk with ChangeNotifier {
|
||||||
return startBlockchainTime.add(Duration(seconds: blocNumber * 6));
|
return startBlockchainTime.add(Duration(seconds: blocNumber * 6));
|
||||||
}
|
}
|
||||||
|
|
||||||
Future<IdtyStatus> idtyStatus(String address) async {
|
Future<List<IdtyStatus>> idtyStatus(List<String> addresses) async {
|
||||||
// final walletOptions =
|
// final walletOptions =
|
||||||
// Provider.of<WalletOptionsProvider>(homeContext, listen: false);
|
// Provider.of<WalletOptionsProvider>(homeContext, listen: false);
|
||||||
|
|
||||||
var idtyIndex = await _getIdentityIndexOf(address);
|
final idtyIndexes = await _getIdentityIndexOfMulti(addresses);
|
||||||
|
|
||||||
if (idtyIndex == null) {
|
//FIXME: should not have to replace null values by 99999999
|
||||||
return IdtyStatus.none;
|
final idtyIndexesFix = idtyIndexes.map((item) => item ?? 99999999).toList();
|
||||||
}
|
final jsonString = jsonEncode(idtyIndexesFix);
|
||||||
|
final List idtyStatusList =
|
||||||
|
await _getStorage('identity.identities.multi($jsonString)');
|
||||||
|
|
||||||
final idtyStatus = await _getStorage('identity.identities($idtyIndex)');
|
List<IdtyStatus> resultStatus = [];
|
||||||
|
final mapStatus = {
|
||||||
|
null: IdtyStatus.none,
|
||||||
|
'Created': IdtyStatus.created,
|
||||||
|
'ConfirmedByOwner': IdtyStatus.confirmed,
|
||||||
|
'Validated': IdtyStatus.validated,
|
||||||
|
'Expired': IdtyStatus.expired,
|
||||||
|
'unknown': IdtyStatus.unknown,
|
||||||
|
};
|
||||||
|
|
||||||
if (idtyStatus != null) {
|
for (final idtyStatus in idtyStatusList) {
|
||||||
switch (idtyStatus['status']) {
|
if (idtyStatus == null) {
|
||||||
case 'Created':
|
resultStatus.add(IdtyStatus.none);
|
||||||
return IdtyStatus.created;
|
|
||||||
|
|
||||||
case 'ConfirmedByOwner':
|
|
||||||
return IdtyStatus.confirmed;
|
|
||||||
|
|
||||||
case 'Validated':
|
|
||||||
return IdtyStatus.validated;
|
|
||||||
|
|
||||||
default:
|
|
||||||
return IdtyStatus.unknown;
|
|
||||||
}
|
|
||||||
} else {
|
} else {
|
||||||
return IdtyStatus.expired;
|
resultStatus.add(mapStatus[idtyStatus['status']] ?? IdtyStatus.unknown);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
return resultStatus;
|
||||||
|
}
|
||||||
|
|
||||||
Future<bool> isSmith(String address) async {
|
Future<bool> isSmith(String address) async {
|
||||||
var idtyIndex = await _getIdentityIndexOf(address);
|
var idtyIndex = await _getIdentityIndexOf(address);
|
||||||
|
@ -872,11 +882,12 @@ class SubstrateSdk with ChangeNotifier {
|
||||||
final fromBalance = fromAddress == ''
|
final fromBalance = fromAddress == ''
|
||||||
? {'transferableBalance': 0}
|
? {'transferableBalance': 0}
|
||||||
: await getBalance(fromAddress);
|
: await getBalance(fromAddress);
|
||||||
final fromIdtyStatus =
|
|
||||||
fromAddress == '' ? IdtyStatus.none : await idtyStatus(fromAddress);
|
final statusList = await idtyStatus([fromAddress, toAddress]);
|
||||||
|
final fromIdtyStatus = statusList[0];
|
||||||
final fromHasConsumer =
|
final fromHasConsumer =
|
||||||
fromAddress == '' ? false : await hasAccountConsumers(fromAddress);
|
fromAddress == '' ? false : await hasAccountConsumers(fromAddress);
|
||||||
final toIdtyStatus = await idtyStatus(toAddress);
|
final toIdtyStatus = statusList[1];
|
||||||
final isSmithData = await isSmith(fromAddress);
|
final isSmithData = await isSmith(fromAddress);
|
||||||
|
|
||||||
return [
|
return [
|
||||||
|
@ -951,11 +962,14 @@ class SubstrateSdk with ChangeNotifier {
|
||||||
String fromAddress, String destAddress, String password) async {
|
String fromAddress, String destAddress, String password) async {
|
||||||
transactionStatus = '';
|
transactionStatus = '';
|
||||||
|
|
||||||
final myIdtyStatus = await idtyStatus(fromAddress);
|
final statusList = await idtyStatus([fromAddress, destAddress]);
|
||||||
final toIdtyStatus = await idtyStatus(destAddress);
|
final myIdtyStatus = statusList[0];
|
||||||
|
final toIdtyStatus = statusList[1];
|
||||||
|
|
||||||
final fromIndex = await _getIdentityIndexOf(fromAddress);
|
final idtyIndexList =
|
||||||
final toIndex = await _getIdentityIndexOf(destAddress);
|
await _getIdentityIndexOfMulti([fromAddress, destAddress]);
|
||||||
|
final fromIndex = idtyIndexList[0];
|
||||||
|
final toIndex = idtyIndexList[1];
|
||||||
|
|
||||||
if (myIdtyStatus != IdtyStatus.validated) {
|
if (myIdtyStatus != IdtyStatus.validated) {
|
||||||
transactionStatus = 'notMember';
|
transactionStatus = 'notMember';
|
||||||
|
|
|
@ -340,10 +340,11 @@ class WalletOptions extends StatelessWidget {
|
||||||
Widget confirmIdentityButton(WalletOptionsProvider walletProvider) {
|
Widget confirmIdentityButton(WalletOptionsProvider walletProvider) {
|
||||||
return Consumer<SubstrateSdk>(builder: (context, sub, _) {
|
return Consumer<SubstrateSdk>(builder: (context, sub, _) {
|
||||||
return FutureBuilder(
|
return FutureBuilder(
|
||||||
future: sub.idtyStatus(walletProvider.address.text),
|
future: sub.idtyStatus([walletProvider.address.text]),
|
||||||
initialData: '',
|
initialData: const [IdtyStatus.unknown],
|
||||||
builder: (context, snapshot) {
|
builder:
|
||||||
if (snapshot.data == IdtyStatus.created) {
|
(BuildContext context, AsyncSnapshot<List<IdtyStatus>> snapshot) {
|
||||||
|
if (snapshot.data!.first == IdtyStatus.created) {
|
||||||
return Column(children: [
|
return Column(children: [
|
||||||
SizedBox(
|
SizedBox(
|
||||||
width: 320,
|
width: 320,
|
||||||
|
|
|
@ -24,10 +24,10 @@ class IdentityStatus extends StatelessWidget {
|
||||||
|
|
||||||
return Consumer<SubstrateSdk>(builder: (context, sub, _) {
|
return Consumer<SubstrateSdk>(builder: (context, sub, _) {
|
||||||
return FutureBuilder(
|
return FutureBuilder(
|
||||||
future: sub.idtyStatus(address),
|
future: sub.idtyStatus([address]),
|
||||||
initialData: walletData.identityStatus,
|
initialData: [walletData.identityStatus],
|
||||||
builder: (context, AsyncSnapshot<IdtyStatus> snapshot) {
|
builder: (context, AsyncSnapshot<List<IdtyStatus>> snapshot) {
|
||||||
final resStatus = snapshot.data!;
|
final resStatus = snapshot.data!.first;
|
||||||
walletData.identityStatus = resStatus;
|
walletData.identityStatus = resStatus;
|
||||||
walletBox.put(address, walletData);
|
walletBox.put(address, walletData);
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue