From cff31b298096a11ecbc6d1aa88b8583be91c26c2 Mon Sep 17 00:00:00 2001 From: poka <poka@p2p.legal> Date: Tue, 13 May 2025 23:35:40 +0200 Subject: [PATCH] BIG WIP --- assets/translations/en.json | 2 +- assets/translations/es.json | 2 +- assets/translations/fr.json | 2 +- assets/translations/it.json | 2 +- integration_test/utility/tests_utility.dart | 18 +-- lib/globals.dart | 4 - lib/main.dart | 21 +-- lib/models/chest_data.dart | 34 ---- lib/models/chest_data.g.dart | 53 ------- lib/models/membership_renewal.dart | 4 +- lib/models/membership_status.dart | 2 +- lib/models/migrate_wallet_checks.dart | 2 +- lib/models/wallet_data.dart | 148 ------------------ lib/models/wallet_data.g.dart | 138 ---------------- lib/providers/chest_provider.dart | 26 ++- lib/providers/generate_wallets.dart | 117 ++++++-------- lib/providers/home.dart | 81 +++++++++- lib/providers/my_wallets.dart | 80 +++++----- lib/providers/substrate_sdk.dart | 53 +++---- lib/providers/wallet_options.dart | 29 ++-- lib/screens/home.dart | 136 ++++------------ lib/screens/myWallets/chest_options.dart | 7 +- lib/screens/myWallets/choose_chest.dart | 55 +++---- lib/screens/myWallets/confirm_change_pin.dart | 2 +- lib/screens/myWallets/custom_derivations.dart | 4 +- lib/screens/myWallets/import_g1_v1.dart | 2 +- lib/screens/myWallets/manage_membership.dart | 4 +- lib/screens/myWallets/show_seed.dart | 2 +- lib/screens/myWallets/unlocking_wallet.dart | 20 +-- lib/screens/myWallets/wallet_options.dart | 27 ++-- lib/screens/myWallets/wallets_home.dart | 12 +- lib/screens/onBoarding/10.dart | 38 +++-- lib/screens/onBoarding/5.dart | 32 ++-- lib/screens/wallet_view.dart | 6 +- lib/services/durt.service.dart | 7 - lib/services/wallets.service.dart | 53 ------- .../buttons/add_new_derivation_button.dart | 2 +- lib/widgets/buttons/home_buttons.dart | 2 +- lib/widgets/certify/certify_button.dart | 3 +- lib/widgets/contacts_list.dart | 2 +- lib/widgets/drag_tule_action.dart | 4 +- lib/widgets/drag_wallets_info.dart | 20 +-- lib/widgets/idty_status.dart | 19 ++- lib/widgets/name_by_address.dart | 2 +- lib/widgets/payment_popup.dart | 4 +- lib/widgets/search_result_list.dart | 2 +- lib/widgets/wallet_header.dart | 2 +- lib/widgets/wallet_name.dart | 2 +- lib/widgets/wallet_tile.dart | 10 +- lib/widgets/wallet_tile_membre.dart | 10 +- 50 files changed, 397 insertions(+), 912 deletions(-) delete mode 100644 lib/models/chest_data.dart delete mode 100644 lib/models/chest_data.g.dart delete mode 100644 lib/models/wallet_data.dart delete mode 100644 lib/models/wallet_data.g.dart delete mode 100644 lib/services/durt.service.dart delete mode 100644 lib/services/wallets.service.dart diff --git a/assets/translations/en.json b/assets/translations/en.json index fdfeae16..306a84bc 100644 --- a/assets/translations/en.json +++ b/assets/translations/en.json @@ -71,7 +71,7 @@ "yourChestAndWalletWereRestoredSuccessfully": "Super!\n\nYour safe and your portfolios have been restored with great success.\n\nCongratulations!", "allGood": "That's all good!", "areYouSureToForgetSafe": "Are you sure you want to forget the safe \"{}\"?", - "areYouSureForgetAllChests": "Are you sure you want to forget all your safes?", + "areYouSureForgetAllSafes": "Are you sure you want to forget all your safes?", "areYouSureToForgetWallet": "Are you sure you want to forget the wallet \"{}\"?\nThe balance will be transferred to your default wallet.", "areYouSureYouWantToCertify1": "Are you sure you want to certify the identity :", "areYouSureYouWantToCertify2": "having the address :", diff --git a/assets/translations/es.json b/assets/translations/es.json index 571c73fb..23e5a273 100644 --- a/assets/translations/es.json +++ b/assets/translations/es.json @@ -71,7 +71,7 @@ "yourChestAndWalletWereRestoredSuccessfully": "¡Genial!\n\nTu cofre y tus monederos han sido restaurados con éxito.\n\n¡Felicidades!", "allGood": "¡Todo bien!", "areYouSureToForgetSafe": "¿Seguro de que quieres olvidar el cofre \"{}\"?", - "areYouSureForgetAllChests": "¿Seguro de que quieres olvidar todos tus cofres?", + "areYouSureForgetAllSafes": "¿Seguro de que quieres olvidar todos tus cofres?", "areYouSureToForgetWallet": "¿Seguro de que quieres olvidar el monedero \"{}\"?\nEl saldo será transferido al monedero por defecto.", "areYouSureYouWantToCertify": "¿Seguro de que quiere certificar a la dirección\n\n{}?", "areYouSureYouWantToCertify1": "¿Seguro de que quiere certificar a la identidad :", diff --git a/assets/translations/fr.json b/assets/translations/fr.json index 823af693..66ff7443 100644 --- a/assets/translations/fr.json +++ b/assets/translations/fr.json @@ -71,7 +71,7 @@ "yourChestAndWalletWereRestoredSuccessfully": "Top !\n\nVotre coffre et vos portefeuilles ont été restaurés avec succès.\n\nFélicitations !", "allGood": "C'est tout bon !", "areYouSureToForgetSafe": "Êtes-vous sûr de vouloir oublier le coffre \"{}\" ?", - "areYouSureForgetAllChests": "Êtes-vous sûr de vouloir oublier tous vos coffres ?", + "areYouSureForgetAllSafes": "Êtes-vous sûr de vouloir oublier tous vos coffres ?", "areYouSureToForgetWallet": "Êtes-vous sûr de vouloir oublier le portefeuille \"{}\" ?\nLe solde sera transféré vers votre portefeuille par défaut.", "areYouSureYouWantToCertify1": "Êtes-vous certain de vouloir certifier l'identité :", "areYouSureYouWantToCertify2": "ayant pour adresse :", diff --git a/assets/translations/it.json b/assets/translations/it.json index 0e2b1cab..7376d21f 100644 --- a/assets/translations/it.json +++ b/assets/translations/it.json @@ -70,7 +70,7 @@ "yourChestAndWalletWereRestoredSuccessfully": "Fantastico!\n\nIl tuo scrigno e i tuoi portafogli sono stati recuperati con successo.\n\nCongratulazioni!", "allGood": "Tutto bene!", "areYouSureToForgetSafe": "Sicuro che vuoi eliminare lo scrigno \"{}\"?", - "areYouSureForgetAllChests": "Sicuro che vuoi dimenticare tutti i tuoi scrigni?", + "areYouSureForgetAllSafes": "Sicuro che vuoi dimenticare tutti i tuoi scrigni?", "areYouSureToForgetWallet": "Sicuro che vuoi dimenticare il tuo portafoglio \"{}\"?", "areYouSureYouWantToCertify": "Sicuro che vuoi certificare l'indirizzo\n\n{}?", "areYouSureYouWantToCertify1": "Sicuro che vuoi certificare l'identitá :", diff --git a/integration_test/utility/tests_utility.dart b/integration_test/utility/tests_utility.dart index 4fa850ac..eb4a8146 100644 --- a/integration_test/utility/tests_utility.dart +++ b/integration_test/utility/tests_utility.dart @@ -1,10 +1,9 @@ +import 'package:durt2/durt2.dart' show Durt, WalletData; import 'package:easy_localization/easy_localization.dart'; import 'package:flutter/material.dart'; import 'package:flutter/services.dart'; import 'package:flutter_test/flutter_test.dart'; import 'package:gecko/globals.dart'; -import 'package:gecko/models/wallet_data.dart'; -import 'package:gecko/providers/generate_wallets.dart'; import 'package:gecko/providers/my_wallets.dart'; import 'package:gecko/providers/substrate_sdk.dart'; import 'package:gecko/utils.dart'; @@ -219,21 +218,21 @@ Future bkSetNode([String? endpoint]) async { // Restore chest in background Future bkRestoreChest([String mnemonic = testMnemonic]) async { final myWalletProvider = Provider.of<MyWalletsProvider>(homeContext, listen: false); - final generateWalletProvider = Provider.of<GenerateWalletsProvider>(homeContext, listen: false); + // final generateWalletProvider = Provider.of<GenerateWalletsProvider>(homeContext, listen: false); - await generateWalletProvider.storeHDWChest(homeContext); + // await generateWalletProvider.storeHDWChest(homeContext); for (int number = 0; number <= 4; number++) { - await _addImportAccount(mnemonic: mnemonic, chest: 0, number: number, name: 'test${number + 1}', derivation: (number + 1) * 2); + await _addImportAccount(mnemonic: mnemonic, safeNumber: 0, number: number, name: 'test${number + 1}', derivation: (number + 1) * 2); } myWalletProvider.reload(); } -Future<WalletData> _addImportAccount({required String mnemonic, required int chest, required int number, required String name, required int derivation}) async { +Future<WalletData> _addImportAccount({required String mnemonic, required int safeNumber, required int number, required String name, required int derivation}) async { final address = await sub.importAccount(mnemonic: mnemonic, derivePath: '//$derivation', password: 'AAAAA'); final myWallet = - WalletData(chest: chest, address: address, number: number, name: name, derivation: derivation, imageDefaultPath: '${number % 4}.png', isOwned: true); - await walletBox.put(myWallet.address, myWallet); + WalletData(safeBoxNumber: safeNumber, address: address, name: name, derivation: derivation, imagePath: '${number % 4}.png', isOwned: true); + await Durt.instance.walletService.walletDataBox.put(myWallet.address, myWallet); return myWallet; } @@ -243,8 +242,7 @@ Future bkDeleteAllWallets() async { final myWalletProvider = Provider.of<MyWalletsProvider>(homeContext, listen: false); final isWalletsPresents = await isPresent('scanQRCode'.tr(), timeout: const Duration(milliseconds: 300)); if (isWalletsPresents) { - await walletBox.clear(); - await chestBox.clear(); + await Durt.instance.walletService.clearWallet(); await configBox.delete('defaultWallet'); await configBox.delete('isUdUnit'); await sub.deleteAllAccounts(); diff --git a/lib/globals.dart b/lib/globals.dart index 4e4046c3..7b9b826a 100644 --- a/lib/globals.dart +++ b/lib/globals.dart @@ -1,9 +1,7 @@ import 'dart:io'; import 'package:easy_localization/easy_localization.dart'; import 'package:flutter/material.dart'; -import 'package:gecko/models/chest_data.dart'; import 'package:gecko/models/g1_wallets_list.dart'; -import 'package:gecko/models/wallet_data.dart'; import 'package:gecko/models/wallet_header_data.dart'; import 'package:hive_flutter/hive_flutter.dart'; import 'package:logger/logger.dart'; @@ -17,8 +15,6 @@ const int pinLength = 4; const int maxWalletsInSafe = 30; const String appLang = 'english'; -late Box<WalletData> walletBox; -late Box<ChestData> chestBox; late Box configBox; late Box<G1WalletsList> g1WalletsBox; late Box<G1WalletsList> contactsBox; diff --git a/lib/main.dart b/lib/main.dart index e18ec904..fc8c3186 100644 --- a/lib/main.dart +++ b/lib/main.dart @@ -14,7 +14,6 @@ // along with this program. If not, see <https://www.gnu.org/licenses/>. import 'dart:async'; -import 'package:durt2/durt2.dart'; import 'package:flutter/services.dart'; import 'package:gecko/globals.dart'; import 'package:gecko/providers/chest_provider.dart'; @@ -33,10 +32,6 @@ import 'package:flutter/material.dart'; import 'package:gecko/screens/myWallets/wallets_home.dart'; import 'package:gecko/screens/search.dart'; import 'package:gecko/screens/search_result.dart'; -import 'package:gecko/services/durt.service.dart'; -import 'package:gecko/services/wallets.service.dart'; -import 'package:get_it/get_it.dart'; - import 'package:provider/provider.dart'; import 'package:flutter/foundation.dart'; import 'package:responsive_framework/responsive_framework.dart'; @@ -61,12 +56,10 @@ Future<void> main() async { await initHiveForFlutter(); await homeProvider.initHive(); - - appVersion = await homeProvider.getAppVersion(); // Register app dependencies - await registerDependencies(); + // await registerDependencies(); if (kReleaseMode && enableSentry) { await SentryFlutter.init((options) { @@ -191,11 +184,7 @@ class Gecko extends StatelessWidget { } } -Future<void> registerDependencies() async { - GetIt.I.registerSingleton<WalletsService>(WalletsService()); - GetIt.I.registerSingleton<DurtService>(DurtService()); - GetIt.I.registerSingleton<DuniterStorageService>(DuniterStorageService()); - - // Wait for all non-lazy repos to be ready - await GetIt.I.allReady(); -} +// Future<void> registerDependencies() async { +// // Wait for all non-lazy repos to be ready +// await GetIt.I.allReady(); +// } diff --git a/lib/models/chest_data.dart b/lib/models/chest_data.dart deleted file mode 100644 index ef2d3f72..00000000 --- a/lib/models/chest_data.dart +++ /dev/null @@ -1,34 +0,0 @@ -import 'dart:io'; -import 'package:hive_flutter/hive_flutter.dart'; -part 'chest_data.g.dart'; - -@HiveType(typeId: 1) -class ChestData extends HiveObject { - @HiveField(0) - String? name; - - @HiveField(1) - int? defaultWallet; - - @HiveField(2) - String? imageName; - - @HiveField(3) - File? imageFile; - - @HiveField(4) - int? memberWallet; - - ChestData({ - this.name, - this.defaultWallet, - this.imageName, - this.imageFile, - this.memberWallet, - }); - - @override - String toString() { - return name!; - } -} diff --git a/lib/models/chest_data.g.dart b/lib/models/chest_data.g.dart deleted file mode 100644 index cf1aa52c..00000000 --- a/lib/models/chest_data.g.dart +++ /dev/null @@ -1,53 +0,0 @@ -// GENERATED CODE - DO NOT MODIFY BY HAND - -part of 'chest_data.dart'; - -// ************************************************************************** -// TypeAdapterGenerator -// ************************************************************************** - -class ChestDataAdapter extends TypeAdapter<ChestData> { - @override - final int typeId = 1; - - @override - ChestData read(BinaryReader reader) { - final numOfFields = reader.readByte(); - final fields = <int, dynamic>{ - for (int i = 0; i < numOfFields; i++) reader.readByte(): reader.read(), - }; - return ChestData( - name: fields[0] as String?, - defaultWallet: fields[1] as int?, - imageName: fields[2] as String?, - imageFile: fields[3] as File?, - memberWallet: fields[4] as int?, - ); - } - - @override - void write(BinaryWriter writer, ChestData obj) { - writer - ..writeByte(5) - ..writeByte(0) - ..write(obj.name) - ..writeByte(1) - ..write(obj.defaultWallet) - ..writeByte(2) - ..write(obj.imageName) - ..writeByte(3) - ..write(obj.imageFile) - ..writeByte(4) - ..write(obj.memberWallet); - } - - @override - int get hashCode => typeId.hashCode; - - @override - bool operator ==(Object other) => - identical(this, other) || - other is ChestDataAdapter && - runtimeType == other.runtimeType && - typeId == other.typeId; -} diff --git a/lib/models/membership_renewal.dart b/lib/models/membership_renewal.dart index f477f99f..6ff3e231 100644 --- a/lib/models/membership_renewal.dart +++ b/lib/models/membership_renewal.dart @@ -1,9 +1,9 @@ // ignore_for_file: use_build_context_synchronously +import 'package:durt2/durt2.dart' show IdtyStatus; import 'package:easy_localization/easy_localization.dart'; import 'package:flutter/material.dart'; import 'package:gecko/models/scale_functions.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/transaction_in_progress.dart'; @@ -15,7 +15,7 @@ import 'package:gecko/models/membership_status.dart'; class MembershipRenewal { static RenewalInfo calculateRenewalInfo(MembershipStatus status, int renewalPeriodBlocks) { if (status.expireDate == null) { - return status.idtyStatus == IdtyStatus.notMember + return status.idtyStatus == IdtyStatus.expired ? RenewalInfo( canRenew: true, isExpired: true, diff --git a/lib/models/membership_status.dart b/lib/models/membership_status.dart index 6059351e..a8cab69d 100644 --- a/lib/models/membership_status.dart +++ b/lib/models/membership_status.dart @@ -1,4 +1,4 @@ -import 'package:gecko/models/wallet_data.dart'; +import 'package:durt2/durt2.dart' show IdtyStatus; class MembershipStatus { final DateTime? expireDate; diff --git a/lib/models/migrate_wallet_checks.dart b/lib/models/migrate_wallet_checks.dart index 5e4f03b9..81a7b86f 100644 --- a/lib/models/migrate_wallet_checks.dart +++ b/lib/models/migrate_wallet_checks.dart @@ -1,4 +1,4 @@ -import 'package:gecko/models/wallet_data.dart'; +import 'package:durt2/durt2.dart' show IdtyStatus; class MigrateWalletChecks { final Map<String, dynamic> fromBalance; diff --git a/lib/models/wallet_data.dart b/lib/models/wallet_data.dart deleted file mode 100644 index 9f1fc933..00000000 --- a/lib/models/wallet_data.dart +++ /dev/null @@ -1,148 +0,0 @@ -// ignore_for_file: use_build_context_synchronously - -import 'dart:io'; - -import 'package:gecko/globals.dart'; -import 'package:gecko/providers/v2s_datapod.dart'; -import 'package:hive_flutter/hive_flutter.dart'; -import 'package:provider/provider.dart'; -import 'package:uuid/uuid.dart'; -part 'wallet_data.g.dart'; - -@HiveType(typeId: 0) -class WalletData extends HiveObject { - @HiveField(0) - String address; - - @HiveField(1) - int? chest; - - @HiveField(2) - int? number; - - @HiveField(3) - String? name; - - @HiveField(4) - int? derivation; - - @HiveField(5) - String? imageDefaultPath; - - @HiveField(6) - String? imageCustomPath; - - @HiveField(7) - bool isOwned; - - @HiveField(8) - IdtyStatus identityStatus; - - @HiveField(9) - double balance; - - @HiveField(10) - List<int>? certs; - - @HiveField(11) - DateTime? profileUpdatedTime; - - WalletData({ - required this.address, - this.chest, - this.number, - this.name, - this.derivation, - this.imageDefaultPath, - this.imageCustomPath, - this.profileUpdatedTime, - this.isOwned = false, - this.identityStatus = IdtyStatus.unknown, - this.balance = 0, - this.certs, - }); - - // representation of WalletData when debugging - @override - String toString() { - return name!; - } - - // creates the ':'-separated string from the WalletData - String get inLine => "$chest:$number:$name:$derivation:$imageDefaultPath:$imageCustomPath:$identityStatus"; - - bool get hasIdentity => - identityStatus == IdtyStatus.unconfirmed || - identityStatus == IdtyStatus.unvalidated || - identityStatus == IdtyStatus.member || - identityStatus == IdtyStatus.notMember; - - bool get isMembre => identityStatus == IdtyStatus.member; - - bool get exist => balance != 0; - - bool get hasCustomImage => imageCustomPath != null; - - List<int?> get id => [chest, number]; - - Future<DateTime?> getUpdatedTime() async { - final datapod = Provider.of<V2sDatapodProvider>(homeContext, listen: false); - return await datapod.profileEditedAt(address); - } - - Future<bool> shouldUpdateProfile() async { - final remoteUpdatedProfile = await getUpdatedTime(); - late Duration difference; - if (profileUpdatedTime != null && remoteUpdatedProfile != null) { - difference = profileUpdatedTime!.difference(remoteUpdatedProfile); - } else if (remoteUpdatedProfile != null) { - return true; - } else { - difference = Duration.zero; - } - return difference.inSeconds.abs() >= 30; - } - - /// This method get the remote avatar on v2s-datapod only if needed, and store it on disk - Future getDatapodAvatar() async { - if (!await shouldUpdateProfile()) return; - - final datapod = Provider.of<V2sDatapodProvider>(homeContext, listen: false); - final avatarUuid = const Uuid().v4(); - - await datapod.getRemoteAvatar(address, uuid: avatarUuid); - - final avatarPath = '${avatarsDirectory.path}/$address-$avatarUuid'; - if (!await File(avatarPath).exists()) return; - - profileUpdatedTime = await getUpdatedTime(); - imageCustomPath = avatarPath; - - walletBox.put(address, this); - datapod.reload(); - } -} - -@HiveType(typeId: 5) -enum IdtyStatus { - @HiveField(0) - none, - - @HiveField(1) - unconfirmed, - - @HiveField(2) - unvalidated, - - @HiveField(3) - member, - - @HiveField(4) - notMember, - - @HiveField(5) - revoked, - - @HiveField(6) - unknown -} diff --git a/lib/models/wallet_data.g.dart b/lib/models/wallet_data.g.dart deleted file mode 100644 index 71df9617..00000000 --- a/lib/models/wallet_data.g.dart +++ /dev/null @@ -1,138 +0,0 @@ -// GENERATED CODE - DO NOT MODIFY BY HAND - -part of 'wallet_data.dart'; - -// ************************************************************************** -// TypeAdapterGenerator -// ************************************************************************** - -class WalletDataAdapter extends TypeAdapter<WalletData> { - @override - final int typeId = 0; - - @override - WalletData read(BinaryReader reader) { - final numOfFields = reader.readByte(); - final fields = <int, dynamic>{ - for (int i = 0; i < numOfFields; i++) reader.readByte(): reader.read(), - }; - return WalletData( - address: fields[0] as String, - chest: fields[1] as int?, - number: fields[2] as int?, - name: fields[3] as String?, - derivation: fields[4] as int?, - imageDefaultPath: fields[5] as String?, - imageCustomPath: fields[6] as String?, - profileUpdatedTime: fields[11] as DateTime?, - isOwned: fields[7] as bool, - identityStatus: fields[8] as IdtyStatus, - balance: fields[9] as double, - certs: (fields[10] as List?)?.cast<int>(), - ); - } - - @override - void write(BinaryWriter writer, WalletData obj) { - writer - ..writeByte(12) - ..writeByte(0) - ..write(obj.address) - ..writeByte(1) - ..write(obj.chest) - ..writeByte(2) - ..write(obj.number) - ..writeByte(3) - ..write(obj.name) - ..writeByte(4) - ..write(obj.derivation) - ..writeByte(5) - ..write(obj.imageDefaultPath) - ..writeByte(6) - ..write(obj.imageCustomPath) - ..writeByte(7) - ..write(obj.isOwned) - ..writeByte(8) - ..write(obj.identityStatus) - ..writeByte(9) - ..write(obj.balance) - ..writeByte(10) - ..write(obj.certs) - ..writeByte(11) - ..write(obj.profileUpdatedTime); - } - - @override - int get hashCode => typeId.hashCode; - - @override - bool operator ==(Object other) => - identical(this, other) || - other is WalletDataAdapter && - runtimeType == other.runtimeType && - 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.unconfirmed; - case 2: - return IdtyStatus.unvalidated; - case 3: - return IdtyStatus.member; - case 4: - return IdtyStatus.notMember; - case 5: - return IdtyStatus.revoked; - case 6: - 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.unconfirmed: - writer.writeByte(1); - break; - case IdtyStatus.unvalidated: - writer.writeByte(2); - break; - case IdtyStatus.member: - writer.writeByte(3); - break; - case IdtyStatus.notMember: - writer.writeByte(4); - break; - case IdtyStatus.revoked: - writer.writeByte(5); - break; - case IdtyStatus.unknown: - writer.writeByte(6); - break; - } - } - - @override - int get hashCode => typeId.hashCode; - - @override - bool operator ==(Object other) => - identical(this, other) || - other is IdtyStatusAdapter && - runtimeType == other.runtimeType && - typeId == other.typeId; -} diff --git a/lib/providers/chest_provider.dart b/lib/providers/chest_provider.dart index 28f45437..74f35d3f 100644 --- a/lib/providers/chest_provider.dart +++ b/lib/providers/chest_provider.dart @@ -1,9 +1,7 @@ import 'dart:async'; +import 'package:durt2/durt2.dart' show Durt, SafeBox, WalletData; import 'package:easy_localization/easy_localization.dart'; import 'package:flutter/material.dart'; -import 'package:gecko/globals.dart'; -import 'package:gecko/models/chest_data.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/widgets/commons/confirmation_dialog.dart'; @@ -14,21 +12,21 @@ class ChestProvider with ChangeNotifier { notifyListeners(); } - Future forgetSafe(context, ChestData chest) async { - final bool? answer = await (_confirmDeletingChest(context, chest.name)); + Future forgetSafe(context, SafeBox safe) async { + final bool? answer = await (_confirmDeletingChest(context, safe.name)); final sub = Provider.of<SubstrateSdk>(context, listen: false); if (answer ?? false) { - await sub.deleteAccounts(getChestWallets(chest)); - await chestBox.delete(chest.key); + await sub.deleteAccounts(getChestWallets(safe)); + await Durt.instance.walletService.deleteSafe(safe.key); final myWalletProvider = Provider.of<MyWalletsProvider>(context, listen: false); myWalletProvider.pinCode = ''; - if (chestBox.isEmpty) { - await configBox.put('currentChest', 0); + if (Durt.instance.walletService.safeBox.isEmpty) { + await Durt.instance.walletService.setDefaultSafeBoxNumber(0); } else { - int? lastChest = chestBox.toMap().keys.first; - await configBox.put('currentChest', lastChest); + final int lastSafe = Durt.instance.walletService.safeBox.toMap().keys.first; + await Durt.instance.walletService.setDefaultSafeBoxNumber(lastSafe); } Navigator.popUntil( @@ -39,10 +37,10 @@ class ChestProvider with ChangeNotifier { } } - List<String> getChestWallets(ChestData chest) { + List<String> getChestWallets(SafeBox safe) { List<String> toDelete = []; - walletBox.toMap().forEach((key, WalletData value) { - if (value.chest == chest.key) { + Durt.instance.walletService.walletDataBox.toMap().forEach((key, WalletData value) { + if (value.safeBoxNumber == safe.key) { toDelete.add(value.address); } }); diff --git a/lib/providers/generate_wallets.dart b/lib/providers/generate_wallets.dart index 9fc83244..656e7c0d 100644 --- a/lib/providers/generate_wallets.dart +++ b/lib/providers/generate_wallets.dart @@ -1,29 +1,19 @@ import 'dart:math'; import 'package:durt/durt.dart' as durt; -import 'package:durt2/durt2.dart' show DuniterStorageService, Durt, Language, WalletBalance; +import 'package:durt2/durt2.dart' show Durt, Language, WalletBalance, WalletData; import 'package:easy_localization/easy_localization.dart'; import 'package:flutter/foundation.dart'; import 'package:flutter/material.dart'; import 'package:flutter/services.dart'; import 'package:gecko/globals.dart'; import 'package:gecko/models/bip39_words.dart'; -import 'package:gecko/models/chest_data.dart'; -import 'package:gecko/models/wallet_data.dart'; -import 'package:gecko/providers/substrate_sdk.dart'; -import 'package:gecko/services/wallets.service.dart' show WalletsService; import 'package:gecko/widgets/scan_derivations_info.dart'; import 'package:gecko/widgets/commons/common_elements.dart'; -import 'package:get_it/get_it.dart'; -import 'package:polkawallet_sdk/api/apiKeyring.dart'; -import 'package:provider/provider.dart'; import "package:unorm_dart/unorm_dart.dart" as unorm; class GenerateWalletsProvider with ChangeNotifier { GenerateWalletsProvider(); - final walletService = GetIt.I.get<WalletsService>(); - final duniterStorage = GetIt.I.get<DuniterStorageService>(); - final walletNameFocus = FocusNode(); Color? askedWordColor = Colors.black; bool isAskedWordValid = false; @@ -64,29 +54,29 @@ class GenerateWalletsProvider with ChangeNotifier { final cellController11 = TextEditingController(); bool isFirstTimeSentenceComplete = true; - @Deprecated('Use Durt 2 instead') - Future storeHDWChest(BuildContext context) async { - int chestNumber = chestBox.isEmpty ? 0 : chestBox.keys.last + 1; - - String chestName; - if (chestNumber == 0) { - chestName = 'geckoChest'.tr(); - } else { - chestName = '${'geckoChest'.tr()}${chestNumber + 1}'; - } - await configBox.put('currentChest', chestNumber); - - ChestData thisChest = ChestData( - name: chestName, - defaultWallet: 0, - imageName: '${chestNumber % 8}.png', - ); - await chestBox.add(thisChest); - int? chestKey = chestBox.keys.last; - - await configBox.put('currentChest', chestKey); - notifyListeners(); - } + // @Deprecated('Use Durt 2 instead') + // Future storeHDWChest(BuildContext context) async { + // int chestNumber = chestBox.isEmpty ? 0 : chestBox.keys.last + 1; + + // String chestName; + // if (chestNumber == 0) { + // chestName = 'geckoChest'.tr(); + // } else { + // chestName = '${'geckoChest'.tr()}${chestNumber + 1}'; + // } + // await configBox.put('currentChest', chestNumber); + + // ChestData thisChest = ChestData( + // name: chestName, + // defaultWallet: 0, + // imageName: '${chestNumber % 8}.png', + // ); + // await chestBox.add(thisChest); + // int? chestKey = chestBox.keys.last; + + // await configBox.put('currentChest', chestKey); + // notifyListeners(); + // } void checkAskedWord(String inputWord, String mnemo) { final expectedWord = mnemo.split(' ')[nbrWord]; @@ -159,10 +149,6 @@ class GenerateWalletsProvider with ChangeNotifier { } Future<List<String>?> generateWordList(BuildContext context) async { - final sub = Provider.of<SubstrateSdk>(context, listen: false); - final walletService = GetIt.I.get<WalletsService>(); - if (!sub.sdkReady) return null; - final language = switch (appLang) { 'english' => Language.english, 'french' => Language.french, @@ -171,7 +157,7 @@ class GenerateWalletsProvider with ChangeNotifier { _ => Language.english, }; - final generatedMnemonicTyped = walletService.generateMnemonic(language); + final generatedMnemonicTyped = Durt.instance.walletService.generateMnemonic(language); generatedMnemonic = generatedMnemonicTyped.sentence; return generatedMnemonicTyped.words; @@ -284,14 +270,9 @@ class GenerateWalletsProvider with ChangeNotifier { return await _scanDerivations(context, pinCode).timeout( const Duration(seconds: 20), onTimeout: () async { - // // Remove the current chest - // final currentChestNumber = configBox.get('currentChest'); - // if (currentChestNumber != null) { - // final currentChest = chestBox.get(currentChestNumber); - // if (currentChest != null) { - // await chestBox.delete(currentChestNumber); - // } - // } + // Remove the current chest + final actualSafeNumber = Durt.instance.walletService.defaultSafeBoxNumber; + await Durt.instance.walletService.deleteSafe(actualSafeNumber); // Display error message to user // ignore: use_build_context_synchronously @@ -340,35 +321,34 @@ class GenerateWalletsProvider with ChangeNotifier { scanStatus = ScanDerivationsStatus.scanning; for (int derivationNbr in [for (var i = 0; i < numberScan; i += 1) i]) { - final addressData = await sub.sdk.api.keyring - .addressFromMnemonic(sub.currencyParameters['ss58']!, cryptoType: CryptoType.sr25519, mnemonic: generatedMnemonic!, derivePath: '//$derivationNbr'); - addressToScan.putIfAbsent(addressData.address!, () => derivationNbr); + final keypair = await Durt.instance.walletService.getKeyPairFromMnemonic(generatedMnemonic!); + addressToScan.putIfAbsent(keypair.address, () => derivationNbr); } - final balanceList = await sub.getBalanceMulti(addressToScan.keys.toList()).timeout( + final balanceList = await Durt.instance.storage.getBalances(addressToScan.keys.toList()).timeout( const Duration(seconds: 20), onTimeout: () => {}, ); // Remove unused wallets - balanceList.removeWhere((key, value) => value.transferableBalance == 0); + balanceList.removeWhere((key, value) => value.free == BigInt.zero); scanedValidWalletNumber = balanceList.length + scanedWalletNumber; scanStatus = ScanDerivationsStatus.import; for (String scannedWallet in balanceList.keys) { isAlive = true; String walletName = scanedWalletNumber == 0 ? 'currentWallet'.tr() : '${'wallet'.tr()} ${scanedWalletNumber + 1}'; - await sub.importAccount(mnemonic: generatedMnemonic!, derivePath: "//${addressToScan[scannedWallet]}", password: pinCode); + await Durt.instance.walletService.importDerivations(pinCode: pinCode, derivations: [addressToScan[scannedWallet]!]); + final actualSafeNumber = Durt.instance.walletService.defaultSafeBoxNumber; WalletData myWallet = WalletData( - chest: currentChestNumber, + safeBoxNumber: actualSafeNumber, address: scannedWallet, - number: scanedWalletNumber, name: walletName, derivation: addressToScan[scannedWallet], - imageDefaultPath: '${scanedWalletNumber % 4}.png', + imagePath: '${scanedWalletNumber % 4}.png', isOwned: true); - await walletBox.put(myWallet.address, myWallet); + await Durt.instance.walletService.walletDataBox.put(myWallet.address, myWallet); scanedWalletNumber++; notifyListeners(); } @@ -381,31 +361,26 @@ class GenerateWalletsProvider with ChangeNotifier { Future<bool> scanRootBalance(String pinCode) async { if (generatedMnemonic == null) return false; - // final addressData = - // await sub.sdk.api.keyring.addressFromMnemonic(sub.currencyParameters['ss58']!, cryptoType: CryptoType.sr25519, mnemonic: generatedMnemonic!); - final keypair = await walletService.getKeyPairFromMnemonic(generatedMnemonic!); - if (keypair == null) return false; + final keypair = await Durt.instance.walletService.getKeyPairFromMnemonic(generatedMnemonic!); + + final address = Durt.instance.walletService.getAddress(keypair.address); // if (addressData.address == null) return false; - final balance = await duniterStorage.getBalance(keypair.address).timeout( + final balance = await Durt.instance.storage.getBalance(address).timeout( const Duration(seconds: 1), onTimeout: () => WalletBalance.empty(), ); if (balance.free != BigInt.zero) { - // String walletName = 'myRootWallet'.tr(); - //TODO: Use int pincode directly instead of cast - final pinCodeint = int.parse(pinCode); - await walletService.createSafe(mnemonic: generatedMnemonic!, pinCode: pinCodeint); + String walletName = 'myRootWallet'.tr(); - await walletService.importRootWallet(pinCode: pinCode); + await Durt.instance.walletService.importRootWallet(pinCode: pinCode); - // await sub.importAccount(mnemonic: generatedMnemonic!, password: pinCode); + final actualSafeNumber = Durt.instance.walletService.defaultSafeBoxNumber; - // WalletData myWallet = WalletData( - // chest: currentChestNumber, address: addressData.address!, number: 0, name: walletName, derivation: -1, imageDefaultPath: '0.png', isOwned: true); - // await walletBox.put(myWallet.address, myWallet); + WalletData myWallet = WalletData(safeBoxNumber: actualSafeNumber, address: address, name: walletName, derivation: -1, imagePath: '0.png', isOwned: true); + await Durt.instance.walletService.walletDataBox.put(myWallet.address, myWallet); scanedWalletNumber++; return true; } else { diff --git a/lib/providers/home.dart b/lib/providers/home.dart index 5810785f..ef201942 100644 --- a/lib/providers/home.dart +++ b/lib/providers/home.dart @@ -1,23 +1,25 @@ import 'dart:convert'; import 'dart:io'; import 'dart:math'; +import 'package:durt2/durt2.dart' show Durt, Networks; import 'package:easy_localization/easy_localization.dart'; import 'package:flutter/material.dart'; import 'package:flutter/services.dart'; import 'dart:async'; import 'package:gecko/globals.dart'; import 'package:gecko/models/certification_data.dart'; +import 'package:gecko/providers/my_wallets.dart' show MyWalletsProvider; import 'package:gecko/providers/substrate_sdk.dart'; +import 'package:gecko/providers/v2s_datapod.dart' show V2sDatapodProvider; import 'package:gecko/providers/wallet_options.dart'; +import 'package:gecko/widgets/commons/common_elements.dart' show infoPopup; import 'package:hive_flutter/hive_flutter.dart'; import 'package:flutter/foundation.dart' show kDebugMode, kIsWeb, setEquals; import 'package:path_provider/path_provider.dart' as pp; import 'package:package_info_plus/package_info_plus.dart'; import 'package:path_provider/path_provider.dart'; import 'package:provider/provider.dart'; -import 'package:gecko/models/chest_data.dart'; import 'package:gecko/models/g1_wallets_list.dart'; -import 'package:gecko/models/wallet_data.dart'; import 'package:gecko/models/wallet_header_data.dart'; import 'package:gecko/services/network_config_service.dart'; @@ -65,15 +67,11 @@ class HomeProvider with ChangeNotifier { // Register Hive adapters Hive.registerAdapter(WalletHeaderDataAdapter()); Hive.registerAdapter(BigIntAdapter()); - Hive.registerAdapter(WalletDataAdapter()); - Hive.registerAdapter(ChestDataAdapter()); Hive.registerAdapter(G1WalletsListAdapter()); Hive.registerAdapter(IdAdapter()); - Hive.registerAdapter(IdtyStatusAdapter()); Hive.registerAdapter(CertificationDataAdapter()); // Open required boxes synchronously - chestBox = await Hive.openBox<ChestData>("chestBox"); configBox = await Hive.openBox("configBox"); // Check if walletHeaderDataVersion non compatible, drop wallet_header_cache @@ -202,4 +200,75 @@ class HomeProvider with ChangeNotifier { void reload() { notifyListeners(); } + + Future<void> initHome(BuildContext context) async { + final homeProvider = Provider.of<HomeProvider>(context, listen: false); + final sub = Provider.of<SubstrateSdk>(context, listen: false); + final myWalletProvider = Provider.of<MyWalletsProvider>(context, listen: false); + final datapod = Provider.of<V2sDatapodProvider>(context, listen: false); + + // Init durt 2 + await Durt().init(network: Networks.gdev); + + // Check if versionData non compatible, drop everything + if (configBox.get('dataVersion') == null) { + configBox.put('dataVersion', dataVersion); + } + if (myWalletProvider.isWalletsExists && (configBox.get('dataVersion')) < dataVersion) { + if (!sub.sdkReady && !sub.sdkLoading) sub.initApi(); + // ignore: use_build_context_synchronously + await infoPopup(context, "chestNotCompatibleMustReinstallGecko".tr()); + await Hive.deleteBoxFromDisk('walletBox'); + await Hive.deleteBoxFromDisk('chestBox'); + await datapod.deleteAvatarsDirectory(); + await avatarsDirectory.create(); + await configBox.delete('defaultWallet'); + if (!sub.sdkReady && !sub.sdkLoading) await sub.initApi(); + await sub.deleteAllAccounts(); + configBox.put('dataVersion', dataVersion); + myWalletProvider.reload(); + } else { + if (!sub.sdkReady && !sub.sdkLoading) await sub.initApi(); + } + + if (sub.sdkReady && !sub.nodeConnected) { + await Hive.deleteBoxFromDisk('g1WalletsBox'); + await datapod.deleteAvatarsCacheDirectory(); + await avatarsCacheDirectory.create(); + g1WalletsBox = await Hive.openBox<G1WalletsList>("g1WalletsBox"); + contactsBox = await Hive.openBox<G1WalletsList>("contactsBox"); + + homeProvider.isWalletBoxInit = true; + myWalletProvider.reload(); + + // await homeProvider.getValidEndpoints(); + if (configBox.get('isCacheChecked') == null) { + configBox.put('isCacheChecked', false); + } + + // Future<void> updateConnectionStatus(List<ConnectivityResult> result) async { + // log.i('Network changed: $result'); + // if (result.contains(ConnectivityResult.none)) { + // sub.nodeConnected = false; + // await sub.sdk.api.setting.unsubscribeBestNumber(); + // homeProvider.changeMessage("notConnectedToInternet".tr()); + // sub.reload(); + // } else { + // // Check if the phone is actually connected to the internet + // var connectivityResult = await (Connectivity().checkConnectivity()); + // if (!connectivityResult.contains(ConnectivityResult.none)) { + // await sub.connectNode(); + + // // Load wallets list + // // myWalletProvider.readAllWallets(myWalletProvider.getCurrentSafe); + + // //Connect to Indexer + // await duniterIndexer.getValidIndexerEndpoint(); + // } + // } + // } + + // Connectivity().onConnectivityChanged.listen(updateConnectionStatus); + } + } } diff --git a/lib/providers/my_wallets.dart b/lib/providers/my_wallets.dart index 0ea7d5d4..f3d5c45c 100644 --- a/lib/providers/my_wallets.dart +++ b/lib/providers/my_wallets.dart @@ -1,11 +1,11 @@ import 'dart:io'; +import 'package:durt2/durt2.dart' show Durt, IdtyStatus, WalletData; import 'package:easy_localization/easy_localization.dart'; import 'package:flutter/material.dart'; import 'package:gecko/extensions.dart'; import 'dart:async'; import 'package:gecko/globals.dart'; -import 'package:gecko/models/wallet_data.dart'; import 'package:gecko/providers/substrate_sdk.dart'; import 'package:gecko/screens/myWallets/unlocking_wallet.dart'; import 'package:gecko/widgets/commons/confirmation_dialog.dart'; @@ -25,28 +25,22 @@ class MyWalletsProvider with ChangeNotifier { bool isOwner(String address) => listWallets.any((wallet) => wallet.address == address); - int getCurrentChest() { - if (configBox.get('currentChest') == null) { - configBox.put('currentChest', 0); - } - - return configBox.get('currentChest'); - } + int get getCurrentSafe => Durt.instance.walletService.defaultSafeBoxNumber; - bool isWalletsExists() => chestBox.isNotEmpty; + bool get isWalletsExists => Durt.instance.walletService.safeBox.isNotEmpty; WalletData? get idtyWallet => listWallets.firstWhereOrNull((w) => w.isMembre) ?? listWallets.firstWhereOrNull((w) => w.hasIdentity); List<WalletData> get listWalletsWithoutIdty => listWallets.where((w) => w.address != idtyWallet?.address).toList(); - Future<List<WalletData>> readAllWallets([int? chest]) async { + Future<List<WalletData>> readAllWallets([int? safe]) async { final sub = Provider.of<SubstrateSdk>(homeContext, listen: false); - chest = chest ?? getCurrentChest(); + safe = safe ?? getCurrentSafe; listWallets.clear(); - final wallets = walletBox.toMap().values.toList(); + final wallets = Durt.instance.walletService.walletDataBox.toMap().values.toList(); Map<String, WalletData> walletsToScan = {}; for (var walletFromBox in wallets) { - if (walletFromBox.chest != chest) { + if (walletFromBox.safeBoxNumber != safe) { continue; } if (walletFromBox.identityStatus == IdtyStatus.unknown) { @@ -61,24 +55,24 @@ class MyWalletsProvider with ChangeNotifier { final idtyStatusList = await sub.idtyStatusMulti(walletsToScan.keys.toList()); for (final wallet in walletsToScan.values) { wallet.identityStatus = idtyStatusList[n]; - walletBox.put(wallet.address, wallet); + Durt.instance.walletService.walletDataBox.put(wallet.address, wallet); listWallets.add(wallet); n++; } - listWallets.sort((p1, p2) => Comparable.compare(p1.number!, p2.number!)); + listWallets.sort((p1, p2) => Comparable.compare(p1.number, p2.number)); return listWallets; } WalletData? getWalletDataById(List<int?> id) { if (id.isEmpty) return WalletData(address: '', isOwned: true); - int? chest = id[0]; + int? safe = id[0]; int? nbr = id[1]; WalletData? targetedWallet; - walletBox.toMap().forEach((key, value) { - if (value.chest == chest && value.number == nbr) { + Durt.instance.walletService.walletDataBox.toMap().forEach((key, value) { + if (value.safeBoxNumber == safe && value.number == nbr) { targetedWallet = value; return; } @@ -102,15 +96,17 @@ class MyWalletsProvider with ChangeNotifier { return pinCode.isNotEmpty; } - WalletData? getWalletDataByAddress(String address) => walletBox.toMap().values.firstWhereOrNull((wallet) => wallet.address == address); + WalletData? getWalletDataByAddress(String address) => + Durt.instance.walletService.walletDataBox.toMap().values.firstWhereOrNull((wallet) => wallet.address == address); - WalletData getDefaultWallet([int? chest]) { - if (chestBox.isEmpty) { - return WalletData(address: '', chest: 0, number: 0, isOwned: true); + WalletData getDefaultWallet([int? safe]) { + if (Durt.instance.walletService.safeBox.isEmpty) { + return WalletData(address: '', safeBoxNumber: 0, number: 0, isOwned: true); } else { - chest ??= getCurrentChest(); - int? defaultWalletNumber = chestBox.get(chest)!.defaultWallet; - return getWalletDataById([chest, defaultWalletNumber]) ?? WalletData(address: '', chest: chest, number: 0, isOwned: true); + safe ??= getCurrentSafe; + final defaultWallet = Durt.instance.walletService.safeBox.get(safe)!.defaultAddress; + if (defaultWallet == null) return WalletData(address: '', safeBoxNumber: safe, number: 0, isOwned: true); + return getWalletDataByAddress(defaultWallet) ?? WalletData(address: '', safeBoxNumber: safe, number: 0, isOwned: true); } } @@ -122,12 +118,12 @@ class MyWalletsProvider with ChangeNotifier { final answer = await showConfirmationDialog( context: context, - message: 'areYouSureForgetAllChests'.tr(), + message: 'areYouSureForgetAllSafes'.tr(), type: ConfirmationDialogType.warning, ); if (answer) { - await walletBox.clear(); - await chestBox.clear(); + await Durt.instance.walletService.walletDataBox.clear(); + await Durt.instance.walletService.safeBox.clear(); await configBox.delete('defaultWallet'); await sub.deleteAllAccounts(); @@ -156,7 +152,7 @@ class MyWalletsProvider with ChangeNotifier { int newWalletNbr = idList[0]; int newDerivationNbr = number ?? idList[1]; - int? chest = getCurrentChest(); + int? safeNumber = getCurrentSafe; final sub = Provider.of<SubstrateSdk>(context, listen: false); @@ -165,15 +161,15 @@ class MyWalletsProvider with ChangeNotifier { final address = await sub.derive(context, defaultWallet.address, newDerivationNbr, pinCode); WalletData newWallet = WalletData( - chest: chest, + safeBoxNumber: safeNumber, address: address, number: newWalletNbr, name: name, derivation: newDerivationNbr, - imageDefaultPath: '${newWalletNbr % 4}.png', + imagePath: '${newWalletNbr % 4}.png', isOwned: true); - await walletBox.put(newWallet.address, newWallet); + await Durt.instance.walletService.walletDataBox.put(newWallet.address, newWallet); await readAllWallets(); isNewDerivationLoading = false; @@ -186,17 +182,17 @@ class MyWalletsProvider with ChangeNotifier { isNewDerivationLoading = true; notifyListeners(); int newWalletNbr; - int? chest = getCurrentChest(); + int? safeNumber = getCurrentSafe; - List<WalletData> walletConfig = await readAllWallets(chest); + List<WalletData> walletConfig = await readAllWallets(safeNumber); walletConfig.sort((p1, p2) { - return Comparable.compare(p1.number!, p2.number!); + return Comparable.compare(p1.number, p2.number); }); if (walletConfig.isEmpty) { newWalletNbr = 0; } else { - newWalletNbr = walletConfig.last.number! + 1; + newWalletNbr = walletConfig.last.number + 1; } final sub = Provider.of<SubstrateSdk>(context, listen: false); @@ -205,19 +201,19 @@ class MyWalletsProvider with ChangeNotifier { final address = await sub.generateRootKeypair(defaultWallet.address, pinCode); WalletData newWallet = WalletData( - chest: chest, address: address, number: newWalletNbr, name: name, derivation: -1, imageDefaultPath: '${newWalletNbr % 4}.png', isOwned: true); + safeBoxNumber: safeNumber, address: address, number: newWalletNbr, name: name, derivation: -1, imagePath: '${newWalletNbr % 4}.png', isOwned: true); - await walletBox.put(newWallet.address, newWallet); + await Durt.instance.walletService.walletDataBox.put(newWallet.address, newWallet); await readAllWallets(); isNewDerivationLoading = false; notifyListeners(); } - Future<List<int>> getNextWalletNumberAndDerivation({int? chestNumber}) async { - chestNumber ??= getCurrentChest(); + Future<List<int>> getNextWalletNumberAndDerivation({int? safeNumber}) async { + safeNumber ??= getCurrentSafe; - listWallets.sort((p1, p2) => p1.number!.compareTo(p2.number!)); + listWallets.sort((p1, p2) => p1.number.compareTo(p2.number)); if (listWallets.isEmpty) { return [0, 0]; @@ -227,7 +223,7 @@ class MyWalletsProvider with ChangeNotifier { final newDerivationNbr = maxDerivation == -1 ? 0 : maxDerivation + 1; - final newWalletNbr = listWallets.last.number! + 1; + final newWalletNbr = listWallets.last.number + 1; return [newWalletNbr, newDerivationNbr]; } diff --git a/lib/providers/substrate_sdk.dart b/lib/providers/substrate_sdk.dart index 701cb10a..ae469e97 100644 --- a/lib/providers/substrate_sdk.dart +++ b/lib/providers/substrate_sdk.dart @@ -1,18 +1,17 @@ // ignore_for_file: use_build_context_synchronously import 'dart:convert'; +import 'package:durt2/durt2.dart' show IdtyStatus; import 'package:easy_localization/easy_localization.dart'; import 'package:fast_base58/fast_base58.dart'; import 'package:flutter/foundation.dart'; import 'package:flutter/material.dart'; import 'package:gecko/globals.dart'; import 'package:gecko/models/certification_data.dart'; -import 'package:gecko/models/chest_data.dart'; import 'package:gecko/models/membership_status.dart'; import 'package:gecko/models/migrate_wallet_checks.dart'; import 'package:gecko/models/transaction_content.dart'; import 'package:gecko/models/wallet_balance.dart'; -import 'package:gecko/models/wallet_data.dart'; import 'package:gecko/providers/home.dart'; import 'package:gecko/providers/my_wallets.dart'; import 'package:gecko/providers/wallet_options.dart'; @@ -393,7 +392,7 @@ class SubstrateSdk with ChangeNotifier { }) { int totalAmount = 0; - if (firstEligibleUd == 0 || idtyStatus != IdtyStatus.member) return 0; + if (firstEligibleUd == 0 || idtyStatus != IdtyStatus.validated) return 0; for (final List reval in pastReevals.reversed) { final int udIndex = _convertToInt(reval[0]); @@ -442,7 +441,7 @@ class SubstrateSdk with ChangeNotifier { } else if (nextIssuableOn > blocNumber) { final certDelayDuration = (nextIssuableOn - blocNumber) * 6; return CertState(status: CertStatus.mustWaitBeforeCert, duration: Duration(seconds: certDelayDuration)); - } else if (toStatus == IdtyStatus.unconfirmed) { + } else if (toStatus == IdtyStatus.created) { return CertState(status: CertStatus.mustConfirmIdentity); } else { return CertState(status: CertStatus.canCert); @@ -482,10 +481,10 @@ class SubstrateSdk with ChangeNotifier { final mapStatus = { null: IdtyStatus.none, - 'Unconfirmed': IdtyStatus.unconfirmed, - 'Unvalidated': IdtyStatus.unvalidated, - 'Member': IdtyStatus.member, - 'NotMember': IdtyStatus.notMember, + 'Unconfirmed': IdtyStatus.created, + 'Unvalidated': IdtyStatus.confirmed, + 'Member': IdtyStatus.validated, + 'NotMember': IdtyStatus.expired, 'Revoked': IdtyStatus.revoked, 'unknown': IdtyStatus.unknown, }; @@ -767,7 +766,7 @@ class SubstrateSdk with ChangeNotifier { nodeConnected = false; notifyListeners(); homeProvider.changeMessage("noDuniterEndointAvailable".tr()); - if (!myWalletProvider.isWalletsExists()) snackNode(false); + if (!myWalletProvider.isWalletsExists) snackNode(false); } log.i('Connected to node: ${sdk.api.connectedNode?.endpoint}'); @@ -900,20 +899,20 @@ class SubstrateSdk with ChangeNotifier { } @Deprecated('Use Durt 2 instead') - Future<String> setCurrentWallet(WalletData wallet) async { - final currentChestNumber = configBox.get('currentChest'); - ChestData newChestData = chestBox.get(currentChestNumber)!; - newChestData.defaultWallet = wallet.number; - await chestBox.put(currentChestNumber, newChestData); - - try { - final acc = getKeypair(wallet.address); - keyring.setCurrent(acc); - return acc.address!; - } catch (e) { - return (e.toString()); - } - } + // Future<String> setCurrentWallet(WalletData wallet) async { + // final currentChestNumber = configBox.get('currentChest'); + // ChestData newChestData = chestBox.get(currentChestNumber)!; + // newChestData.defaultWallet = wallet.number; + // await chestBox.put(currentChestNumber, newChestData); + + // try { + // final acc = getKeypair(wallet.address); + // keyring.setCurrent(acc); + // return acc.address!; + // } catch (e) { + // return (e.toString()); + // } + // } @Deprecated('Use Durt 2 instead') KeyPairData getCurrentKeyPair() { @@ -1112,7 +1111,7 @@ class SubstrateSdk with ChangeNotifier { final toIndex = await _getIdentityIndexOf(destAddress); - if (myIdtyStatus != IdtyStatus.member) { + if (myIdtyStatus != IdtyStatus.validated) { return 'notMember'; } @@ -1134,8 +1133,8 @@ class SubstrateSdk with ChangeNotifier { sender, ); txOptions = [destAddress]; - } else if (toIdtyStatus == IdtyStatus.member || toIdtyStatus == IdtyStatus.unvalidated) { - if (toCerts.receivedCount >= currencyParameters['minCertForMembership']! - 1 && toIdtyStatus != IdtyStatus.member) { + } else if (toIdtyStatus == IdtyStatus.validated || toIdtyStatus == IdtyStatus.confirmed) { + if (toCerts.receivedCount >= currencyParameters['minCertForMembership']! - 1 && toIdtyStatus != IdtyStatus.validated) { log.d('Batch cert and membership validation'); txInfo = TxInfoData( 'utility', @@ -1411,7 +1410,7 @@ newKeySig: $newKeySigType"""); final Map<String, dynamic> expireOnMap = await _getStorage('membership.membership($idtyIndex)') ?? {}; - if (expireOnMap.isEmpty && idtyStatus == IdtyStatus.notMember) { + if (expireOnMap.isEmpty && idtyStatus == IdtyStatus.confirmed) { return MembershipStatus( expireDate: null, hasPendingRenewal: hasPendingRenewal, diff --git a/lib/providers/wallet_options.dart b/lib/providers/wallet_options.dart index 5fa7fbe7..93710aca 100644 --- a/lib/providers/wallet_options.dart +++ b/lib/providers/wallet_options.dart @@ -1,6 +1,7 @@ // ignore_for_file: use_build_context_synchronously import 'dart:io'; +import 'package:durt2/durt2.dart' show Durt, WalletData; import 'package:easy_localization/easy_localization.dart'; import 'package:flutter/material.dart'; import 'package:flutter/services.dart'; @@ -9,7 +10,6 @@ import 'package:gecko/globals.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/models/wallet_data.dart'; import 'package:gecko/providers/substrate_sdk.dart'; import 'package:gecko/providers/v2s_datapod.dart'; import 'package:gecko/utils.dart'; @@ -36,12 +36,12 @@ class WalletOptionsProvider with ChangeNotifier { return pinLength; } - void _renameWallet(List<int?> walletID, String newName, {required bool isCesium}) async { + void _renameWallet(String address, String newName, {required bool isCesium}) async { MyWalletsProvider myWalletClass = MyWalletsProvider(); - WalletData walletTarget = myWalletClass.getWalletDataById(walletID)!; + WalletData walletTarget = myWalletClass.getWalletDataByAddress(address)!; walletTarget.name = newName; - await walletBox.put(walletTarget.key, walletTarget); + await Durt.instance.walletService.walletDataBox.put(walletTarget.address, walletTarget); _newWalletName.text = ''; } @@ -71,9 +71,9 @@ class WalletOptionsProvider with ChangeNotifier { ); } - await walletBox.delete(wallet.address); - if (wallet.imageCustomPath != null) { - final avatarFile = File(wallet.imageCustomPath!); + await Durt.instance.walletService.walletDataBox.delete(wallet.address); + if (wallet.imagePath != null) { + final avatarFile = File(wallet.imagePath!); if (await avatarFile.exists()) { await avatarFile.delete(); } @@ -134,15 +134,14 @@ class WalletOptionsProvider with ChangeNotifier { final walletData = MyWalletsProvider().getWalletDataByAddress(address.text); - if (walletData!.imageCustomPath != null) { - final avatarFile = File(walletData.imageCustomPath!); + if (walletData!.imagePath != null) { + final avatarFile = File(walletData.imagePath!); await avatarFile.delete(); } - walletData.profileUpdatedTime = DateTime.now(); - walletData.imageCustomPath = newPath; + walletData.imagePath = newPath; - await walletBox.put(address.text, walletData); + await Durt.instance.walletService.walletDataBox.put(address.text, walletData); notifyListeners(); datapod.setAvatar(address.text, newPath); @@ -219,7 +218,7 @@ class WalletOptionsProvider with ChangeNotifier { if (!await myWalletProvider.askPinCode()) return; final wallet = myWalletProvider.getWalletDataByAddress(address.text); - await sub.setCurrentWallet(wallet!); + await Durt.instance.walletService.setDefaultAddress(wallet!.address); final transactionId = await sub.confirmIdentity(walletOptions.address.text, idtyName.text, myWalletProvider.pinCode); Navigator.pop(context); @@ -251,7 +250,7 @@ class WalletOptionsProvider with ChangeNotifier { ); } - Future<String?> editWalletName(BuildContext context, List<int?> wID) async { + Future<String?> editWalletName(BuildContext context, String address) async { final walletName = TextEditingController(); canValidateNameBool = false; @@ -296,7 +295,7 @@ class WalletOptionsProvider with ChangeNotifier { onPressed: () async { if (canValidateNameBool) { nameController.text = walletName.text; - _renameWallet(wID, walletName.text, isCesium: false); + _renameWallet(address, walletName.text, isCesium: false); notifyListeners(); Navigator.pop(context); } diff --git a/lib/screens/home.dart b/lib/screens/home.dart index 4e0fa3b1..716022a2 100644 --- a/lib/screens/home.dart +++ b/lib/screens/home.dart @@ -1,134 +1,58 @@ -import 'package:connectivity_plus/connectivity_plus.dart'; import 'package:easy_localization/easy_localization.dart'; import 'package:gecko/globals.dart'; -import 'package:gecko/models/chest_data.dart'; -import 'package:gecko/models/g1_wallets_list.dart'; import 'package:gecko/models/scale_functions.dart'; import 'package:gecko/models/widgets_keys.dart'; import 'package:gecko/providers/chest_provider.dart'; -import 'package:gecko/providers/duniter_indexer.dart'; import 'package:gecko/providers/home.dart'; -import 'package:gecko/providers/substrate_sdk.dart'; import 'package:flutter/material.dart'; import 'package:gecko/providers/my_wallets.dart'; -import 'package:gecko/models/wallet_data.dart'; -import 'package:gecko/providers/v2s_datapod.dart'; -import 'package:gecko/services/durt.service.dart'; import 'package:gecko/widgets/bubble_speak.dart'; import 'package:gecko/widgets/buttons/home_settings_button.dart'; import 'package:gecko/widgets/commons/animated_text.dart'; -import 'package:gecko/widgets/commons/common_elements.dart'; import 'package:gecko/screens/myWallets/restore_chest.dart'; import 'package:gecko/screens/onBoarding/1.dart'; +import 'package:gecko/widgets/commons/loading.dart'; import 'package:gecko/widgets/drawer.dart'; import 'package:gecko/widgets/buttons/home_buttons.dart'; -import 'package:get_it/get_it.dart'; -import 'package:hive_flutter/hive_flutter.dart'; import 'package:provider/provider.dart'; -class HomeScreen extends StatefulWidget { +class HomeScreen extends StatelessWidget { const HomeScreen({super.key}); - @override - State<HomeScreen> createState() => _HomeScreenState(); -} - -class _HomeScreenState extends State<HomeScreen> { - @override - void initState() { - WidgetsBinding.instance.addPostFrameCallback((_) async { - final homeProvider = Provider.of<HomeProvider>(context, listen: false); - final sub = Provider.of<SubstrateSdk>(context, listen: false); - final duniterIndexer = Provider.of<DuniterIndexer>(context, listen: false); - final myWalletProvider = Provider.of<MyWalletsProvider>(context, listen: false); - final datapod = Provider.of<V2sDatapodProvider>(context, listen: false); - - // Init durt 2 - await GetIt.I.get<DurtService>().init(); - - final bool isWalletsExists = myWalletProvider.isWalletsExists(); - - // Check if versionData non compatible, drop everything - if (configBox.get('dataVersion') == null) { - configBox.put('dataVersion', dataVersion); - } - if (isWalletsExists && (configBox.get('dataVersion')) < dataVersion) { - if (!sub.sdkReady && !sub.sdkLoading) sub.initApi(); - // ignore: use_build_context_synchronously - await infoPopup(context, "chestNotCompatibleMustReinstallGecko".tr()); - await Hive.deleteBoxFromDisk('walletBox'); - await Hive.deleteBoxFromDisk('chestBox'); - await datapod.deleteAvatarsDirectory(); - await avatarsDirectory.create(); - chestBox = await Hive.openBox<ChestData>("chestBox"); - await configBox.delete('defaultWallet'); - if (!sub.sdkReady && !sub.sdkLoading) await sub.initApi(); - await sub.deleteAllAccounts(); - configBox.put('dataVersion', dataVersion); - myWalletProvider.reload(); - } else { - if (!sub.sdkReady && !sub.sdkLoading) await sub.initApi(); - } - - if (sub.sdkReady && !sub.nodeConnected) { - walletBox = await Hive.openBox<WalletData>("walletBox"); - await Hive.deleteBoxFromDisk('g1WalletsBox'); - await datapod.deleteAvatarsCacheDirectory(); - await avatarsCacheDirectory.create(); - g1WalletsBox = await Hive.openBox<G1WalletsList>("g1WalletsBox"); - contactsBox = await Hive.openBox<G1WalletsList>("contactsBox"); - - homeProvider.isWalletBoxInit = true; - myWalletProvider.reload(); - - await homeProvider.getValidEndpoints(); - if (configBox.get('isCacheChecked') == null) { - configBox.put('isCacheChecked', false); - } - - Future<void> updateConnectionStatus(List<ConnectivityResult> result) async { - log.i('Network changed: $result'); - if (result.contains(ConnectivityResult.none)) { - sub.nodeConnected = false; - await sub.sdk.api.setting.unsubscribeBestNumber(); - homeProvider.changeMessage("notConnectedToInternet".tr()); - sub.reload(); - } else { - // Check if the phone is actually connected to the internet - var connectivityResult = await (Connectivity().checkConnectivity()); - if (!connectivityResult.contains(ConnectivityResult.none)) { - await sub.connectNode(); - - // Load wallets list - myWalletProvider.readAllWallets(myWalletProvider.getCurrentChest()); - - //Connect to Indexer - await duniterIndexer.getValidIndexerEndpoint(); - } - } - } - - Connectivity().onConnectivityChanged.listen(updateConnectionStatus); - } - }); - super.initState(); - } - @override Widget build(BuildContext context) { homeContext = context; + final homeProvider = Provider.of<HomeProvider>(context); + + return FutureBuilder( + future: homeProvider.initHome(context), + builder: (context, snapshot) { + if (snapshot.connectionState != ConnectionState.done) { + return Scaffold( + body: Center(child: const Loading(size: 50)), + ); + } - final myWalletProvider = Provider.of<MyWalletsProvider>(context); - Provider.of<ChestProvider>(context); - final isWalletsExists = myWalletProvider.isWalletsExists(); + if (snapshot.hasError) { + return Center( + child: Scaffold( + body: Center( + child: Text(snapshot.error.toString()), + ), + )); + } - isTall = (MediaQuery.of(context).size.height / MediaQuery.of(context).size.width) > 1.75; + final myWalletProvider = Provider.of<MyWalletsProvider>(context); + Provider.of<ChestProvider>(context); + final isWalletsExists = myWalletProvider.isWalletsExists; - return Scaffold( - resizeToAvoidBottomInset: false, - drawer: MainDrawer(isWalletsExists: isWalletsExists), - backgroundColor: yellowC, - body: isWalletsExists ? geckHome(context) : welcomeHome(context)); + isTall = (MediaQuery.of(context).size.height / MediaQuery.of(context).size.width) > 1.75; + return Scaffold( + resizeToAvoidBottomInset: false, + drawer: MainDrawer(isWalletsExists: isWalletsExists), + backgroundColor: yellowC, + body: isWalletsExists ? geckHome(context) : welcomeHome(context)); + }); } } diff --git a/lib/screens/myWallets/chest_options.dart b/lib/screens/myWallets/chest_options.dart index 3645fca6..c340a91b 100644 --- a/lib/screens/myWallets/chest_options.dart +++ b/lib/screens/myWallets/chest_options.dart @@ -1,5 +1,6 @@ // ignore_for_file: use_build_context_synchronously +import 'package:durt2/durt2.dart' show Durt; import 'package:easy_localization/easy_localization.dart'; import 'package:flutter/material.dart'; import 'package:gecko/globals.dart'; @@ -21,12 +22,12 @@ class ChestOptions extends StatelessWidget { @override Widget build(BuildContext context) { - final currentChest = chestBox.get(configBox.get('currentChest'))!; + final currentSafe = Durt.instance.walletService.defaultSafeBox; return Scaffold( backgroundColor: backgroundColor, resizeToAvoidBottomInset: false, - appBar: GeckoAppBar(currentChest.name!), + appBar: GeckoAppBar(currentSafe.name), bottomNavigationBar: const GeckoBottomAppBar(), body: Stack(children: [ Builder( @@ -55,7 +56,7 @@ class ChestOptionsContent extends StatelessWidget { Widget build(BuildContext context) { final chestProvider = Provider.of<ChestProvider>(context, listen: false); final myWalletProvider = Provider.of<MyWalletsProvider>(context, listen: false); - final currentChest = chestBox.get(configBox.get('currentChest'))!; + final currentChest = Durt.instance.walletService.defaultSafeBox; final isAlone = myWalletProvider.listWallets.length == 1; return Column( diff --git a/lib/screens/myWallets/choose_chest.dart b/lib/screens/myWallets/choose_chest.dart index fa1b7d9b..d0e1fab3 100644 --- a/lib/screens/myWallets/choose_chest.dart +++ b/lib/screens/myWallets/choose_chest.dart @@ -1,5 +1,8 @@ // ignore_for_file: use_build_context_synchronously +import 'dart:io'; + +import 'package:durt2/durt2.dart' show Durt; import 'package:easy_localization/easy_localization.dart'; import 'package:gecko/globals.dart'; import 'package:gecko/models/scale_functions.dart'; @@ -23,7 +26,7 @@ class ChooseChest extends StatefulWidget { class _ChooseChestState extends State<ChooseChest> { final tplController = TextEditingController(); final buttonCarouselController = CarouselSliderController(); - int? currentChest = configBox.get('currentChest'); + int currentChest = Durt.instance.walletService.defaultSafeBoxNumber; @override Widget build(BuildContext context) { @@ -31,8 +34,7 @@ class _ChooseChestState extends State<ChooseChest> { return Scaffold( backgroundColor: backgroundColor, - appBar: AppBar( - toolbarHeight: scaleSize(57), title: Text('selectMyChest'.tr())), + appBar: AppBar(toolbarHeight: scaleSize(57), title: Text('selectMyChest'.tr())), body: SafeArea( child: Column(children: <Widget>[ const SizedBox(height: 160), @@ -41,30 +43,30 @@ class _ChooseChestState extends State<ChooseChest> { options: CarouselOptions( height: 210, onPageChanged: (index, reason) { - currentChest = chestBox.toMap().keys.toList()[index]; + currentChest = Durt.instance.walletService.safeBox.toMap().keys.toList()[index]; setState(() {}); }, enableInfiniteScroll: false, - initialPage: currentChest!, + initialPage: currentChest, enlargeCenterPage: true, viewportFraction: 0.5, ), - items: chestBox.toMap().entries.map((i) { + items: Durt.instance.walletService.safeBox.toMap().entries.map((i) { return Builder( builder: (BuildContext context) { return Column(children: <Widget>[ - i.value.imageFile == null + i.value.imagePath == null ? Image.asset( - 'assets/chests/${i.value.imageName}', + 'assets/chests/${i.value.number}.png', height: 150, ) : Image.file( - i.value.imageFile!, + File(i.value.imagePath!), height: 150, ), const SizedBox(height: 30), Text( - i.value.name!, + i.value.name, style: const TextStyle(fontSize: 20), ), ]); @@ -72,23 +74,19 @@ class _ChooseChestState extends State<ChooseChest> { ); }).toList(), ), - if (chestBox.values.toList().length > 1) + if (Durt.instance.walletService.safeBox.values.toList().length > 1) Row( mainAxisAlignment: MainAxisAlignment.center, - children: chestBox.toMap().entries.map((entry) { + children: Durt.instance.walletService.safeBox.values.toList().map((entry) { return GestureDetector( - onTap: () => - buttonCarouselController.animateToPage(entry.key), + onTap: () => buttonCarouselController.animateToPage(entry.key), child: Container( width: 12.0, height: 12.0, - margin: const EdgeInsets.symmetric( - vertical: 8.0, horizontal: 4.0), + margin: const EdgeInsets.symmetric(vertical: 8.0, horizontal: 4.0), decoration: BoxDecoration( shape: BoxShape.circle, - color: (Theme.of(context).brightness == Brightness.dark - ? Colors.white - : Colors.black) + color: (Theme.of(context).brightness == Brightness.dark ? Colors.white : Colors.black) .withValues(alpha: currentChest == entry.key ? 0.9 : 0.4)), ), ); @@ -116,10 +114,7 @@ class _ChooseChestState extends State<ChooseChest> { }, child: Text( 'openThisChest'.tr(), - style: const TextStyle( - fontSize: 21, - color: backgroundColor, - fontWeight: FontWeight.w600), + style: const TextStyle(fontSize: 21, color: backgroundColor, fontWeight: FontWeight.w600), ), ), ), @@ -140,12 +135,7 @@ class _ChooseChestState extends State<ChooseChest> { child: SizedBox( width: 400, height: 50, - child: Center( - child: Text('createChest'.tr(), - style: const TextStyle( - fontSize: 21, - color: orangeC, - fontWeight: FontWeight.w600))), + child: Center(child: Text('createChest'.tr(), style: const TextStyle(fontSize: 21, color: orangeC, fontWeight: FontWeight.w600))), ), ), ), @@ -163,12 +153,7 @@ class _ChooseChestState extends State<ChooseChest> { child: SizedBox( width: 400, height: 50, - child: Center( - child: Text('importChest'.tr(), - style: const TextStyle( - fontSize: 21, - color: orangeC, - fontWeight: FontWeight.w600))), + child: Center(child: Text('importChest'.tr(), style: const TextStyle(fontSize: 21, color: orangeC, fontWeight: FontWeight.w600))), )), const SizedBox(height: 20), ]), diff --git a/lib/screens/myWallets/confirm_change_pin.dart b/lib/screens/myWallets/confirm_change_pin.dart index 8ae690a2..88a57d94 100644 --- a/lib/screens/myWallets/confirm_change_pin.dart +++ b/lib/screens/myWallets/confirm_change_pin.dart @@ -136,7 +136,7 @@ class _ConfirmChangePinScreenState extends State<ConfirmChangePinScreen> { widget.walletProvider.pinCode = pin; // Recharger les wallets avec le nouveau PIN - final currentChest = widget.walletProvider.getCurrentChest(); + final currentChest = widget.walletProvider.getCurrentSafe; await widget.walletProvider.readAllWallets(currentChest); widget.walletProvider.reload(); diff --git a/lib/screens/myWallets/custom_derivations.dart b/lib/screens/myWallets/custom_derivations.dart index d97e94eb..9d60927d 100644 --- a/lib/screens/myWallets/custom_derivations.dart +++ b/lib/screens/myWallets/custom_derivations.dart @@ -1,10 +1,10 @@ // ignore_for_file: use_build_context_synchronously +import 'package:durt2/durt2.dart' show WalletData; import 'package:easy_localization/easy_localization.dart'; import 'package:gecko/globals.dart'; import 'package:flutter/material.dart'; import 'package:gecko/models/scale_functions.dart'; -import 'package:gecko/models/wallet_data.dart'; import 'package:gecko/providers/my_wallets.dart'; import 'package:gecko/widgets/commons/top_appbar.dart'; import 'package:provider/provider.dart'; @@ -117,7 +117,7 @@ class _CustomDerivationState extends State<CustomDerivation> { ), onPressed: () async { if (!await myWalletProvider.askPinCode()) return; - String newDerivationName = '${'wallet'.tr()} ${myWalletProvider.listWallets.last.number! + 2}'; + String newDerivationName = '${'wallet'.tr()} ${myWalletProvider.listWallets.last.number + 2}'; if (dropdownValue == 'root') { await myWalletProvider.generateRootWallet(context, 'rootWallet'.tr()); } else { diff --git a/lib/screens/myWallets/import_g1_v1.dart b/lib/screens/myWallets/import_g1_v1.dart index 98e5ff8c..0704ba6c 100644 --- a/lib/screens/myWallets/import_g1_v1.dart +++ b/lib/screens/myWallets/import_g1_v1.dart @@ -1,13 +1,13 @@ // ignore_for_file: use_build_context_synchronously import 'dart:async'; +import 'package:durt2/durt2.dart' show IdtyStatus, WalletData; import 'package:easy_localization/easy_localization.dart'; import 'package:flutter/services.dart'; import 'package:gecko/globals.dart'; import 'package:flutter/material.dart'; import 'package:gecko/models/migrate_wallet_checks.dart'; import 'package:gecko/models/scale_functions.dart'; -import 'package:gecko/models/wallet_data.dart'; import 'package:gecko/models/widgets_keys.dart'; import 'package:gecko/providers/my_wallets.dart'; import 'package:gecko/providers/substrate_sdk.dart'; diff --git a/lib/screens/myWallets/manage_membership.dart b/lib/screens/myWallets/manage_membership.dart index e60898b9..064118ac 100644 --- a/lib/screens/myWallets/manage_membership.dart +++ b/lib/screens/myWallets/manage_membership.dart @@ -1,10 +1,10 @@ // ignore_for_file: use_build_context_synchronously +import 'package:durt2/durt2.dart' show IdtyStatus; import 'package:easy_localization/easy_localization.dart'; import 'package:gecko/globals.dart'; import 'package:flutter/material.dart'; import 'package:gecko/models/scale_functions.dart'; -import 'package:gecko/models/wallet_data.dart'; import 'package:gecko/models/widgets_keys.dart'; import 'package:gecko/providers/my_wallets.dart'; import 'package:gecko/providers/substrate_sdk.dart'; @@ -196,7 +196,7 @@ class ManageMembership extends StatelessWidget { status, sub.currencyParameters['membershipRenewalPeriod']!, ); - if (info.expireDate == null && status.idtyStatus != IdtyStatus.notMember) return const SizedBox.shrink(); + if (info.expireDate == null && status.idtyStatus != IdtyStatus.expired) return const SizedBox.shrink(); return Container( height: scaleSize(64), diff --git a/lib/screens/myWallets/show_seed.dart b/lib/screens/myWallets/show_seed.dart index 78bcac40..15f50526 100644 --- a/lib/screens/myWallets/show_seed.dart +++ b/lib/screens/myWallets/show_seed.dart @@ -1,9 +1,9 @@ +import 'package:durt2/durt2.dart' show WalletData; import 'package:easy_localization/easy_localization.dart'; import 'package:flutter/services.dart'; import 'package:gecko/globals.dart'; import 'package:flutter/material.dart'; import 'package:gecko/models/scale_functions.dart'; -import 'package:gecko/models/wallet_data.dart'; import 'package:gecko/models/widgets_keys.dart'; import 'package:gecko/providers/my_wallets.dart'; import 'package:gecko/providers/substrate_sdk.dart'; diff --git a/lib/screens/myWallets/unlocking_wallet.dart b/lib/screens/myWallets/unlocking_wallet.dart index a10337c0..426edc89 100644 --- a/lib/screens/myWallets/unlocking_wallet.dart +++ b/lib/screens/myWallets/unlocking_wallet.dart @@ -1,13 +1,13 @@ import 'dart:async'; +import 'dart:io'; +import 'package:durt2/durt2.dart' show Durt, SafeBox, WalletData; import 'package:easy_localization/easy_localization.dart'; import 'package:flutter/foundation.dart'; import 'package:flutter/services.dart'; -import 'package:gecko/models/chest_data.dart'; import 'package:gecko/models/scale_functions.dart'; import 'package:gecko/models/widgets_keys.dart'; import 'package:gecko/providers/substrate_sdk.dart'; import 'package:gecko/providers/my_wallets.dart'; -import 'package:gecko/models/wallet_data.dart'; import 'package:gecko/providers/wallet_options.dart'; import 'package:flutter/material.dart'; import 'package:pin_code_fields/pin_code_fields.dart'; @@ -23,8 +23,8 @@ class UnlockingWallet extends StatefulWidget { } class _UnlockingWalletState extends State<UnlockingWallet> { - late int currentChestNumber; - late ChestData currentChest; + late int currentSafeNumber; + late SafeBox currentSafe; bool canUnlock = true; late final TextEditingController enterPin; late final FocusNode pinFocus; @@ -36,8 +36,8 @@ class _UnlockingWalletState extends State<UnlockingWallet> { super.initState(); pinFocus = FocusNode(debugLabel: 'pinFocusNode'); enterPin = TextEditingController(); - currentChestNumber = configBox.get('currentChest'); - currentChest = chestBox.get(currentChestNumber)!; + currentSafeNumber = Durt.instance.walletService.defaultSafeBoxNumber; + currentSafe = Durt.instance.walletService.safeBox.get(currentSafeNumber)!; } @override @@ -79,19 +79,19 @@ class _UnlockingWalletState extends State<UnlockingWallet> { Row( mainAxisAlignment: MainAxisAlignment.center, children: <Widget>[ - currentChest.imageFile == null + currentSafe.imagePath == null ? Image.asset( - 'assets/chests/${currentChest.imageName}', + 'assets/chests/${currentSafe.number}.png', width: scaleSize(isTall ? 95 : 75), ) : Image.file( - currentChest.imageFile!, + File(currentSafe.imagePath!), width: scaleSize(isTall ? 127 : 95), ), ScaledSizedBox(width: 18), Flexible( child: Text( - currentChest.name!, + currentSafe.name, textAlign: TextAlign.center, style: scaledTextStyle( fontSize: isTall ? 24 : 20, diff --git a/lib/screens/myWallets/wallet_options.dart b/lib/screens/myWallets/wallet_options.dart index 3b708d5a..957a02c6 100644 --- a/lib/screens/myWallets/wallet_options.dart +++ b/lib/screens/myWallets/wallet_options.dart @@ -2,6 +2,7 @@ import 'dart:async'; import 'dart:io'; +import 'package:durt2/durt2.dart' show Durt, IdtyStatus, WalletData; import 'package:easy_localization/easy_localization.dart'; import 'package:flutter/material.dart'; import 'package:flutter_svg/svg.dart'; @@ -11,7 +12,6 @@ import 'package:gecko/models/scale_functions.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/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'; @@ -41,13 +41,13 @@ class WalletOptions extends StatelessWidget { walletOptions.address.text = wallet.address; - final currentChest = myWalletProvider.getCurrentChest(); + final currentChest = myWalletProvider.getCurrentSafe; final isWalletNameIndexed = duniterIndexer.walletNameIndexer[walletOptions.address.text] != null; final isAlone = myWalletProvider.listWallets.length == 1; final defaultWallet = myWalletProvider.getDefaultWallet(); - walletOptions.isDefaultWallet = (defaultWallet.number == wallet.id[1]); + walletOptions.isDefaultWallet = defaultWallet.address == wallet.address; return PopScope( onPopInvokedWithResult: (_, __) { @@ -66,8 +66,8 @@ class WalletOptions extends StatelessWidget { children: [ WalletHeader( address: wallet.address, - customImagePath: wallet.imageCustomPath, - defaultImagePath: wallet.imageDefaultPath, + customImagePath: wallet.imagePath, + defaultImagePath: wallet.imagePath, ), // Corps avec les options Expanded( @@ -92,7 +92,7 @@ class WalletOptions extends StatelessWidget { InkWell( key: keyRenameWallet, onTap: () async { - await walletProvider.editWalletName(context, [wallet.id[0], wallet.id[1]]); + await walletProvider.editWalletName(context, wallet.address); }, child: Container( padding: EdgeInsets.symmetric(horizontal: scaleSize(17), vertical: scaleSize(12)), @@ -168,13 +168,13 @@ class WalletOptions extends StatelessWidget { ], ), child: ClipOval( - child: wallet.imageCustomPath == null || wallet.imageCustomPath == '' + child: wallet.imagePath == null || wallet.imagePath == '' ? Image.asset( - 'assets/avatars/${wallet.imageDefaultPath}', + 'assets/avatars/${wallet.number}.png', fit: BoxFit.cover, ) : Image.file( - File(wallet.imageCustomPath!), + File(wallet.imagePath!), fit: BoxFit.cover, ), ), @@ -190,7 +190,7 @@ class WalletOptions extends StatelessWidget { ), child: InkWell( onTap: () async { - wallet.imageCustomPath = await walletProvider.changeAvatar(); + wallet.imagePath = await walletProvider.changeAvatar(); walletProvider.reload(); }, child: Icon( @@ -242,11 +242,10 @@ class WalletOptions extends StatelessWidget { } Future setDefaultWallet(BuildContext context, int currentChest) async { - final sub = Provider.of<SubstrateSdk>(context, listen: false); final myWalletProvider = Provider.of<MyWalletsProvider>(context, listen: false); final walletOptions = Provider.of<WalletOptionsProvider>(context, listen: false); - await sub.setCurrentWallet(wallet); + await Durt.instance.walletService.setDefaultWallet(walletOptions.address.text); await myWalletProvider.readAllWallets(currentChest); myWalletProvider.reload(); walletOptions.reload(); @@ -413,7 +412,7 @@ class WalletOptions extends StatelessWidget { initialData: const [IdtyStatus.unknown], builder: (BuildContext context, AsyncSnapshot<List<IdtyStatus>> snapshot) { return Visibility( - visible: snapshot.hasData && !snapshot.hasError && snapshot.data!.first == IdtyStatus.unconfirmed, + visible: snapshot.hasData && !snapshot.hasError && snapshot.data!.first == IdtyStatus.created, child: Column(children: [ ScaledSizedBox(height: 22), SizedBox( @@ -473,7 +472,7 @@ Widget aloneWalletOptions() { onTap: () async { if (!myWalletProvider.isNewDerivationLoading) { if (!await myWalletProvider.askPinCode()) return; - String newDerivationName = '${'wallet'.tr()} ${myWalletProvider.listWallets.last.number! + 2}'; + String newDerivationName = '${'wallet'.tr()} ${myWalletProvider.listWallets.last.number + 2}'; await myWalletProvider.generateNewDerivation(context, newDerivationName); Navigator.pushReplacementNamed(context, '/mywallets'); } diff --git a/lib/screens/myWallets/wallets_home.dart b/lib/screens/myWallets/wallets_home.dart index 882ed481..6a564568 100644 --- a/lib/screens/myWallets/wallets_home.dart +++ b/lib/screens/myWallets/wallets_home.dart @@ -1,8 +1,8 @@ // ignore_for_file: use_build_context_synchronously +import 'package:durt2/durt2.dart' hide Provider; import 'package:easy_localization/easy_localization.dart'; import 'package:gecko/globals.dart'; -import 'package:gecko/models/chest_data.dart'; import 'package:gecko/models/scale_functions.dart'; import 'package:gecko/models/widgets_keys.dart'; import 'package:gecko/providers/my_wallets.dart'; @@ -42,8 +42,8 @@ class _WalletsHomeContent extends StatelessWidget { @override Widget build(BuildContext context) { final myWalletProvider = Provider.of<MyWalletsProvider>(context, listen: false); - final currentChestNumber = myWalletProvider.getCurrentChest(); - final ChestData currentChest = chestBox.get(currentChestNumber)!; + final currentChestNumber = myWalletProvider.getCurrentSafe; + final SafeBox currentChest = Durt.instance.walletService.safeBox.get(currentChestNumber)!; return Scaffold( backgroundColor: backgroundColor, @@ -52,12 +52,12 @@ class _WalletsHomeContent extends StatelessWidget { title: Row( children: [ Image.asset( - 'assets/chests/${currentChest.imageName}', + 'assets/chests/${currentChest.number}.png', height: 32, ), ScaledSizedBox(width: 17), Text( - currentChest.name!, + currentChest.name, style: scaledTextStyle(color: Colors.grey[850], fontSize: 16, fontWeight: FontWeight.w500), ), ], @@ -83,7 +83,7 @@ class _WalletsHomeContent extends StatelessWidget { Widget myWalletsTiles(BuildContext context, int currentChestNumber) { final myWalletProvider = Provider.of<MyWalletsProvider>(context); - final isWalletsExists = myWalletProvider.isWalletsExists(); + final isWalletsExists = myWalletProvider.isWalletsExists; if (!isWalletsExists) { return const Text(''); diff --git a/lib/screens/onBoarding/10.dart b/lib/screens/onBoarding/10.dart index 96f98e2d..576a1df4 100644 --- a/lib/screens/onBoarding/10.dart +++ b/lib/screens/onBoarding/10.dart @@ -1,5 +1,6 @@ // ignore_for_file: file_names, use_build_context_synchronously +import 'package:durt2/durt2.dart' show Durt, WalletData; import 'package:easy_localization/easy_localization.dart'; import 'package:flutter/foundation.dart'; import 'package:flutter/material.dart'; @@ -7,7 +8,6 @@ import 'package:flutter/services.dart'; import 'package:gecko/extensions.dart'; import 'package:gecko/globals.dart'; import 'package:gecko/models/scale_functions.dart'; -import 'package:gecko/models/wallet_data.dart'; import 'package:gecko/models/widgets_keys.dart'; import 'package:gecko/providers/generate_wallets.dart'; import 'package:gecko/providers/my_wallets.dart'; @@ -137,9 +137,8 @@ class _OnboardingStepTenState extends State<OnboardingStepTen> { Widget pinForm(BuildContext context, WalletOptionsProvider walletOptions, int pinLenght, int walletNbr, int derivation) { final myWalletProvider = Provider.of<MyWalletsProvider>(context); final generateWalletProvider = Provider.of<GenerateWalletsProvider>(context); - final sub = Provider.of<SubstrateSdk>(context, listen: false); - final currentChest = myWalletProvider.getCurrentChest(); + final currentChest = myWalletProvider.getCurrentSafe; return Form( key: formKey, @@ -204,7 +203,10 @@ class _OnboardingStepTenState extends State<OnboardingStepTen> { myWalletProvider.isPinLoading = false; myWalletProvider.isPinValid = true; - // await generateWalletProvider.storeHDWChest(context); + //TODO: Use int pincode directly instead of cast + final pinCodeint = int.parse(widget.pinCode); + await Durt.instance.walletService.createSafe(mnemonic: generateWalletProvider.generatedMnemonic!, pinCode: pinCodeint); + ScanDerivationsResult scanStatus = ScanDerivationsResult.none; if (widget.scanDerivation) { scanStatus = await generateWalletProvider.scanDerivations(context, widget.pinCode); @@ -212,19 +214,18 @@ class _OnboardingStepTenState extends State<OnboardingStepTen> { switch (scanStatus) { case ScanDerivationsResult.none: case ScanDerivationsResult.walletNotFound: - final address = await sub.importAccount( - mnemonic: generateWalletProvider.generatedMnemonic!, - password: widget.pinCode, - ); + final walletData = await Durt.instance.walletService.importRootWallet(pinCode: widget.pinCode); + final address = Durt.instance.walletService.getAddress(walletData.address); + WalletData myWallet = WalletData( - chest: configBox.get('currentChest'), - address: address, - number: 0, - derivation: -1, - name: 'currentWallet'.tr(), - imageDefaultPath: '0.png', - isOwned: true); - await walletBox.put(myWallet.address, myWallet); + safeBoxNumber: configBox.get('currentChest'), + address: address, + number: 0, + derivation: -1, + name: 'currentWallet'.tr(), + isOwned: true, + ); + await Durt.instance.walletService.walletDataBox.put(myWallet.address, myWallet); break; case ScanDerivationsResult.timeout: case ScanDerivationsResult.error: @@ -247,7 +248,10 @@ class _OnboardingStepTenState extends State<OnboardingStepTen> { if (defaultWallet == null && myWalletProvider.listWallets.isNotEmpty) { defaultWallet = myWalletProvider.listWallets.first; } - if (defaultWallet != null) await sub.setCurrentWallet(defaultWallet); + if (defaultWallet != null) { + final address = Durt.instance.walletService.getAddress(defaultWallet.address); + await Durt.instance.walletService.setDefaultWallet(address); + } await Navigator.push( context, diff --git a/lib/screens/onBoarding/5.dart b/lib/screens/onBoarding/5.dart index b83780fc..8dfd761e 100644 --- a/lib/screens/onBoarding/5.dart +++ b/lib/screens/onBoarding/5.dart @@ -86,24 +86,24 @@ class _ChooseChestState extends State<OnboardingStepFive> { crossAxisAlignment: CrossAxisAlignment.center, children: <Widget>[ Row(children: <Widget>[ - arrayCell(mnemonicList![0]), - arrayCell(mnemonicList![1]), - arrayCell(mnemonicList![2]), - arrayCell(mnemonicList![3]), + arrayCell(1, mnemonicList![0]), + arrayCell(2, mnemonicList![1]), + arrayCell(3, mnemonicList![2]), + arrayCell(4, mnemonicList![3]), ]), ScaledSizedBox(height: 15), Row(children: <Widget>[ - arrayCell(mnemonicList![4]), - arrayCell(mnemonicList![5]), - arrayCell(mnemonicList![6]), - arrayCell(mnemonicList![7]), + arrayCell(5, mnemonicList![4]), + arrayCell(6, mnemonicList![5]), + arrayCell(7, mnemonicList![6]), + arrayCell(8, mnemonicList![7]), ]), ScaledSizedBox(height: 15), Row(children: <Widget>[ - arrayCell(mnemonicList![8]), - arrayCell(mnemonicList![9]), - arrayCell(mnemonicList![10]), - arrayCell(mnemonicList![11]), + arrayCell(9, mnemonicList![8]), + arrayCell(10, mnemonicList![9]), + arrayCell(11, mnemonicList![10]), + arrayCell(12, mnemonicList![11]), ]), ], ), @@ -122,17 +122,17 @@ class _ChooseChestState extends State<OnboardingStepFive> { ); } - Widget arrayCell(String dataWord) { + Widget arrayCell(int index, String dataWord) { return ScaledSizedBox( width: 82, child: Column(children: <Widget>[ Text( - dataWord.split(':')[0], + index.toString(), style: scaledTextStyle(fontSize: 10, color: const Color(0xff6b6b52)), ), Text( - dataWord.split(':')[1], - key: keyMnemonicWord(dataWord.split(':')[0]), + dataWord, + key: keyMnemonicWord(index.toString()), style: scaledTextStyle(fontSize: 15, color: Colors.black), ), ]), diff --git a/lib/screens/wallet_view.dart b/lib/screens/wallet_view.dart index b5cf4f15..74576507 100644 --- a/lib/screens/wallet_view.dart +++ b/lib/screens/wallet_view.dart @@ -1,5 +1,6 @@ // ignore_for_file: use_build_context_synchronously +import 'package:durt2/durt2.dart' show Durt; import 'package:easy_localization/easy_localization.dart'; import 'package:flutter/services.dart'; import 'package:gecko/globals.dart'; @@ -45,12 +46,9 @@ class _WalletViewScreenState extends State<WalletViewScreen> { @override Widget build(BuildContext context) { final walletProfile = Provider.of<WalletsProfilesProvider>(context, listen: false); - final sub = Provider.of<SubstrateSdk>(context, listen: false); - final myWalletProvider = Provider.of<MyWalletsProvider>(context, listen: false); - final defaultWallet = myWalletProvider.getDefaultWallet(); walletProfile.address = address; - sub.setCurrentWallet(defaultWallet); + Durt.instance.walletService.setDefaultWallet(address); return Scaffold( backgroundColor: backgroundColor, diff --git a/lib/services/durt.service.dart b/lib/services/durt.service.dart deleted file mode 100644 index e39aa627..00000000 --- a/lib/services/durt.service.dart +++ /dev/null @@ -1,7 +0,0 @@ -import 'package:durt2/durt2.dart' show Durt, Networks; - -class DurtService { - Future<void> init() async { - await Durt().init(network: Networks.gdev); - } -} diff --git a/lib/services/wallets.service.dart b/lib/services/wallets.service.dart deleted file mode 100644 index 061cdce1..00000000 --- a/lib/services/wallets.service.dart +++ /dev/null @@ -1,53 +0,0 @@ -import 'package:durt2/durt2.dart'; -import 'package:gecko/globals.dart'; - -class WalletsService { - Future<void> createSafe({ - required String mnemonic, - required int pinCode, - }) async { - try { - final keypair = await KeyPair.sr25519.fromMnemonic(mnemonic); - - await WalletService.storeMnemonic( - address: keypair.address, - mnemonic: mnemonic, - pinCode: pinCode, - ); - } catch (e) { - log.e('Invalid mnemonic: $e'); - } - } - - Future<WalletData?> generateNextDerivation({ - required String pinCode, - int? safeBoxNumber, - String? walletName, - bool setAsDefault = false, - }) async { - return await WalletService.generateNextDerivation( - pinCode: pinCode, - safeBoxNumber: safeBoxNumber, - walletName: walletName, - setAsDefault: setAsDefault, - ); - } - - Mnemonic generateMnemonic(Language language) => WalletService.generateMnemonic(language); - - Future<KeyPair?> getKeyPairFromMnemonic(String mnemonic, {int? derivation}) async => - await WalletService.getKeyPairFromMnemonic(mnemonic, derivation: derivation); - - Future<List<WalletData>> importDerivations({ - required String pinCode, - required List<int> derivations, - int? safeBoxNumber, - }) async => - await WalletService.importDerivations(pinCode: pinCode, derivations: derivations, safeBoxNumber: safeBoxNumber); - - Future<WalletData?> importRootWallet({ - required String pinCode, - int? safeBoxNumber, - }) async => - await WalletService.importRootWallet(pinCode: pinCode, safeBoxNumber: safeBoxNumber); -} diff --git a/lib/widgets/buttons/add_new_derivation_button.dart b/lib/widgets/buttons/add_new_derivation_button.dart index 0e621f35..bec9623e 100644 --- a/lib/widgets/buttons/add_new_derivation_button.dart +++ b/lib/widgets/buttons/add_new_derivation_button.dart @@ -17,7 +17,7 @@ class AddNewDerivationButton extends StatelessWidget { Widget build(BuildContext context) { final myWalletProvider = Provider.of<MyWalletsProvider>(context); - String newDerivationName = '${'wallet'.tr()} ${myWalletProvider.listWallets.last.number! + 2}'; + String newDerivationName = '${'wallet'.tr()} ${myWalletProvider.listWallets.last.number + 2}'; return Padding( padding: EdgeInsets.all(scaleSize(11)), child: Container( diff --git a/lib/widgets/buttons/home_buttons.dart b/lib/widgets/buttons/home_buttons.dart index 16826844..85f54eed 100644 --- a/lib/widgets/buttons/home_buttons.dart +++ b/lib/widgets/buttons/home_buttons.dart @@ -1,10 +1,10 @@ // ignore_for_file: use_build_context_synchronously +import 'package:durt2/durt2.dart' show WalletData; import 'package:easy_localization/easy_localization.dart'; import 'package:flutter/material.dart'; import 'package:gecko/globals.dart'; import 'package:gecko/models/scale_functions.dart'; -import 'package:gecko/models/wallet_data.dart'; import 'package:gecko/models/widgets_keys.dart'; import 'package:gecko/providers/home.dart'; import 'package:gecko/providers/my_wallets.dart'; diff --git a/lib/widgets/certify/certify_button.dart b/lib/widgets/certify/certify_button.dart index 17aaffd7..bc9593dc 100644 --- a/lib/widgets/certify/certify_button.dart +++ b/lib/widgets/certify/certify_button.dart @@ -1,5 +1,6 @@ // ignore_for_file: use_build_context_synchronously +import 'package:durt2/durt2.dart' show Durt; import 'package:easy_localization/easy_localization.dart'; import 'package:flutter/material.dart'; import 'package:gecko/globals.dart'; @@ -50,7 +51,7 @@ class CertifyButton extends StatelessWidget { ); if (!result) return; - await sub.setCurrentWallet(myWalletProvider.idtyWallet!); + await Durt.instance.walletService.setDefaultWallet(address); if (myWalletProvider.pinCode == '') { await Navigator.push( diff --git a/lib/widgets/contacts_list.dart b/lib/widgets/contacts_list.dart index caa43a35..d3478d29 100644 --- a/lib/widgets/contacts_list.dart +++ b/lib/widgets/contacts_list.dart @@ -1,9 +1,9 @@ +import 'package:durt2/durt2.dart' show WalletData; import 'package:easy_localization/easy_localization.dart'; import 'package:flutter/material.dart'; import 'package:gecko/globals.dart'; import 'package:gecko/models/g1_wallets_list.dart'; import 'package:gecko/models/scale_functions.dart'; -import 'package:gecko/models/wallet_data.dart'; import 'package:gecko/models/widgets_keys.dart'; import 'package:gecko/providers/duniter_indexer.dart'; import 'package:gecko/providers/wallets_profiles.dart'; diff --git a/lib/widgets/drag_tule_action.dart b/lib/widgets/drag_tule_action.dart index 5fc1e07c..640d3de2 100644 --- a/lib/widgets/drag_tule_action.dart +++ b/lib/widgets/drag_tule_action.dart @@ -1,9 +1,9 @@ // ignore_for_file: use_build_context_synchronously +import 'package:durt2/durt2.dart' show Durt, WalletData; import 'package:flutter/material.dart'; import 'package:gecko/globals.dart'; import 'package:gecko/models/scale_functions.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/widgets/payment_popup.dart'; @@ -44,7 +44,7 @@ class DragTuleAction extends StatelessWidget { child: DragTarget<String>( onAcceptWithDetails: (senderAddress) async { final walletData = myWalletProvider.getWalletDataByAddress(senderAddress.data); - await sub.setCurrentWallet(walletData!); + await Durt.instance.walletService.setDefaultWallet(walletData!.address); sub.reload(); paymentPopup(context, wallet.address, g1WalletsBox.get(wallet.address)!.username ?? wallet.name!); }, diff --git a/lib/widgets/drag_wallets_info.dart b/lib/widgets/drag_wallets_info.dart index c02c288e..e567f258 100644 --- a/lib/widgets/drag_wallets_info.dart +++ b/lib/widgets/drag_wallets_info.dart @@ -1,15 +1,14 @@ +import 'package:durt2/durt2.dart' show WalletData; import 'package:easy_localization/easy_localization.dart'; import 'package:flutter/material.dart'; import 'package:flutter_markdown/flutter_markdown.dart'; import 'package:gecko/globals.dart'; import 'package:gecko/models/scale_functions.dart'; -import 'package:gecko/models/wallet_data.dart'; import 'package:gecko/providers/duniter_indexer.dart'; import 'package:provider/provider.dart'; class DragWalletsInfo extends StatelessWidget { - const DragWalletsInfo( - {super.key, required this.dragAddress, required this.lastFlyBy}); + const DragWalletsInfo({super.key, required this.dragAddress, required this.lastFlyBy}); final WalletData dragAddress; final WalletData lastFlyBy; @@ -22,11 +21,9 @@ class DragWalletsInfo extends StatelessWidget { final screenWidth = MediaQuery.of(homeContext).size.width; - final fromName = duniterIndexer.walletNameIndexer[dragAddress.address] ?? - dragAddress.name; + final fromName = duniterIndexer.walletNameIndexer[dragAddress.address] ?? dragAddress.name; - final toName = - duniterIndexer.walletNameIndexer[lastFlyBy.address] ?? lastFlyBy.name; + final toName = duniterIndexer.walletNameIndexer[lastFlyBy.address] ?? lastFlyBy.name; final mdStyle = MarkdownStyleSheet( p: scaledTextStyle(fontSize: 15, color: Colors.black, letterSpacing: 0.3), textAlign: WrapAlignment.spaceBetween, @@ -44,18 +41,13 @@ class DragWalletsInfo extends StatelessWidget { '${'executeATransfer'.tr()}:', style: scaledTextStyle(fontSize: 15), ), - MarkdownBody( - data: '${'from'.tr(args: [''])} **$fromName**', - styleSheet: mdStyle), + MarkdownBody(data: '${'from'.tr(args: [''])} **$fromName**', styleSheet: mdStyle), if (isSameAddress) Text( 'chooseATargetWallet'.tr(), style: scaledTextStyle(fontSize: 15), ), - if (!isSameAddress) - MarkdownBody( - data: '${'to'.tr(args: [''])} **$toName**', - styleSheet: mdStyle), + if (!isSameAddress) MarkdownBody(data: '${'to'.tr(args: [''])} **$toName**', styleSheet: mdStyle), ], )), ); diff --git a/lib/widgets/idty_status.dart b/lib/widgets/idty_status.dart index a9fda4ba..13233a92 100644 --- a/lib/widgets/idty_status.dart +++ b/lib/widgets/idty_status.dart @@ -1,8 +1,7 @@ +import 'package:durt2/durt2.dart' show Durt, IdtyStatus, WalletData; import 'package:easy_localization/easy_localization.dart'; import 'package:flutter/material.dart'; -import 'package:gecko/globals.dart'; import 'package:gecko/models/scale_functions.dart'; -import 'package:gecko/models/wallet_data.dart'; import 'package:gecko/providers/substrate_sdk.dart'; import 'package:gecko/widgets/commons/animated_text.dart'; import 'package:gecko/widgets/name_by_address.dart'; @@ -15,7 +14,7 @@ class IdentityStatus extends StatelessWidget { @override Widget build(BuildContext context) { - final walletData = walletBox.get(address) ?? WalletData(address: address); + final walletData = Durt.instance.walletService.walletDataBox.get(address) ?? WalletData(address: address); return Consumer<SubstrateSdk>(builder: (context, sub, _) { return FutureBuilder( @@ -25,21 +24,21 @@ class IdentityStatus extends StatelessWidget { if (snapshot.data != null && !snapshot.hasError) { final resStatus = snapshot.data!.first; walletData.identityStatus = resStatus; - walletBox.put(address, walletData); + Durt.instance.walletService.walletDataBox.put(address, walletData); } final resStatus = walletData.identityStatus; - final nameByAddress = resStatus == IdtyStatus.member + final nameByAddress = resStatus == IdtyStatus.validated ? NameByAddress(wallet: walletData, size: 18, color: Colors.black, fontWeight: FontWeight.w500, fontStyle: FontStyle.normal) : NameByAddress(wallet: walletData, size: 16, color: Colors.grey[700]!, fontWeight: FontWeight.w500, fontStyle: FontStyle.italic); final Map<IdtyStatus, String> statusText = { IdtyStatus.none: '', - IdtyStatus.unconfirmed: 'identityCreated'.tr(), - IdtyStatus.unvalidated: 'identityConfirmed'.tr(), - IdtyStatus.member: 'memberValidated'.tr(), - IdtyStatus.notMember: 'identityExpired'.tr(), + IdtyStatus.created: 'identityCreated'.tr(), + IdtyStatus.confirmed: 'identityConfirmed'.tr(), + IdtyStatus.validated: 'memberValidated'.tr(), + IdtyStatus.expired: 'identityExpired'.tr(), IdtyStatus.revoked: 'identityRevoked'.tr(), IdtyStatus.unknown: '' }; @@ -48,7 +47,7 @@ class IdentityStatus extends StatelessWidget { crossAxisAlignment: CrossAxisAlignment.start, children: [ nameByAddress, - showText(statusText[resStatus]!, bold: resStatus == IdtyStatus.member, size: scaleSize(15)), + showText(statusText[resStatus]!, bold: resStatus == IdtyStatus.validated, size: scaleSize(15)), ], ); }); diff --git a/lib/widgets/name_by_address.dart b/lib/widgets/name_by_address.dart index 49ee3ba8..ca2724bc 100644 --- a/lib/widgets/name_by_address.dart +++ b/lib/widgets/name_by_address.dart @@ -1,10 +1,10 @@ +import 'package:durt2/durt2.dart' show WalletData; import 'package:flutter/foundation.dart'; import 'package:flutter/material.dart'; import 'package:gecko/globals.dart'; import 'package:gecko/models/g1_wallets_list.dart'; import 'package:gecko/models/queries_indexer.dart'; import 'package:gecko/models/scale_functions.dart'; -import 'package:gecko/models/wallet_data.dart'; import 'package:gecko/providers/duniter_indexer.dart'; import 'package:gecko/widgets/commons/loading.dart'; import 'package:gecko/widgets/wallet_name.dart'; diff --git a/lib/widgets/payment_popup.dart b/lib/widgets/payment_popup.dart index 7e2cc0a3..7f9370c5 100644 --- a/lib/widgets/payment_popup.dart +++ b/lib/widgets/payment_popup.dart @@ -1,12 +1,12 @@ // ignore_for_file: use_build_context_synchronously +import 'package:durt2/durt2.dart' show Durt, WalletData; import 'package:easy_localization/easy_localization.dart'; import 'package:flutter/material.dart'; import 'package:flutter/services.dart'; import 'package:gecko/globals.dart'; import 'package:gecko/models/scale_functions.dart'; import 'package:gecko/models/text_input_formaters.dart'; -import 'package:gecko/models/wallet_data.dart'; import 'package:gecko/models/widgets_keys.dart'; import 'package:gecko/providers/my_wallets.dart'; import 'package:gecko/providers/substrate_sdk.dart'; @@ -216,7 +216,7 @@ void paymentPopup(BuildContext context, String toAddress, String? username) { }, onChanged: (WalletData? newSelectedWallet) async { defaultWallet = newSelectedWallet!; - await sub.setCurrentWallet(newSelectedWallet); + await Durt.instance.walletService.setDefaultWallet(newSelectedWallet.address); sub.reload(); amountFocus.requestFocus(); setState(() {}); diff --git a/lib/widgets/search_result_list.dart b/lib/widgets/search_result_list.dart index 752e118c..47c9fe2c 100644 --- a/lib/widgets/search_result_list.dart +++ b/lib/widgets/search_result_list.dart @@ -1,7 +1,7 @@ +import 'package:durt2/durt2.dart' show WalletData; import 'package:flutter/material.dart'; import 'package:gecko/models/g1_wallets_list.dart'; import 'package:gecko/models/scale_functions.dart'; -import 'package:gecko/models/wallet_data.dart'; import 'package:gecko/models/widgets_keys.dart'; import 'package:gecko/providers/duniter_indexer.dart'; import 'package:gecko/providers/search.dart'; diff --git a/lib/widgets/wallet_header.dart b/lib/widgets/wallet_header.dart index fafed280..850cec57 100644 --- a/lib/widgets/wallet_header.dart +++ b/lib/widgets/wallet_header.dart @@ -1,11 +1,11 @@ // ignore_for_file: use_build_context_synchronously import 'dart:io'; +import 'package:durt2/durt2.dart' show IdtyStatus; import 'package:flutter/material.dart'; import 'package:flutter/services.dart'; import 'package:gecko/globals.dart'; import 'package:gecko/models/scale_functions.dart'; -import 'package:gecko/models/wallet_data.dart'; import 'package:gecko/models/widgets_keys.dart'; import 'package:gecko/providers/duniter_indexer.dart'; import 'package:gecko/providers/my_wallets.dart'; diff --git a/lib/widgets/wallet_name.dart b/lib/widgets/wallet_name.dart index 735c1fc4..6d9436dc 100644 --- a/lib/widgets/wallet_name.dart +++ b/lib/widgets/wallet_name.dart @@ -1,6 +1,6 @@ +import 'package:durt2/durt2.dart' show WalletData; import 'package:flutter/material.dart'; import 'package:gecko/models/scale_functions.dart'; -import 'package:gecko/models/wallet_data.dart'; class WalletName extends StatelessWidget { const WalletName({ diff --git a/lib/widgets/wallet_tile.dart b/lib/widgets/wallet_tile.dart index 4340ce24..72e42886 100644 --- a/lib/widgets/wallet_tile.dart +++ b/lib/widgets/wallet_tile.dart @@ -1,8 +1,8 @@ import 'dart:io'; +import 'package:durt2/durt2.dart' show WalletData; import 'package:flutter/material.dart'; import 'package:gecko/globals.dart'; import 'package:gecko/models/scale_functions.dart'; -import 'package:gecko/models/wallet_data.dart'; import 'package:gecko/models/widgets_keys.dart'; import 'package:gecko/providers/my_wallets.dart'; import 'package:gecko/providers/v2s_datapod.dart'; @@ -22,8 +22,6 @@ class WalletTile extends StatelessWidget { @override Widget build(BuildContext context) { - repository.getDatapodAvatar(); - return Padding( padding: EdgeInsets.all(scaleSize(11)), child: GestureDetector( @@ -74,11 +72,11 @@ class WalletTile extends StatelessWidget { ], ), ), - child: repository.imageCustomPath == null || repository.imageCustomPath == '' + child: repository.imagePath == null || repository.imagePath == '' ? Padding( padding: EdgeInsets.all(scaleSize(16)), child: Image.asset( - 'assets/avatars/${repository.imageDefaultPath}', + 'assets/avatars/${repository.imagePath}', alignment: Alignment.bottomCenter, ), ) @@ -89,7 +87,7 @@ class WalletTile extends StatelessWidget { image: DecorationImage( fit: BoxFit.fitHeight, image: FileImage( - File(repository.imageCustomPath!), + File(repository.imagePath!), ), ), ), diff --git a/lib/widgets/wallet_tile_membre.dart b/lib/widgets/wallet_tile_membre.dart index 7e9f7e1a..4045fd89 100644 --- a/lib/widgets/wallet_tile_membre.dart +++ b/lib/widgets/wallet_tile_membre.dart @@ -1,8 +1,8 @@ import 'dart:io'; +import 'package:durt2/durt2.dart' show WalletData; import 'package:flutter/material.dart'; import 'package:gecko/globals.dart'; import 'package:gecko/models/scale_functions.dart'; -import 'package:gecko/models/wallet_data.dart'; import 'package:gecko/models/widgets_keys.dart'; import 'package:gecko/providers/my_wallets.dart'; import 'package:gecko/providers/v2s_datapod.dart'; @@ -20,8 +20,6 @@ class WalletTileMembre extends StatelessWidget { @override Widget build(BuildContext context) { - wallet.getDatapodAvatar(); - return Padding( padding: EdgeInsets.symmetric(horizontal: scaleSize(52), vertical: scaleSize(15)), child: GestureDetector( @@ -75,11 +73,11 @@ class WalletTileMembre extends StatelessWidget { ], ), ), - child: wallet.imageCustomPath == null || wallet.imageCustomPath == '' + child: wallet.imagePath == null || wallet.imagePath == '' ? Padding( padding: EdgeInsets.all(scaleSize(16)), child: Image.asset( - 'assets/avatars/${wallet.imageDefaultPath}', + 'assets/avatars/${wallet.imagePath}', alignment: Alignment.bottomCenter, ), ) @@ -90,7 +88,7 @@ class WalletTileMembre extends StatelessWidget { image: DecorationImage( fit: BoxFit.fitHeight, image: FileImage( - File(wallet.imageCustomPath!), + File(wallet.imagePath!), ), ), ), -- GitLab