wip: use multiqueries for idtystatus and idtyindex
This commit is contained in:
parent
cab22eb4ae
commit
db13c4a580
|
@ -40,79 +40,31 @@ class MyWalletsProvider with ChangeNotifier {
|
|||
chest = chest ?? configBox.get('currentChest') ?? 0;
|
||||
listWallets.clear();
|
||||
final wallets = walletBox.toMap().values.toList();
|
||||
Map<String, WalletData> walletsToScan = {};
|
||||
for (var walletFromBox in wallets) {
|
||||
if (walletFromBox.chest == chest) {
|
||||
if (walletFromBox.identityStatus == IdtyStatus.unknown) {
|
||||
walletFromBox.identityStatus =
|
||||
await sub.idtyStatus(walletFromBox.address);
|
||||
walletBox.put(walletFromBox.address, walletFromBox);
|
||||
}
|
||||
walletsToScan.putIfAbsent(
|
||||
walletFromBox.address, (() => walletFromBox));
|
||||
} else {
|
||||
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;
|
||||
}
|
||||
|
||||
// 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) {
|
||||
if (id.isEmpty) return WalletData(address: '', isOwned: true);
|
||||
int? chest = id[0];
|
||||
|
@ -261,7 +213,6 @@ class MyWalletsProvider with ChangeNotifier {
|
|||
|
||||
chestNumber ??= getCurrentChest();
|
||||
|
||||
// List<WalletData> walletConfig = await readAllWallets(chestNumber);
|
||||
listWallets.sort((p1, p2) {
|
||||
return Comparable.compare(p1.number!, p2.number!);
|
||||
});
|
||||
|
|
|
@ -1,5 +1,7 @@
|
|||
// 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:fast_base58/fast_base58.dart';
|
||||
import 'package:flutter/foundation.dart';
|
||||
|
@ -90,10 +92,11 @@ class SubstrateSdk with ChangeNotifier {
|
|||
|
||||
Future _getStorage(String call) async {
|
||||
try {
|
||||
log.d(call);
|
||||
return await sdk.webView!.evalJavascript('api.query.$call');
|
||||
} catch (e) {
|
||||
log.e("_getStorage error: $e");
|
||||
return Future(() {});
|
||||
throw Exception("_getStorage error: $e");
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -141,6 +144,14 @@ class SubstrateSdk with ChangeNotifier {
|
|||
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)'));
|
||||
// .map((e) => e as int?)
|
||||
// .toList() as List<int?>;
|
||||
}
|
||||
|
||||
Future<List<int>?> getCertsCounter(String address) async {
|
||||
final idtyIndex = await _getIdentityIndexOf(address);
|
||||
if (idtyIndex == null) {
|
||||
|
@ -318,7 +329,7 @@ class SubstrateSdk with ChangeNotifier {
|
|||
|
||||
Future<Map<String, int>> certState(String from, String to) async {
|
||||
Map<String, int> result = {};
|
||||
final toStatus = await idtyStatus(to);
|
||||
final toStatus = (await idtyStatus([to])).first;
|
||||
|
||||
final myWallets = MyWalletsProvider();
|
||||
|
||||
|
@ -380,35 +391,52 @@ class SubstrateSdk with ChangeNotifier {
|
|||
return startBlockchainTime.add(Duration(seconds: blocNumber * 6));
|
||||
}
|
||||
|
||||
Future<IdtyStatus> idtyStatus(String address) async {
|
||||
Future<List<IdtyStatus>> idtyStatus(List<String> addresses) async {
|
||||
// final walletOptions =
|
||||
// Provider.of<WalletOptionsProvider>(homeContext, listen: false);
|
||||
|
||||
var idtyIndex = await _getIdentityIndexOf(address);
|
||||
log.d(addresses);
|
||||
final idtyIndexes = (await _getIdentityIndexOfMulti(addresses));
|
||||
// .map((dynamic e) => e as String)
|
||||
// .toList();
|
||||
log.d(idtyIndexes);
|
||||
final jsonString = jsonEncode(idtyIndexes);
|
||||
final List idtyStatusList =
|
||||
await _getStorage('identity.identities.multi($jsonString)');
|
||||
|
||||
if (idtyIndex == null) {
|
||||
return IdtyStatus.none;
|
||||
log.d(idtyStatusList);
|
||||
|
||||
List<IdtyStatus> resultStatus = [];
|
||||
|
||||
for (final idtyStatus in idtyStatusList) {
|
||||
if (idtyStatus == null) {
|
||||
resultStatus.add(IdtyStatus.none);
|
||||
continue;
|
||||
}
|
||||
|
||||
final idtyStatus = await _getStorage('identity.identities($idtyIndex)');
|
||||
|
||||
if (idtyStatus != null) {
|
||||
switch (idtyStatus['status']) {
|
||||
case 'Created':
|
||||
return IdtyStatus.created;
|
||||
resultStatus.add(IdtyStatus.created);
|
||||
break;
|
||||
|
||||
case 'ConfirmedByOwner':
|
||||
return IdtyStatus.confirmed;
|
||||
resultStatus.add(IdtyStatus.confirmed);
|
||||
break;
|
||||
|
||||
case 'Validated':
|
||||
return IdtyStatus.validated;
|
||||
resultStatus.add(IdtyStatus.validated);
|
||||
break;
|
||||
|
||||
case 'Expired':
|
||||
resultStatus.add(IdtyStatus.expired);
|
||||
break;
|
||||
|
||||
default:
|
||||
return IdtyStatus.unknown;
|
||||
resultStatus.add(IdtyStatus.unknown);
|
||||
break;
|
||||
}
|
||||
} else {
|
||||
return IdtyStatus.expired;
|
||||
}
|
||||
return resultStatus;
|
||||
}
|
||||
|
||||
Future<bool> isSmith(String address) async {
|
||||
|
@ -872,11 +900,12 @@ class SubstrateSdk with ChangeNotifier {
|
|||
final fromBalance = fromAddress == ''
|
||||
? {'transferableBalance': 0}
|
||||
: await getBalance(fromAddress);
|
||||
final fromIdtyStatus =
|
||||
fromAddress == '' ? IdtyStatus.none : await idtyStatus(fromAddress);
|
||||
|
||||
final statusList = await idtyStatus([fromAddress, toAddress]);
|
||||
final fromIdtyStatus = statusList[0];
|
||||
final fromHasConsumer =
|
||||
fromAddress == '' ? false : await hasAccountConsumers(fromAddress);
|
||||
final toIdtyStatus = await idtyStatus(toAddress);
|
||||
final toIdtyStatus = statusList[1];
|
||||
final isSmithData = await isSmith(fromAddress);
|
||||
|
||||
return [
|
||||
|
@ -951,11 +980,14 @@ class SubstrateSdk with ChangeNotifier {
|
|||
String fromAddress, String destAddress, String password) async {
|
||||
transactionStatus = '';
|
||||
|
||||
final myIdtyStatus = await idtyStatus(fromAddress);
|
||||
final toIdtyStatus = await idtyStatus(destAddress);
|
||||
final statusList = await idtyStatus([fromAddress, destAddress]);
|
||||
final myIdtyStatus = statusList[0];
|
||||
final toIdtyStatus = statusList[1];
|
||||
|
||||
final fromIndex = await _getIdentityIndexOf(fromAddress);
|
||||
final toIndex = await _getIdentityIndexOf(destAddress);
|
||||
final idtyIndexList =
|
||||
await _getIdentityIndexOfMulti([fromAddress, destAddress]);
|
||||
final fromIndex = idtyIndexList[0];
|
||||
final toIndex = idtyIndexList[1];
|
||||
|
||||
if (myIdtyStatus != IdtyStatus.validated) {
|
||||
transactionStatus = 'notMember';
|
||||
|
|
|
@ -340,10 +340,11 @@ class WalletOptions extends StatelessWidget {
|
|||
Widget confirmIdentityButton(WalletOptionsProvider walletProvider) {
|
||||
return Consumer<SubstrateSdk>(builder: (context, sub, _) {
|
||||
return FutureBuilder(
|
||||
future: sub.idtyStatus(walletProvider.address.text),
|
||||
initialData: '',
|
||||
builder: (context, snapshot) {
|
||||
if (snapshot.data == IdtyStatus.created) {
|
||||
future: sub.idtyStatus([walletProvider.address.text]),
|
||||
initialData: const [IdtyStatus.unknown],
|
||||
builder:
|
||||
(BuildContext context, AsyncSnapshot<List<IdtyStatus>> snapshot) {
|
||||
if (snapshot.data!.first == IdtyStatus.created) {
|
||||
return Column(children: [
|
||||
SizedBox(
|
||||
width: 320,
|
||||
|
|
|
@ -24,10 +24,10 @@ class IdentityStatus extends StatelessWidget {
|
|||
|
||||
return Consumer<SubstrateSdk>(builder: (context, sub, _) {
|
||||
return FutureBuilder(
|
||||
future: sub.idtyStatus(address),
|
||||
initialData: walletData.identityStatus,
|
||||
builder: (context, AsyncSnapshot<IdtyStatus> snapshot) {
|
||||
final resStatus = snapshot.data!;
|
||||
future: sub.idtyStatus([address]),
|
||||
initialData: [walletData.identityStatus],
|
||||
builder: (context, AsyncSnapshot<List<IdtyStatus>> snapshot) {
|
||||
final resStatus = snapshot.data!.first;
|
||||
walletData.identityStatus = resStatus;
|
||||
walletBox.put(address, walletData);
|
||||
|
||||
|
|
Loading…
Reference in New Issue