refacto: walletData idtyStatus enum type
This commit is contained in:
parent
08ea8445ad
commit
6f2d33b76e
|
@ -8,10 +8,11 @@ import 'package:hive_flutter/hive_flutter.dart';
|
||||||
import 'package:logger/logger.dart';
|
import 'package:logger/logger.dart';
|
||||||
|
|
||||||
// Version of box data
|
// Version of box data
|
||||||
const int dataVersion = 6;
|
const int dataVersion = 7;
|
||||||
|
|
||||||
late String appVersion;
|
late String appVersion;
|
||||||
const int pinLength = 5;
|
const int pinLength = 5;
|
||||||
|
const int maxWalletsInSafe = 30;
|
||||||
const String appLang = 'english';
|
const String appLang = 'english';
|
||||||
|
|
||||||
late Box<WalletData> walletBox;
|
late Box<WalletData> walletBox;
|
||||||
|
|
|
@ -68,6 +68,7 @@ Future<void> main() async {
|
||||||
Hive.registerAdapter(ChestDataAdapter());
|
Hive.registerAdapter(ChestDataAdapter());
|
||||||
Hive.registerAdapter(G1WalletsListAdapter());
|
Hive.registerAdapter(G1WalletsListAdapter());
|
||||||
Hive.registerAdapter(IdAdapter());
|
Hive.registerAdapter(IdAdapter());
|
||||||
|
Hive.registerAdapter(IdtyStatusAdapter());
|
||||||
|
|
||||||
chestBox = await Hive.openBox<ChestData>("chestBox");
|
chestBox = await Hive.openBox<ChestData>("chestBox");
|
||||||
|
|
||||||
|
|
|
@ -28,18 +28,27 @@ class WalletData extends HiveObject {
|
||||||
bool isOwned;
|
bool isOwned;
|
||||||
|
|
||||||
@HiveField(8)
|
@HiveField(8)
|
||||||
bool isMember;
|
IdtyStatus identityStatus;
|
||||||
|
|
||||||
WalletData(
|
@HiveField(9)
|
||||||
{required this.address,
|
double balance;
|
||||||
this.chest,
|
|
||||||
this.number,
|
@HiveField(10)
|
||||||
this.name,
|
List<int>? certs;
|
||||||
this.derivation,
|
|
||||||
this.imageDefaultPath,
|
WalletData({
|
||||||
this.imageCustomPath,
|
required this.address,
|
||||||
this.isOwned = false,
|
this.chest,
|
||||||
this.isMember = false});
|
this.number,
|
||||||
|
this.name,
|
||||||
|
this.derivation,
|
||||||
|
this.imageDefaultPath,
|
||||||
|
this.imageCustomPath,
|
||||||
|
this.isOwned = false,
|
||||||
|
this.identityStatus = IdtyStatus.unknown,
|
||||||
|
this.balance = 0,
|
||||||
|
this.certs,
|
||||||
|
});
|
||||||
|
|
||||||
// representation of WalletData when debugging
|
// representation of WalletData when debugging
|
||||||
@override
|
@override
|
||||||
|
@ -58,9 +67,23 @@ class WalletData extends HiveObject {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
class NewWallet {
|
@HiveType(typeId: 5)
|
||||||
final String address;
|
enum IdtyStatus {
|
||||||
final String password;
|
@HiveField(0)
|
||||||
|
none,
|
||||||
|
|
||||||
NewWallet._(this.address, this.password);
|
@HiveField(1)
|
||||||
|
created,
|
||||||
|
|
||||||
|
@HiveField(2)
|
||||||
|
confirmed,
|
||||||
|
|
||||||
|
@HiveField(3)
|
||||||
|
validated,
|
||||||
|
|
||||||
|
@HiveField(4)
|
||||||
|
expired,
|
||||||
|
|
||||||
|
@HiveField(5)
|
||||||
|
unknown
|
||||||
}
|
}
|
||||||
|
|
|
@ -25,14 +25,16 @@ class WalletDataAdapter extends TypeAdapter<WalletData> {
|
||||||
imageDefaultPath: fields[5] as String?,
|
imageDefaultPath: fields[5] as String?,
|
||||||
imageCustomPath: fields[6] as String?,
|
imageCustomPath: fields[6] as String?,
|
||||||
isOwned: fields[7] as bool,
|
isOwned: fields[7] as bool,
|
||||||
isMember: fields[8] as bool,
|
identityStatus: fields[8] as IdtyStatus,
|
||||||
|
balance: fields[9] as double,
|
||||||
|
certs: (fields[10] as List?)?.cast<int>(),
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
@override
|
@override
|
||||||
void write(BinaryWriter writer, WalletData obj) {
|
void write(BinaryWriter writer, WalletData obj) {
|
||||||
writer
|
writer
|
||||||
..writeByte(9)
|
..writeByte(11)
|
||||||
..writeByte(0)
|
..writeByte(0)
|
||||||
..write(obj.address)
|
..write(obj.address)
|
||||||
..writeByte(1)
|
..writeByte(1)
|
||||||
|
@ -50,7 +52,11 @@ class WalletDataAdapter extends TypeAdapter<WalletData> {
|
||||||
..writeByte(7)
|
..writeByte(7)
|
||||||
..write(obj.isOwned)
|
..write(obj.isOwned)
|
||||||
..writeByte(8)
|
..writeByte(8)
|
||||||
..write(obj.isMember);
|
..write(obj.identityStatus)
|
||||||
|
..writeByte(9)
|
||||||
|
..write(obj.balance)
|
||||||
|
..writeByte(10)
|
||||||
|
..write(obj.certs);
|
||||||
}
|
}
|
||||||
|
|
||||||
@override
|
@override
|
||||||
|
@ -63,3 +69,62 @@ class WalletDataAdapter extends TypeAdapter<WalletData> {
|
||||||
runtimeType == other.runtimeType &&
|
runtimeType == other.runtimeType &&
|
||||||
typeId == other.typeId;
|
typeId == other.typeId;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
class IdtyStatusAdapter extends TypeAdapter<IdtyStatus> {
|
||||||
|
@override
|
||||||
|
final int typeId = 5;
|
||||||
|
|
||||||
|
@override
|
||||||
|
IdtyStatus read(BinaryReader reader) {
|
||||||
|
switch (reader.readByte()) {
|
||||||
|
case 0:
|
||||||
|
return IdtyStatus.none;
|
||||||
|
case 1:
|
||||||
|
return IdtyStatus.created;
|
||||||
|
case 2:
|
||||||
|
return IdtyStatus.confirmed;
|
||||||
|
case 3:
|
||||||
|
return IdtyStatus.validated;
|
||||||
|
case 4:
|
||||||
|
return IdtyStatus.expired;
|
||||||
|
case 5:
|
||||||
|
return IdtyStatus.unknown;
|
||||||
|
default:
|
||||||
|
return IdtyStatus.none;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
@override
|
||||||
|
void write(BinaryWriter writer, IdtyStatus obj) {
|
||||||
|
switch (obj) {
|
||||||
|
case IdtyStatus.none:
|
||||||
|
writer.writeByte(0);
|
||||||
|
break;
|
||||||
|
case IdtyStatus.created:
|
||||||
|
writer.writeByte(1);
|
||||||
|
break;
|
||||||
|
case IdtyStatus.confirmed:
|
||||||
|
writer.writeByte(2);
|
||||||
|
break;
|
||||||
|
case IdtyStatus.validated:
|
||||||
|
writer.writeByte(3);
|
||||||
|
break;
|
||||||
|
case IdtyStatus.expired:
|
||||||
|
writer.writeByte(4);
|
||||||
|
break;
|
||||||
|
case IdtyStatus.unknown:
|
||||||
|
writer.writeByte(5);
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
@override
|
||||||
|
int get hashCode => typeId.hashCode;
|
||||||
|
|
||||||
|
@override
|
||||||
|
bool operator ==(Object other) =>
|
||||||
|
identical(this, other) ||
|
||||||
|
other is IdtyStatusAdapter &&
|
||||||
|
runtimeType == other.runtimeType &&
|
||||||
|
typeId == other.typeId;
|
||||||
|
}
|
||||||
|
|
|
@ -16,7 +16,6 @@ class DuniterIndexer with ChangeNotifier {
|
||||||
List? transBC;
|
List? transBC;
|
||||||
List listIndexerEndpoints = [];
|
List listIndexerEndpoints = [];
|
||||||
bool isLoadingIndexer = false;
|
bool isLoadingIndexer = false;
|
||||||
Map<String, String> idtyStatusCache = {};
|
|
||||||
|
|
||||||
void reload() {
|
void reload() {
|
||||||
notifyListeners();
|
notifyListeners();
|
||||||
|
|
|
@ -15,8 +15,6 @@ import "package:unorm_dart/unorm_dart.dart" as unorm;
|
||||||
|
|
||||||
class GenerateWalletsProvider with ChangeNotifier {
|
class GenerateWalletsProvider with ChangeNotifier {
|
||||||
GenerateWalletsProvider();
|
GenerateWalletsProvider();
|
||||||
// NewWallet generatedWallet;
|
|
||||||
durt.NewWallet? actualWallet;
|
|
||||||
|
|
||||||
final walletNameFocus = FocusNode();
|
final walletNameFocus = FocusNode();
|
||||||
Color? askedWordColor = Colors.black;
|
Color? askedWordColor = Colors.black;
|
||||||
|
@ -171,7 +169,6 @@ class GenerateWalletsProvider with ChangeNotifier {
|
||||||
void resetCesiumImportView() {
|
void resetCesiumImportView() {
|
||||||
cesiumID.text = cesiumPWD.text = cesiumPubkey.text = pin.text = '';
|
cesiumID.text = cesiumPWD.text = cesiumPubkey.text = pin.text = '';
|
||||||
canImport = isCesiumIDVisible = isCesiumPWDVisible = false;
|
canImport = isCesiumIDVisible = isCesiumPWDVisible = false;
|
||||||
actualWallet = null;
|
|
||||||
notifyListeners();
|
notifyListeners();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -312,9 +312,9 @@ class SubstrateSdk with ChangeNotifier {
|
||||||
}
|
}
|
||||||
|
|
||||||
Future<bool> isMember(String address) async {
|
Future<bool> isMember(String address) async {
|
||||||
final isMember = await idtyStatus(address) == 'Validated';
|
final isMember = await idtyStatus(address) == IdtyStatus.validated;
|
||||||
final walletData = walletBox.get(address) ?? WalletData(address: address);
|
final walletData = walletBox.get(address) ?? WalletData(address: address);
|
||||||
walletData.isMember = isMember;
|
walletData.identityStatus = IdtyStatus.validated;
|
||||||
walletBox.put(address, walletData);
|
walletBox.put(address, walletData);
|
||||||
// notifyListeners();
|
// notifyListeners();
|
||||||
return isMember;
|
return isMember;
|
||||||
|
@ -350,9 +350,9 @@ class SubstrateSdk with ChangeNotifier {
|
||||||
} else if (nextIssuableOn > blocNumber) {
|
} else if (nextIssuableOn > blocNumber) {
|
||||||
final certDelayDuration = (nextIssuableOn - blocNumber) * 6;
|
final certDelayDuration = (nextIssuableOn - blocNumber) * 6;
|
||||||
result.putIfAbsent('certDelay', () => certDelayDuration);
|
result.putIfAbsent('certDelay', () => certDelayDuration);
|
||||||
} else if (toStatus == 'Created') {
|
} else if (toStatus == IdtyStatus.created) {
|
||||||
result.putIfAbsent('toStatus', () => 1);
|
result.putIfAbsent('toStatus', () => 1);
|
||||||
} else if (toStatus == 'noid') {
|
} else if (toStatus == IdtyStatus.none) {
|
||||||
result.putIfAbsent('toStatus', () => 2);
|
result.putIfAbsent('toStatus', () => 2);
|
||||||
result.putIfAbsent('canCert', () => 0);
|
result.putIfAbsent('canCert', () => 0);
|
||||||
} else {
|
} else {
|
||||||
|
@ -397,28 +397,34 @@ class SubstrateSdk with ChangeNotifier {
|
||||||
return startBlockchainTime.add(Duration(seconds: blocNumber * 6));
|
return startBlockchainTime.add(Duration(seconds: blocNumber * 6));
|
||||||
}
|
}
|
||||||
|
|
||||||
Future<String> idtyStatus(String address) async {
|
Future<IdtyStatus> idtyStatus(String address) async {
|
||||||
// final walletOptions =
|
// final walletOptions =
|
||||||
// Provider.of<WalletOptionsProvider>(homeContext, listen: false);
|
// Provider.of<WalletOptionsProvider>(homeContext, listen: false);
|
||||||
|
|
||||||
var idtyIndex = await _getIdentityIndexOf(address);
|
var idtyIndex = await _getIdentityIndexOf(address);
|
||||||
|
|
||||||
if (idtyIndex == null) {
|
if (idtyIndex == null) {
|
||||||
return 'noid';
|
return IdtyStatus.none;
|
||||||
}
|
}
|
||||||
|
|
||||||
final idtyStatus = await _getStorage('identity.identities($idtyIndex)');
|
final idtyStatus = await _getStorage('identity.identities($idtyIndex)');
|
||||||
|
|
||||||
if (idtyStatus != null) {
|
if (idtyStatus != null) {
|
||||||
final String status = idtyStatus['status'];
|
switch (idtyStatus['status']) {
|
||||||
|
case 'Created':
|
||||||
|
return IdtyStatus.created;
|
||||||
|
|
||||||
// if (address == walletOptions.address.text && status == 'Validated') {
|
case 'ConfirmedByOwner':
|
||||||
// walletOptions.reloadBuild();
|
return IdtyStatus.confirmed;
|
||||||
// }
|
|
||||||
|
|
||||||
return (status);
|
case 'Validated':
|
||||||
|
return IdtyStatus.validated;
|
||||||
|
|
||||||
|
default:
|
||||||
|
return IdtyStatus.unknown;
|
||||||
|
}
|
||||||
} else {
|
} else {
|
||||||
return 'expired';
|
return IdtyStatus.expired;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -970,7 +976,7 @@ class SubstrateSdk with ChangeNotifier {
|
||||||
final fromIndex = await _getIdentityIndexOf(fromAddress);
|
final fromIndex = await _getIdentityIndexOf(fromAddress);
|
||||||
final toIndex = await _getIdentityIndexOf(destAddress);
|
final toIndex = await _getIdentityIndexOf(destAddress);
|
||||||
|
|
||||||
if (myIdtyStatus != 'Validated') {
|
if (myIdtyStatus != IdtyStatus.validated) {
|
||||||
transactionStatus = 'notMember';
|
transactionStatus = 'notMember';
|
||||||
notifyListeners();
|
notifyListeners();
|
||||||
return 'notMember';
|
return 'notMember';
|
||||||
|
@ -988,17 +994,17 @@ class SubstrateSdk with ChangeNotifier {
|
||||||
log.d(
|
log.d(
|
||||||
"debug toCert: ${toCerts?[0]} --- ${currencyParameters['minCertForMembership']!} --- $toIdtyStatus");
|
"debug toCert: ${toCerts?[0]} --- ${currencyParameters['minCertForMembership']!} --- $toIdtyStatus");
|
||||||
|
|
||||||
if (toIdtyStatus == 'noid') {
|
if (toIdtyStatus == IdtyStatus.none) {
|
||||||
txInfo = TxInfoData(
|
txInfo = TxInfoData(
|
||||||
'identity',
|
'identity',
|
||||||
'createIdentity',
|
'createIdentity',
|
||||||
sender,
|
sender,
|
||||||
);
|
);
|
||||||
txOptions = [destAddress];
|
txOptions = [destAddress];
|
||||||
} else if (toIdtyStatus == 'Validated' ||
|
} else if (toIdtyStatus == IdtyStatus.validated ||
|
||||||
toIdtyStatus == 'ConfirmedByOwner') {
|
toIdtyStatus == IdtyStatus.confirmed) {
|
||||||
if (toCerts![0] >= currencyParameters['minCertForMembership']! - 1 &&
|
if (toCerts![0] >= currencyParameters['minCertForMembership']! - 1 &&
|
||||||
toIdtyStatus != 'Validated') {
|
toIdtyStatus != IdtyStatus.validated) {
|
||||||
log.i('Batch cert and membership validation');
|
log.i('Batch cert and membership validation');
|
||||||
txInfo = TxInfoData(
|
txInfo = TxInfoData(
|
||||||
'utility',
|
'utility',
|
||||||
|
|
|
@ -29,7 +29,6 @@ class WalletOptionsProvider with ChangeNotifier {
|
||||||
TextEditingController nameController = TextEditingController();
|
TextEditingController nameController = TextEditingController();
|
||||||
late bool isDefaultWallet;
|
late bool isDefaultWallet;
|
||||||
bool canValidateNameBool = false;
|
bool canValidateNameBool = false;
|
||||||
Future<NewWallet>? get badWallet => null;
|
|
||||||
Map<String, double> balanceCache = {};
|
Map<String, double> balanceCache = {};
|
||||||
|
|
||||||
int getPinLenght(walletNbr) {
|
int getPinLenght(walletNbr) {
|
||||||
|
|
|
@ -25,7 +25,6 @@ class RestoreChest extends StatelessWidget {
|
||||||
final genW = Provider.of<GenerateWalletsProvider>(context, listen: false);
|
final genW = Provider.of<GenerateWalletsProvider>(context, listen: false);
|
||||||
final sub = Provider.of<SubstrateSdk>(context, listen: false);
|
final sub = Provider.of<SubstrateSdk>(context, listen: false);
|
||||||
|
|
||||||
genW.actualWallet = null;
|
|
||||||
if (genW.isSentenceComplete(context)) {
|
if (genW.isSentenceComplete(context)) {
|
||||||
genW.generatedMnemonic =
|
genW.generatedMnemonic =
|
||||||
'${genW.cellController0.text} ${genW.cellController1.text} ${genW.cellController2.text} ${genW.cellController3.text} ${genW.cellController4.text} ${genW.cellController5.text} ${genW.cellController6.text} ${genW.cellController7.text} ${genW.cellController8.text} ${genW.cellController9.text} ${genW.cellController10.text} ${genW.cellController11.text}';
|
'${genW.cellController0.text} ${genW.cellController1.text} ${genW.cellController2.text} ${genW.cellController3.text} ${genW.cellController4.text} ${genW.cellController5.text} ${genW.cellController6.text} ${genW.cellController7.text} ${genW.cellController8.text} ${genW.cellController9.text} ${genW.cellController10.text} ${genW.cellController11.text}';
|
||||||
|
|
|
@ -145,7 +145,8 @@ class WalletOptions extends StatelessWidget {
|
||||||
wallet: wallet,
|
wallet: wallet,
|
||||||
size: 29,
|
size: 29,
|
||||||
color: Colors.black,
|
color: Colors.black,
|
||||||
fontWeight: wallet.isMember
|
fontWeight: wallet.identityStatus ==
|
||||||
|
IdtyStatus.validated
|
||||||
? FontWeight.w500
|
? FontWeight.w500
|
||||||
: FontWeight.w400,
|
: FontWeight.w400,
|
||||||
fontStyle: FontStyle.normal);
|
fontStyle: FontStyle.normal);
|
||||||
|
|
|
@ -1,11 +1,11 @@
|
||||||
// ignore_for_file: use_build_context_synchronously
|
// ignore_for_file: use_build_context_synchronously
|
||||||
|
|
||||||
import 'dart:io';
|
|
||||||
import 'package:easy_localization/easy_localization.dart';
|
import 'package:easy_localization/easy_localization.dart';
|
||||||
import 'package:flutter_markdown/flutter_markdown.dart';
|
import 'package:flutter_markdown/flutter_markdown.dart';
|
||||||
import 'package:gecko/globals.dart';
|
import 'package:gecko/globals.dart';
|
||||||
import 'package:gecko/models/chest_data.dart';
|
import 'package:gecko/models/chest_data.dart';
|
||||||
import 'package:gecko/models/widgets_keys.dart';
|
import 'package:gecko/models/widgets_keys.dart';
|
||||||
|
import 'package:gecko/providers/duniter_indexer.dart';
|
||||||
import 'package:gecko/providers/my_wallets.dart';
|
import 'package:gecko/providers/my_wallets.dart';
|
||||||
import 'package:gecko/models/wallet_data.dart';
|
import 'package:gecko/models/wallet_data.dart';
|
||||||
import 'package:flutter/material.dart';
|
import 'package:flutter/material.dart';
|
||||||
|
@ -14,13 +14,11 @@ import 'package:gecko/providers/wallet_options.dart';
|
||||||
import 'package:gecko/screens/myWallets/chest_options.dart';
|
import 'package:gecko/screens/myWallets/chest_options.dart';
|
||||||
import 'package:gecko/screens/myWallets/import_g1_v1.dart';
|
import 'package:gecko/screens/myWallets/import_g1_v1.dart';
|
||||||
import 'package:gecko/screens/myWallets/unlocking_wallet.dart';
|
import 'package:gecko/screens/myWallets/unlocking_wallet.dart';
|
||||||
import 'package:gecko/screens/myWallets/wallet_options.dart';
|
|
||||||
import 'package:gecko/widgets/balance.dart';
|
import 'package:gecko/widgets/balance.dart';
|
||||||
import 'package:gecko/widgets/bottom_app_bar.dart';
|
import 'package:gecko/widgets/bottom_app_bar.dart';
|
||||||
import 'package:gecko/widgets/commons/offline_info.dart';
|
import 'package:gecko/widgets/commons/offline_info.dart';
|
||||||
import 'package:gecko/widgets/commons/smooth_transition.dart';
|
|
||||||
import 'package:gecko/widgets/name_by_address.dart';
|
|
||||||
import 'package:gecko/widgets/payment_popup.dart';
|
import 'package:gecko/widgets/payment_popup.dart';
|
||||||
|
import 'package:gecko/widgets/wallet_tile.dart';
|
||||||
import 'package:provider/provider.dart';
|
import 'package:provider/provider.dart';
|
||||||
import 'package:flutter_svg/flutter_svg.dart';
|
import 'package:flutter_svg/flutter_svg.dart';
|
||||||
import 'package:tutorial_coach_mark/tutorial_coach_mark.dart';
|
import 'package:tutorial_coach_mark/tutorial_coach_mark.dart';
|
||||||
|
@ -99,6 +97,7 @@ class _WalletsHomeState extends State<WalletsHome> {
|
||||||
Widget dragInfo(BuildContext context) {
|
Widget dragInfo(BuildContext context) {
|
||||||
final myWalletProvider =
|
final myWalletProvider =
|
||||||
Provider.of<MyWalletsProvider>(context, listen: false);
|
Provider.of<MyWalletsProvider>(context, listen: false);
|
||||||
|
final duniterIndexer = Provider.of<DuniterIndexer>(context, listen: false);
|
||||||
|
|
||||||
final walletDataFrom =
|
final walletDataFrom =
|
||||||
myWalletProvider.getWalletDataByAddress(myWalletProvider.dragAddress);
|
myWalletProvider.getWalletDataByAddress(myWalletProvider.dragAddress);
|
||||||
|
@ -109,6 +108,14 @@ class _WalletsHomeState extends State<WalletsHome> {
|
||||||
myWalletProvider.dragAddress == myWalletProvider.lastFlyBy;
|
myWalletProvider.dragAddress == myWalletProvider.lastFlyBy;
|
||||||
|
|
||||||
final screenWidth = MediaQuery.of(homeContext).size.width;
|
final screenWidth = MediaQuery.of(homeContext).size.width;
|
||||||
|
|
||||||
|
final fromName =
|
||||||
|
duniterIndexer.walletNameIndexer[walletDataFrom!.address] ??
|
||||||
|
walletDataFrom.name;
|
||||||
|
|
||||||
|
final toName = duniterIndexer.walletNameIndexer[walletDataTo!.address] ??
|
||||||
|
walletDataTo.name;
|
||||||
|
|
||||||
return Container(
|
return Container(
|
||||||
color: yellowC,
|
color: yellowC,
|
||||||
width: screenWidth,
|
width: screenWidth,
|
||||||
|
@ -118,10 +125,9 @@ class _WalletsHomeState extends State<WalletsHome> {
|
||||||
children: [
|
children: [
|
||||||
const SizedBox(height: 5),
|
const SizedBox(height: 5),
|
||||||
Text('${'executeATransfer'.tr()}:'),
|
Text('${'executeATransfer'.tr()}:'),
|
||||||
MarkdownBody(data: '${'from'.tr()} **${walletDataFrom!.name}**'),
|
MarkdownBody(data: '${'from'.tr()} **$fromName**'),
|
||||||
if (isSameAddress) Text('chooseATargetWallet'.tr()),
|
if (isSameAddress) Text('chooseATargetWallet'.tr()),
|
||||||
if (!isSameAddress)
|
if (!isSameAddress) MarkdownBody(data: 'Vers: **$toName**'),
|
||||||
MarkdownBody(data: 'Vers: **${walletDataTo!.name}**'),
|
|
||||||
],
|
],
|
||||||
)),
|
)),
|
||||||
);
|
);
|
||||||
|
@ -359,116 +365,16 @@ class _WalletsHomeState extends State<WalletsHome> {
|
||||||
List<dynamic> accepted,
|
List<dynamic> accepted,
|
||||||
List<dynamic> rejected,
|
List<dynamic> rejected,
|
||||||
) {
|
) {
|
||||||
return Padding(
|
return WalletTile(
|
||||||
padding: const EdgeInsets.all(16),
|
repository: repository,
|
||||||
child: GestureDetector(
|
walletOptions: walletOptions,
|
||||||
key: keyOpenWallet(repository.address),
|
defaultWallet: defaultWallet,
|
||||||
onTap: () {
|
currentChestNumber: currentChestNumber);
|
||||||
walletOptions.getAddress(
|
|
||||||
currentChestNumber, repository.derivation!);
|
|
||||||
Navigator.push(
|
|
||||||
context,
|
|
||||||
SmoothTransition(
|
|
||||||
page: WalletOptions(
|
|
||||||
wallet: repository,
|
|
||||||
),
|
|
||||||
),
|
|
||||||
);
|
|
||||||
},
|
|
||||||
child: SizedBox(
|
|
||||||
key: repository.number == 1
|
|
||||||
? keyDragAndDrop
|
|
||||||
: const Key('nothing'),
|
|
||||||
child: ClipOvalShadow(
|
|
||||||
shadow: const Shadow(
|
|
||||||
color: Colors.transparent,
|
|
||||||
offset: Offset(0, 0),
|
|
||||||
blurRadius: 5,
|
|
||||||
),
|
|
||||||
clipper: CustomClipperOval(),
|
|
||||||
child: ClipRRect(
|
|
||||||
borderRadius:
|
|
||||||
const BorderRadius.all(Radius.circular(12)),
|
|
||||||
child: Column(children: <Widget>[
|
|
||||||
Expanded(
|
|
||||||
child: Container(
|
|
||||||
width: double.infinity,
|
|
||||||
height: double.infinity,
|
|
||||||
decoration: const BoxDecoration(
|
|
||||||
gradient: RadialGradient(
|
|
||||||
radius: 0.8,
|
|
||||||
colors: [
|
|
||||||
Color.fromARGB(255, 255, 255, 211),
|
|
||||||
yellowC,
|
|
||||||
],
|
|
||||||
),
|
|
||||||
),
|
|
||||||
child:
|
|
||||||
// SvgPicture.asset('assets/chopp-gecko2.png',
|
|
||||||
// semanticsLabel: 'Gecko', height: 48),
|
|
||||||
repository.imageCustomPath == null ||
|
|
||||||
repository.imageCustomPath == ''
|
|
||||||
? Image.asset(
|
|
||||||
'assets/avatars/${repository.imageDefaultPath}',
|
|
||||||
alignment:
|
|
||||||
Alignment.bottomCenter,
|
|
||||||
scale: 0.5,
|
|
||||||
)
|
|
||||||
: Container(
|
|
||||||
decoration: BoxDecoration(
|
|
||||||
shape: BoxShape.circle,
|
|
||||||
color: Colors.transparent,
|
|
||||||
image: DecorationImage(
|
|
||||||
fit: BoxFit.fitHeight,
|
|
||||||
image: FileImage(
|
|
||||||
File(repository
|
|
||||||
.imageCustomPath!),
|
|
||||||
),
|
|
||||||
),
|
|
||||||
),
|
|
||||||
),
|
|
||||||
)),
|
|
||||||
Stack(children: <Widget>[
|
|
||||||
BalanceBuilder(
|
|
||||||
address: repository.address,
|
|
||||||
isDefault: repository.address ==
|
|
||||||
defaultWallet.address),
|
|
||||||
Row(
|
|
||||||
mainAxisAlignment:
|
|
||||||
MainAxisAlignment.center,
|
|
||||||
children: [
|
|
||||||
Column(
|
|
||||||
children: [
|
|
||||||
const SizedBox(height: 7),
|
|
||||||
Opacity(
|
|
||||||
opacity: 0.7,
|
|
||||||
child: NameByAddress(
|
|
||||||
wallet: repository,
|
|
||||||
size: 20,
|
|
||||||
color:
|
|
||||||
defaultWallet.address ==
|
|
||||||
repository.address
|
|
||||||
? Colors.white
|
|
||||||
: Colors.black,
|
|
||||||
fontWeight: FontWeight.w600,
|
|
||||||
fontStyle: FontStyle.normal,
|
|
||||||
))
|
|
||||||
],
|
|
||||||
),
|
|
||||||
],
|
|
||||||
),
|
|
||||||
]),
|
|
||||||
]),
|
|
||||||
),
|
|
||||||
),
|
|
||||||
),
|
|
||||||
),
|
|
||||||
);
|
|
||||||
}),
|
}),
|
||||||
),
|
),
|
||||||
Consumer<SubstrateSdk>(builder: (context, sub, _) {
|
Consumer<SubstrateSdk>(builder: (context, sub, _) {
|
||||||
return sub.nodeConnected &&
|
return sub.nodeConnected &&
|
||||||
myWalletProvider.listWallets.length < 30
|
myWalletProvider.listWallets.length < maxWalletsInSafe
|
||||||
? addNewDerivation(context)
|
? addNewDerivation(context)
|
||||||
: const Text('');
|
: const Text('');
|
||||||
}),
|
}),
|
||||||
|
|
|
@ -2,7 +2,6 @@ import 'package:easy_localization/easy_localization.dart';
|
||||||
import 'package:flutter/material.dart';
|
import 'package:flutter/material.dart';
|
||||||
import 'package:gecko/globals.dart';
|
import 'package:gecko/globals.dart';
|
||||||
import 'package:gecko/models/wallet_data.dart';
|
import 'package:gecko/models/wallet_data.dart';
|
||||||
import 'package:gecko/providers/duniter_indexer.dart';
|
|
||||||
import 'package:gecko/providers/substrate_sdk.dart';
|
import 'package:gecko/providers/substrate_sdk.dart';
|
||||||
import 'package:gecko/widgets/commons/animated_text.dart';
|
import 'package:gecko/widgets/commons/animated_text.dart';
|
||||||
import 'package:gecko/widgets/name_by_address.dart';
|
import 'package:gecko/widgets/name_by_address.dart';
|
||||||
|
@ -21,75 +20,58 @@ class IdentityStatus extends StatelessWidget {
|
||||||
|
|
||||||
@override
|
@override
|
||||||
Widget build(BuildContext context) {
|
Widget build(BuildContext context) {
|
||||||
final duniterIndexer = Provider.of<DuniterIndexer>(context, listen: false);
|
|
||||||
|
|
||||||
final walletData = walletBox.get(address) ?? WalletData(address: address);
|
final walletData = walletBox.get(address) ?? WalletData(address: address);
|
||||||
|
|
||||||
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: '',
|
initialData: walletData.identityStatus,
|
||||||
builder: (context, snapshot) {
|
builder: (context, AsyncSnapshot<IdtyStatus> snapshot) {
|
||||||
duniterIndexer.idtyStatusCache[address] = snapshot.data.toString();
|
final resStatus = snapshot.data!;
|
||||||
switch (snapshot.data.toString()) {
|
walletData.identityStatus = resStatus;
|
||||||
case 'noid':
|
walletBox.put(address, walletData);
|
||||||
walletData.isMember = false;
|
|
||||||
walletBox.put(address, walletData);
|
if (!isOwner) {
|
||||||
{
|
if (resStatus == IdtyStatus.confirmed) {
|
||||||
return showText('noIdentity'.tr());
|
return NameByAddress(
|
||||||
}
|
wallet: WalletData(address: address),
|
||||||
case 'Created':
|
size: 20,
|
||||||
walletData.isMember = false;
|
color: Colors.grey[700]!,
|
||||||
walletBox.put(address, walletData);
|
fontWeight: FontWeight.w500,
|
||||||
{
|
fontStyle: FontStyle.italic);
|
||||||
return showText('identityCreated'.tr());
|
} else if (resStatus == IdtyStatus.validated) {
|
||||||
}
|
return NameByAddress(
|
||||||
case 'ConfirmedByOwner':
|
wallet: WalletData(address: address),
|
||||||
walletData.isMember = false;
|
size: 24,
|
||||||
walletBox.put(address, walletData);
|
color: Colors.black,
|
||||||
{
|
fontWeight: FontWeight.w600,
|
||||||
return isOwner
|
fontStyle: FontStyle.normal);
|
||||||
? showText('identityConfirmed'.tr())
|
}
|
||||||
: NameByAddress(
|
|
||||||
wallet: WalletData(address: address),
|
|
||||||
size: 20,
|
|
||||||
color: Colors.grey[700]!,
|
|
||||||
fontWeight: FontWeight.w500,
|
|
||||||
fontStyle: FontStyle.italic);
|
|
||||||
}
|
|
||||||
case 'Validated':
|
|
||||||
walletData.isMember = true;
|
|
||||||
walletBox.put(address, walletData);
|
|
||||||
{
|
|
||||||
return isOwner
|
|
||||||
? showText('memberValidated'.tr(), 18, true)
|
|
||||||
: NameByAddress(
|
|
||||||
wallet: WalletData(address: address),
|
|
||||||
size: 24,
|
|
||||||
color: Colors.black,
|
|
||||||
fontWeight: FontWeight.w600,
|
|
||||||
fontStyle: FontStyle.normal);
|
|
||||||
}
|
|
||||||
case 'expired':
|
|
||||||
walletData.isMember = false;
|
|
||||||
walletBox.put(address, walletData);
|
|
||||||
{
|
|
||||||
return showText('identityExpired'.tr());
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
final Map<IdtyStatus, String> statusText = {
|
||||||
|
IdtyStatus.none: 'noIdentity'.tr(),
|
||||||
|
IdtyStatus.created: 'identityCreated'.tr(),
|
||||||
|
IdtyStatus.confirmed: 'identityConfirmed'.tr(),
|
||||||
|
IdtyStatus.validated: 'memberValidated'.tr(),
|
||||||
|
IdtyStatus.expired: 'identityExpired'.tr(),
|
||||||
|
IdtyStatus.unknown: ''
|
||||||
|
};
|
||||||
|
|
||||||
return SizedBox(
|
return SizedBox(
|
||||||
child: showText('', 18, false, false),
|
child: showText(statusText[resStatus]!,
|
||||||
|
bold: resStatus == IdtyStatus.validated ? true : false),
|
||||||
);
|
);
|
||||||
});
|
});
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
AnimatedFadeOutIn showText(String text,
|
AnimatedFadeOutIn showText(String text,
|
||||||
[double size = 18, bool bold = false, bool smooth = true]) {
|
{double size = 18, bool bold = false}) {
|
||||||
// log.d('$address $text');
|
// log.d('$address $text');
|
||||||
return AnimatedFadeOutIn<String>(
|
return AnimatedFadeOutIn<String>(
|
||||||
data: text,
|
data: text,
|
||||||
duration: Duration(milliseconds: smooth ? 200 : 0),
|
duration: const Duration(milliseconds: 150),
|
||||||
builder: (value) => Text(
|
builder: (value) => Text(
|
||||||
value,
|
value,
|
||||||
textAlign: TextAlign.center,
|
textAlign: TextAlign.center,
|
||||||
|
|
|
@ -0,0 +1,123 @@
|
||||||
|
import 'dart:io';
|
||||||
|
|
||||||
|
import 'package:flutter/material.dart';
|
||||||
|
import 'package:gecko/globals.dart';
|
||||||
|
import 'package:gecko/models/wallet_data.dart';
|
||||||
|
import 'package:gecko/models/widgets_keys.dart';
|
||||||
|
import 'package:gecko/providers/wallet_options.dart';
|
||||||
|
import 'package:gecko/screens/myWallets/wallet_options.dart';
|
||||||
|
import 'package:gecko/screens/myWallets/wallets_home.dart';
|
||||||
|
import 'package:gecko/widgets/commons/smooth_transition.dart';
|
||||||
|
import 'package:gecko/widgets/name_by_address.dart';
|
||||||
|
|
||||||
|
class WalletTile extends StatelessWidget {
|
||||||
|
const WalletTile(
|
||||||
|
{Key? key,
|
||||||
|
required this.repository,
|
||||||
|
required this.walletOptions,
|
||||||
|
required this.defaultWallet,
|
||||||
|
required this.currentChestNumber})
|
||||||
|
: super(key: key);
|
||||||
|
|
||||||
|
final WalletData repository;
|
||||||
|
final WalletOptionsProvider walletOptions;
|
||||||
|
final WalletData defaultWallet;
|
||||||
|
final int currentChestNumber;
|
||||||
|
|
||||||
|
@override
|
||||||
|
Widget build(BuildContext context) {
|
||||||
|
return Padding(
|
||||||
|
padding: const EdgeInsets.all(16),
|
||||||
|
child: GestureDetector(
|
||||||
|
key: keyOpenWallet(repository.address),
|
||||||
|
onTap: () {
|
||||||
|
walletOptions.getAddress(currentChestNumber, repository.derivation!);
|
||||||
|
Navigator.push(
|
||||||
|
context,
|
||||||
|
SmoothTransition(
|
||||||
|
page: WalletOptions(
|
||||||
|
wallet: repository,
|
||||||
|
),
|
||||||
|
),
|
||||||
|
);
|
||||||
|
},
|
||||||
|
child: SizedBox(
|
||||||
|
key: repository.number == 1 ? keyDragAndDrop : const Key('nothing'),
|
||||||
|
child: ClipOvalShadow(
|
||||||
|
shadow: const Shadow(
|
||||||
|
color: Colors.transparent,
|
||||||
|
offset: Offset(0, 0),
|
||||||
|
blurRadius: 5,
|
||||||
|
),
|
||||||
|
clipper: CustomClipperOval(),
|
||||||
|
child: ClipRRect(
|
||||||
|
borderRadius: const BorderRadius.all(Radius.circular(12)),
|
||||||
|
child: Column(children: <Widget>[
|
||||||
|
Expanded(
|
||||||
|
child: Container(
|
||||||
|
width: double.infinity,
|
||||||
|
height: double.infinity,
|
||||||
|
decoration: const BoxDecoration(
|
||||||
|
gradient: RadialGradient(
|
||||||
|
radius: 0.8,
|
||||||
|
colors: [
|
||||||
|
Color.fromARGB(255, 255, 255, 211),
|
||||||
|
yellowC,
|
||||||
|
],
|
||||||
|
),
|
||||||
|
),
|
||||||
|
child: repository.imageCustomPath == null ||
|
||||||
|
repository.imageCustomPath == ''
|
||||||
|
? Image.asset(
|
||||||
|
'assets/avatars/${repository.imageDefaultPath}',
|
||||||
|
alignment: Alignment.bottomCenter,
|
||||||
|
scale: 0.5,
|
||||||
|
)
|
||||||
|
: Container(
|
||||||
|
decoration: BoxDecoration(
|
||||||
|
shape: BoxShape.circle,
|
||||||
|
color: Colors.transparent,
|
||||||
|
image: DecorationImage(
|
||||||
|
fit: BoxFit.fitHeight,
|
||||||
|
image: FileImage(
|
||||||
|
File(repository.imageCustomPath!),
|
||||||
|
),
|
||||||
|
),
|
||||||
|
),
|
||||||
|
),
|
||||||
|
)),
|
||||||
|
Stack(children: <Widget>[
|
||||||
|
BalanceBuilder(
|
||||||
|
address: repository.address,
|
||||||
|
isDefault: repository.address == defaultWallet.address),
|
||||||
|
Row(
|
||||||
|
mainAxisAlignment: MainAxisAlignment.center,
|
||||||
|
children: [
|
||||||
|
Column(
|
||||||
|
children: [
|
||||||
|
const SizedBox(height: 7),
|
||||||
|
Opacity(
|
||||||
|
opacity: 0.7,
|
||||||
|
child: NameByAddress(
|
||||||
|
wallet: repository,
|
||||||
|
size: 20,
|
||||||
|
color:
|
||||||
|
defaultWallet.address == repository.address
|
||||||
|
? Colors.white
|
||||||
|
: Colors.black,
|
||||||
|
fontWeight: FontWeight.w600,
|
||||||
|
fontStyle: FontStyle.normal,
|
||||||
|
))
|
||||||
|
],
|
||||||
|
),
|
||||||
|
],
|
||||||
|
),
|
||||||
|
]),
|
||||||
|
]),
|
||||||
|
),
|
||||||
|
),
|
||||||
|
),
|
||||||
|
),
|
||||||
|
);
|
||||||
|
}
|
||||||
|
}
|
|
@ -1,4 +1,4 @@
|
||||||
#!/bin/bash
|
#!/bin/bash
|
||||||
|
|
||||||
flutter packages pub run build_runner build --delete-conflicting-outputs
|
dart run build_runner build --delete-conflicting-outputs
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue