diff --git a/assets/translations/en.json b/assets/translations/en.json index fdfeae167424d6f77eae9eabe30937d46bfe34b9..306a84bc08832fef3b8dc978b1b08a8046e9acb1 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 571c73fb27f1c0c1a7be3ee178b1299708132a45..23e5a273f11927fbd8efa889ae71a57858218387 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 823af693896d22c0e227270b0c50b530affacb71..66ff74435bf49eaef9a4d4e9abab45e1fb15f2d1 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 0e2b1cabd377f0c56d42343c095b21ac1de85dc2..7376d21f08eba4208b90e910ed70e2e0a3051cd6 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 4fa850ac59a513a7fced7135cb0c061ed3bc3aa1..f4e2c8aa4a2d306cb6ac8e6b4a097f957fa39914 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'; @@ -14,24 +13,38 @@ import 'package:gecko/main.dart' as app; import 'package:uuid/uuid.dart'; const isHumanReading = false; -Timeout testTimeout([int seconds = 120]) => Timeout(Duration(seconds: isHumanReading ? 600 : seconds)); +Timeout testTimeout([int seconds = 120]) => + Timeout(Duration(seconds: isHumanReading ? 600 : seconds)); final sub = Provider.of<SubstrateSdk>(homeContext, listen: false); late WidgetTester tester; // TEST WALLETS CONSTS -const testMnemonic = 'pipe paddle ketchup filter life ice feel embody glide quantum ride usage'; -final test1 = TestWallet('5FeggKqw2AbnGZF9Y9WPM2QTgzENS3Hit94Ewgmzdg5a3LNa', 'test1'); -final test2 = TestWallet('5E4i8vcNjnrDp21Sbnp32WHm2gz8YP3GGFwmdpfg5bHd8Whb', 'test2'); -final test3 = TestWallet('5FhTLzXLNBPmtXtDBFECmD7fvKmTtTQDtvBTfVr97tachA1p', 'test3'); -final test4 = TestWallet('5DXJ4CusmCg8S1yF6JGVn4fxgk5oFx42WctXqHZ17mykgje5', 'test4'); -final test5 = TestWallet('5Dq3giahrBfykJogPetZJ2jjSmhw49Fa7i6qKkseUvRJ2T3R', 'test5'); -final test6 = TestWallet('5GxEp3do81j97kNaH4JyZgDXuPoKWoTuxXXWGyyNXeKeVLHb', 'test6'); -final test7 = TestWallet('5FZ1sSvREbQLCtSSCvMUx7KCAnpJkB7q5mfz2oixiZq2ChET', 'test7'); -final test8 = TestWallet('5CoKV9EEgwb2NmWamTXUAa6ycfNb2k1iNfVGvJAkg7dLq9RH', 'test8'); -final cesiumTest1 = TestWallet('5GAT6CJW8yVKwUuQc7sM5Kk9GZVTpbZYk9PfjNXtvnNgAJZ1', 'cesiumTest1'); -final cesiumTest2 = TestWallet('5DTnny1tTkUs1SXHZTx98RUAj76Z88FfFhsQjd48dXnk8gHR', 'cesiumTest2'); -final cesiumTest3 = TestWallet('5EJct9jTDNKco4YiYfETAseq1gaduBtsJUcNnFicfvh3bTV6', 'cesiumTest3'); -final cesiumTest4 = TestWallet('5HD1oSv6A7VNxPYos6F86JFZ3bhz5LnEaWC4hkwLMj84v4ww', 'cesiumTest4'); +const testMnemonic = + 'pipe paddle ketchup filter life ice feel embody glide quantum ride usage'; +final test1 = + TestWallet('5FeggKqw2AbnGZF9Y9WPM2QTgzENS3Hit94Ewgmzdg5a3LNa', 'test1'); +final test2 = + TestWallet('5E4i8vcNjnrDp21Sbnp32WHm2gz8YP3GGFwmdpfg5bHd8Whb', 'test2'); +final test3 = + TestWallet('5FhTLzXLNBPmtXtDBFECmD7fvKmTtTQDtvBTfVr97tachA1p', 'test3'); +final test4 = + TestWallet('5DXJ4CusmCg8S1yF6JGVn4fxgk5oFx42WctXqHZ17mykgje5', 'test4'); +final test5 = + TestWallet('5Dq3giahrBfykJogPetZJ2jjSmhw49Fa7i6qKkseUvRJ2T3R', 'test5'); +final test6 = + TestWallet('5GxEp3do81j97kNaH4JyZgDXuPoKWoTuxXXWGyyNXeKeVLHb', 'test6'); +final test7 = + TestWallet('5FZ1sSvREbQLCtSSCvMUx7KCAnpJkB7q5mfz2oixiZq2ChET', 'test7'); +final test8 = + TestWallet('5CoKV9EEgwb2NmWamTXUAa6ycfNb2k1iNfVGvJAkg7dLq9RH', 'test8'); +final cesiumTest1 = TestWallet( + '5GAT6CJW8yVKwUuQc7sM5Kk9GZVTpbZYk9PfjNXtvnNgAJZ1', 'cesiumTest1'); +final cesiumTest2 = TestWallet( + '5DTnny1tTkUs1SXHZTx98RUAj76Z88FfFhsQjd48dXnk8gHR', 'cesiumTest2'); +final cesiumTest3 = TestWallet( + '5EJct9jTDNKco4YiYfETAseq1gaduBtsJUcNnFicfvh3bTV6', 'cesiumTest3'); +final cesiumTest4 = TestWallet( + '5HD1oSv6A7VNxPYos6F86JFZ3bhz5LnEaWC4hkwLMj84v4ww', 'cesiumTest4'); // CUSTOM FUNCTIONS @@ -39,22 +52,27 @@ Future sleep([int time = 1000]) async { await Future.delayed(Duration(milliseconds: time)); } -Future pump({Duration duration = const Duration(milliseconds: 300), int number = 1}) async { +Future pump( + {Duration duration = const Duration(milliseconds: 300), + int number = 1}) async { for (int i = 0; i < number; i++) { log.i("pump $i"); await tester.pump(duration = duration); } } -Future<String> clipPaste() async => (await Clipboard.getData('text/plain'))?.text ?? ''; +Future<String> clipPaste() async => + (await Clipboard.getData('text/plain'))?.text ?? ''; -clipCopy(String text) async => await Clipboard.setData(ClipboardData(text: text)); +clipCopy(String text) async => + await Clipboard.setData(ClipboardData(text: text)); Future humanRead([int time = 1, bool force = false]) async { if (isHumanReading || force) io.sleep(Duration(seconds: time)); } -Future tapKey(Key buttonKey, {Finder? customFinder, int duration = 100, bool selectLast = false}) async { +Future tapKey(Key buttonKey, + {Finder? customFinder, int duration = 100, bool selectLast = false}) async { if (duration != 0) { await tester.pumpAndSettle(Duration(milliseconds: duration)); } @@ -82,7 +100,9 @@ Future scrollUntil(Key element) async { ); } -Future<void> waitForButtonEnabled(Key key, {Duration timeout = const Duration(seconds: 5), bool reverse = false}) async { +Future<void> waitForButtonEnabled(Key key, + {Duration timeout = const Duration(seconds: 5), + bool reverse = false}) async { final end = DateTime.now().add(timeout); log.i('INTEGRATION TEST: Wait for $key to be enabled'); @@ -134,7 +154,8 @@ Future<void> waitFor(String text, } if (settle) { - await tester.pumpAndSettle(Duration(milliseconds: pumpDuration), EnginePhase.sendSemanticsUpdate, timeout); + await tester.pumpAndSettle(Duration(milliseconds: pumpDuration), + EnginePhase.sendSemanticsUpdate, timeout); } await Future.delayed(const Duration(milliseconds: 100)); } while (reverse ? finder.evaluate().isNotEmpty : finder.evaluate().isEmpty); @@ -142,7 +163,8 @@ Future<void> waitFor(String text, } // Test if text is visible on screen, return a boolean -Future<bool> isPresent(String text, {Duration timeout = const Duration(seconds: 1), bool settle = true}) async { +Future<bool> isPresent(String text, + {Duration timeout = const Duration(seconds: 1), bool settle = true}) async { try { await waitFor(text, timeout: timeout, settle: settle); humanRead(); @@ -154,7 +176,8 @@ Future<bool> isPresent(String text, {Duration timeout = const Duration(seconds: } // Test if widget exist on screen, return a boolean -Future<bool> isIconPresent(IconData icon, {Duration timeout = const Duration(seconds: 1)}) async { +Future<bool> isIconPresent(IconData icon, + {Duration timeout = const Duration(seconds: 1)}) async { await tester.pumpAndSettle(); final finder = find.byIcon(icon); humanRead(); @@ -173,7 +196,10 @@ Future spawnBlock({int number = 1, int duration = 200, int? until}) async { } // Pay in background -Future bkPay({required String fromAddress, required String destAddress, required double amount}) async { +Future bkPay( + {required String fromAddress, + required String destAddress, + required double amount}) async { final transactionId = const Uuid().v4(); sub.pay( fromAddress: fromAddress, @@ -189,7 +215,10 @@ Future bkPay({required String fromAddress, required String destAddress, required } // Certify in background -Future bkCertify({required String fromAddress, required String destAddress, bool spawnBloc = true}) async { +Future bkCertify( + {required String fromAddress, + required String destAddress, + bool spawnBloc = true}) async { sub.certify(fromAddress, destAddress, 'AAAAA'); if (spawnBloc) { await sleep(500); @@ -199,7 +228,8 @@ Future bkCertify({required String fromAddress, required String destAddress, bool } // Confirm my identity in background -Future bkConfirmIdentity({required String fromAddress, required String name}) async { +Future bkConfirmIdentity( + {required String fromAddress, required String name}) async { sub.confirmIdentity(fromAddress, name, 'AAAAA'); await sleep(500); await spawnBlock(); @@ -218,33 +248,51 @@ 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 myWalletProvider = + Provider.of<MyWalletsProvider>(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 { - 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); +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( + safeBoxNumber: safeNumber, + address: address, + name: name, + derivation: derivation, + imagePath: '${number % 4}.png', + isOwned: true); + await Durt.i.walletService.walletDataBox.put(myWallet.address, myWallet); return myWallet; } // Delete all wallets in background Future bkDeleteAllWallets() async { - final myWalletProvider = Provider.of<MyWalletsProvider>(homeContext, listen: false); - final isWalletsPresents = await isPresent('scanQRCode'.tr(), timeout: const Duration(milliseconds: 300)); + 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.i.walletService.clearWallet(); await configBox.delete('defaultWallet'); await configBox.delete('isUdUnit'); await sub.deleteAllAccounts(); diff --git a/lib/globals.dart b/lib/globals.dart index 4e4046c3afe3bcf2b020aa65d2f37c359c76450a..7b9b826a133456a7cff795fb7667c3313805e6c9 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 e18ec9041d5e519d0b3e8ace2c0d68b32c7d0ddd..abf8a8767a9b894d3fcb3e7c4823d650b53e8da5 100644 --- a/lib/main.dart +++ b/lib/main.dart @@ -14,7 +14,7 @@ // along with this program. If not, see <https://www.gnu.org/licenses/>. import 'dart:async'; -import 'package:durt2/durt2.dart'; +import 'package:durt2/durt2.dart' show Durt, Networks; import 'package:flutter/services.dart'; import 'package:gecko/globals.dart'; import 'package:gecko/providers/chest_provider.dart'; @@ -33,10 +33,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,16 +57,18 @@ Future<void> main() async { await initHiveForFlutter(); await homeProvider.initHive(); - - appVersion = await homeProvider.getAppVersion(); // Register app dependencies - await registerDependencies(); + // await registerDependencies(); + + //Init durt2 + await Durt().init(network: Networks.gdev); if (kReleaseMode && enableSentry) { await SentryFlutter.init((options) { - options.dsn = 'https://c09587b46eaa42e8b9fda28d838ed180@o496840.ingest.sentry.io/5572110'; + options.dsn = + 'https://c09587b46eaa42e8b9fda28d838ed180@o496840.ingest.sentry.io/5572110'; options.experimental.replay.sessionSampleRate = 1.0; options.experimental.replay.onErrorSampleRate = 1.0; // Privacy settings for PII masking @@ -78,11 +76,17 @@ Future<void> main() async { options.experimental.privacy.maskAllText = false; options.experimental.privacy.maskAllImages = false; }, - appRunner: () => SystemChrome.setPreferredOrientations([DeviceOrientation.portraitUp]).then((_) { + appRunner: () => SystemChrome.setPreferredOrientations( + [DeviceOrientation.portraitUp]).then((_) { runApp( SentryWidget( child: EasyLocalization( - supportedLocales: const [Locale('en'), Locale('fr'), Locale('es'), Locale('it')], + supportedLocales: const [ + Locale('en'), + Locale('fr'), + Locale('es'), + Locale('it') + ], path: 'assets/translations', fallbackLocale: const Locale('en'), child: const Gecko(), @@ -93,10 +97,16 @@ Future<void> main() async { } else { log.i('Debug mode enabled: No sentry alert'); - SystemChrome.setPreferredOrientations([DeviceOrientation.portraitUp]).then((_) { + SystemChrome.setPreferredOrientations([DeviceOrientation.portraitUp]) + .then((_) { runApp(EasyLocalization( // test, force locale :: startLocale: Locale.fromSubtags(languageCode: 'it'), - supportedLocales: const [Locale('en'), Locale('fr'), Locale('es'), Locale('it')], + supportedLocales: const [ + Locale('en'), + Locale('fr'), + Locale('es'), + Locale('it') + ], path: 'assets/translations', fallbackLocale: const Locale('en'), child: const Gecko(), @@ -176,7 +186,8 @@ class Gecko extends StatelessWidget { primaryColor: const Color(0xffFFD58D), scaffoldBackgroundColor: backgroundColor, canvasColor: backgroundColor, - colorScheme: ColorScheme.fromSwatch().copyWith(secondary: Colors.grey[850]), + colorScheme: + ColorScheme.fromSwatch().copyWith(secondary: Colors.grey[850]), dialogTheme: DialogThemeData(backgroundColor: backgroundColor), ), initialRoute: "/", @@ -191,11 +202,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 ef2d3f72d08d2dcf680b92ea882a1909079c1402..0000000000000000000000000000000000000000 --- 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 cf1aa52cd62489f22ba3b0dd4baaecb12cb5bfec..0000000000000000000000000000000000000000 --- 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 f477f99f460780bd6bd3dcae44bb4af8872c57ac..6ff3e2318150a47214b08ce125b5b582f7044796 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 6059351ea9b2a5eb8e44d0459a164d43fe933133..a8cab69d1877f57e8e84885eea779a01e667fb54 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 5e4f03b9a7a549de2a2cd17a7f54616e79a25be1..81a7b86f0a69768f677dbabfcbbe3be28caa2e3a 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 9f1fc93388bc074770ab3e82865e4d5ae0146051..0000000000000000000000000000000000000000 --- 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 71df96177fcea7159d9621e79e11396aec21cc61..0000000000000000000000000000000000000000 --- 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 28f454378d083b41bd34869ab61fb9df4ce1d97f..49092965b32b1301bc4b6cf6cde9ce80a5328ee1 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,22 @@ 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); - final myWalletProvider = Provider.of<MyWalletsProvider>(context, listen: false); + await sub.deleteAccounts(getChestWallets(safe)); + await Durt.i.walletService.deleteSafe(safe.key); + final myWalletProvider = + Provider.of<MyWalletsProvider>(context, listen: false); myWalletProvider.pinCode = ''; - if (chestBox.isEmpty) { - await configBox.put('currentChest', 0); + if (Durt.i.walletService.safeBox.isEmpty) { + await Durt.i.walletService.setDefaultSafeBoxNumber(0); } else { - int? lastChest = chestBox.toMap().keys.first; - await configBox.put('currentChest', lastChest); + final int lastSafe = Durt.i.walletService.safeBox.toMap().keys.first; + await Durt.i.walletService.setDefaultSafeBoxNumber(lastSafe); } Navigator.popUntil( @@ -39,10 +38,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.i.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 9fc8324491548f4adeb94b51afb35dbf603227d7..a632c26f9f8e8a2a50251b512c1f75ebc87dc6f3 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.i.walletService.generateMnemonic(language: language); generatedMnemonic = generatedMnemonicTyped.sentence; return generatedMnemonicTyped.words; @@ -247,7 +233,9 @@ class GenerateWalletsProvider with ChangeNotifier { Future pasteMnemonic(BuildContext context) async { final sentence = await Clipboard.getData('text/plain'); - if (sentence?.text == null || sentence!.text!.split(' ').length != 12) return; + if (sentence?.text == null || sentence!.text!.split(' ').length != 12) { + return; + } int nbr = 0; @@ -282,16 +270,11 @@ class GenerateWalletsProvider with ChangeNotifier { Future<ScanDerivationsResult> scanDerivations(BuildContext context, String pinCode) async { try { return await _scanDerivations(context, pinCode).timeout( - const Duration(seconds: 20), + const Duration(seconds: 120), 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.i.walletService.defaultSafeBoxNumber; + await Durt.i.walletService.deleteSafe(actualSafeNumber); // Display error message to user // ignore: use_build_context_synchronously @@ -308,6 +291,7 @@ class GenerateWalletsProvider with ChangeNotifier { }, ); } catch (e) { + log.e('Error scanning derivations: $e'); // Handle any other errors await infoPopup(context, "errorScanDerivations".tr()); @@ -327,48 +311,51 @@ class GenerateWalletsProvider with ChangeNotifier { Map<String, int> addressToScan = {}; notifyListeners(); - if (!Durt.instance.isConnected) { + if (!Durt.i.isConnected) { return ScanDerivationsResult.error; } scanStatus = ScanDerivationsStatus.rootScanning; - final hasRoot = await scanRootBalance(pinCode); notifyListeners(); + final hasRoot = await scanRootBalance(pinCode); if (hasRoot) { isAlive = true; } scanStatus = ScanDerivationsStatus.scanning; + notifyListeners(); 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); + if ([28, 29, 30].contains(derivationNbr)) continue; + print('derivationNbr: $derivationNbr'); + final keypair = await Durt.i.walletService.getKeyPairFromMnemonic(generatedMnemonic!, derivation: derivationNbr); + addressToScan.putIfAbsent(keypair.address, () => derivationNbr); } - final balanceList = await sub.getBalanceMulti(addressToScan.keys.toList()).timeout( + final balanceList = await Durt.i.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; + notifyListeners(); 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.i.walletService.importDerivations(pinCode: pinCode, derivations: [addressToScan[scannedWallet]!]); + final actualSafeNumber = Durt.i.walletService.defaultSafeBoxNumber; - WalletData myWallet = WalletData( - chest: currentChestNumber, + final myWallet = WalletData( + 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.i.walletService.walletDataBox.put(myWallet.address, myWallet); scanedWalletNumber++; notifyListeners(); } @@ -381,31 +368,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.i.walletService.getKeyPairFromMnemonic(generatedMnemonic!); + + final address = Durt.i.walletService.getAddress(keypair.address); // if (addressData.address == null) return false; - final balance = await duniterStorage.getBalance(keypair.address).timeout( + final balance = await Durt.i.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.i.walletService.importRootWallet(pinCode: pinCode); - // await sub.importAccount(mnemonic: generatedMnemonic!, password: pinCode); + final actualSafeNumber = Durt.i.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.i.walletService.walletDataBox.put(myWallet.address, myWallet); scanedWalletNumber++; return true; } else { diff --git a/lib/providers/home.dart b/lib/providers/home.dart index 5810785fb83e8f615ff96f8585d9d886644bcaf5..1b2048aa4025163ccdf79bd2aac72b946ccad4ca 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 @@ -145,7 +143,7 @@ class HomeProvider with ChangeNotifier { if (!setEquals(currentSet, remoteSet)) { remoteEndpoints.shuffle(); - await configBox.put('endpoint', remoteEndpoints); + // await configBox.put('endpoint', remoteEndpoints); log.i('Endpoints mis à jour en background'); } } catch (e) { @@ -160,7 +158,7 @@ class HomeProvider with ChangeNotifier { } // 1. Vérification rapide de la configBox - final existingEndpoints = configBox.get('endpoint'); + final existingEndpoints = Networks.listDuniterEndpoints; if (_isValidEndpointsList(existingEndpoints)) { // Lancer la mise à jour en background unawaited(_updateEndpointsInBackground(List<String>.from(existingEndpoints))); @@ -171,7 +169,7 @@ class HomeProvider with ChangeNotifier { // 2. Tentative de fetch distant final endpoints = await _fetchRemoteEndpoints(); endpoints.shuffle(); - await configBox.put('endpoint', endpoints); + // await configBox.put('endpoint', endpoints); return endpoints; } catch (e) { // 3. Fallback sur le fichier local @@ -179,11 +177,11 @@ class HomeProvider with ChangeNotifier { final localEndpoints = await rootBundle.loadString('config/gdev_endpoints.json').then((jsonStr) => List<String>.from(jsonDecode(jsonStr))); localEndpoints.shuffle(); - await configBox.put('endpoint', localEndpoints); + // await configBox.put('endpoint', localEndpoints); return localEndpoints; } catch (e) { log.e('Erreur critique endpoints: $e'); - return configBox.get('endpoint') ?? []; + return Networks.listDuniterEndpoints; } } } @@ -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); + + // 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 (!Durt.i.isConnected) { + 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); + } + + // Connect to Duniter network + await Durt.i.connect(); + + // Future<void> updateConnectionStatus(List<ConnectivityResult> result) async { + // log.i('Network changed: $result'); + // if (result.contains(ConnectivityResult.none)) { + // Durt.i.isConnected = 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 0ea7d5d43b6ee3a2e7cfb5b82b0ff766a71aec1d..359f178b04183284bbd6a8258ce8c3c75a995ba2 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.i.walletService.defaultSafeBoxNumber; - bool isWalletsExists() => chestBox.isNotEmpty; + bool get isWalletsExists => Durt.i.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 { - final sub = Provider.of<SubstrateSdk>(homeContext, listen: false); - chest = chest ?? getCurrentChest(); + Future<List<WalletData>> readAllWallets([int? safe]) async { + // final sub = Provider.of<SubstrateSdk>(homeContext, listen: false); + safe = safe ?? getCurrentSafe; listWallets.clear(); - final wallets = walletBox.toMap().values.toList(); + final wallets = Durt.i.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) { @@ -56,29 +50,29 @@ class MyWalletsProvider with ChangeNotifier { } } - // update all idty status in lists - int n = 0; - final idtyStatusList = await sub.idtyStatusMulti(walletsToScan.keys.toList()); + // final idtyStatusList = + // await sub.idtyStatusMulti(walletsToScan.keys.toList()); for (final wallet in walletsToScan.values) { - wallet.identityStatus = idtyStatusList[n]; - walletBox.put(wallet.address, wallet); + // wallet.identityStatus = idtyStatusList[n]; + if (Durt.i.walletService.walletDataBox.containsKey(wallet.address)) continue; + + Durt.i.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.i.walletService.walletDataBox.toMap().forEach((key, value) { + if (value.safeBoxNumber == safe && value.number == nbr) { targetedWallet = value; return; } @@ -102,34 +96,37 @@ class MyWalletsProvider with ChangeNotifier { return pinCode.isNotEmpty; } - WalletData? getWalletDataByAddress(String address) => walletBox.toMap().values.firstWhereOrNull((wallet) => wallet.address == address); + WalletData? getWalletDataByAddress(String address) => + Durt.i.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.i.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.i.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); } } Future<int> deleteAllWallet(context) async { - final sub = Provider.of<SubstrateSdk>(context, listen: false); final myWalletProvider = Provider.of<MyWalletsProvider>(context, listen: false); try { log.w('DELETE ALL WALLETS ?'); 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.i.walletService.walletDataBox.clear(); + await Durt.i.walletService.safeBox.clear(); await configBox.delete('defaultWallet'); - await sub.deleteAllAccounts(); + // await sub.deleteAllAccounts(); final directory = await getApplicationDocumentsDirectory(); final avatarFolder = Directory('${directory.path}/avatars/'); @@ -156,7 +153,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 +162,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.i.walletService.walletDataBox.put(newWallet.address, newWallet); await readAllWallets(); isNewDerivationLoading = false; @@ -186,17 +183,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 +202,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.i.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 +224,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 701cb10a51433ac8ec9a21cab6a2389525f74837..058c16464a626dd58e8eb31fdbc55d7725c4af68 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 Durt, IdtyStatus, Networks; 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'; @@ -40,7 +39,7 @@ class SubstrateSdk with ChangeNotifier { String generatedMnemonic = ''; bool sdkReady = false; bool sdkLoading = false; - bool nodeConnected = false; + // bool Durt.i.isConnected = false; bool importIsLoading = false; int blocNumber = 0; bool isLoadingEndpoint = false; @@ -142,6 +141,7 @@ class SubstrateSdk with ChangeNotifier { // transactionStatus.remove(currentTransactionId); } + @Deprecated('Use Durt 2 instead') Future _getStorage(String call) async { try { // log.d(call); @@ -316,7 +316,7 @@ class SubstrateSdk with ChangeNotifier { } Future<WalletBalance> getBalance(String address) async { - if (!nodeConnected) { + if (!Durt.i.isConnected) { return WalletBalance.empty(); } @@ -393,7 +393,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 +442,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 +482,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, }; @@ -742,16 +742,16 @@ class SubstrateSdk with ChangeNotifier { isLoadingEndpoint = false; notifyListeners(); if (resNode != null) { - nodeConnected = true; + // Durt.i.isConnected = true; // Subscribe bloc number sdk.api.setting.subscribeBestNumber((res) { blocNumber = _convertToInt(res.toString()); if (sdk.api.connectedNode?.endpoint == null) { - nodeConnected = false; + // Durt.i.isConnected = false; homeProvider.changeMessage("networkLost".tr()); } else { - nodeConnected = true; + // Durt.i.isConnected = true; } notifyListeners(); }); @@ -764,10 +764,10 @@ class SubstrateSdk with ChangeNotifier { notifyListeners(); homeProvider.changeMessage("wellConnectedToNode".tr(args: [getConnectedEndpoint()!.split('/')[2]])); } else { - nodeConnected = false; + // Durt.i.isConnected = 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}'); @@ -776,7 +776,7 @@ class SubstrateSdk with ChangeNotifier { List<NetworkParams> getDuniterBootstrap() { List<NetworkParams> node = []; - for (String endpoint in configBox.get('endpoint')) { + for (String endpoint in Networks.listDuniterEndpoints) { final n = NetworkParams(); n.name = currencyName; n.endpoint = endpoint; @@ -900,20 +900,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() { @@ -951,15 +951,6 @@ class SubstrateSdk with ChangeNotifier { return await importAccount(password: password); } - @Deprecated('Use Durt 2 instead') - Future<bool> isMnemonicValid(String mnemonic) async { - // Needed for bad encoding of UTF-8 - mnemonic = mnemonic.replaceAll('é', 'é'); - mnemonic = mnemonic.replaceAll('è', 'è'); - - return await sdk.api.keyring.checkMnemonicValid(mnemonic); - } - @Deprecated('Use Durt 2 instead') Future<String> csToV2Address(String salt, String password) async { final scrypt = pc.KeyDerivator('scrypt'); @@ -1112,7 +1103,7 @@ class SubstrateSdk with ChangeNotifier { final toIndex = await _getIdentityIndexOf(destAddress); - if (myIdtyStatus != IdtyStatus.member) { + if (myIdtyStatus != IdtyStatus.validated) { return 'notMember'; } @@ -1134,8 +1125,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 +1402,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 5fa7fbe7d5f3ee196e8b439850943ce0ff6bc929..2fe4516a6f3f336dc0c41423b3a43e6bb1737e01 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,14 @@ 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.i.walletService.walletDataBox + .put(walletTarget.address, walletTarget); _newWalletName.text = ''; } @@ -58,7 +60,8 @@ class WalletOptionsProvider with ChangeNotifier { if (answer) { //Check if balance is null if (balanceCache[wallet.address] != 0) { - final myWalletProvider = Provider.of<MyWalletsProvider>(context, listen: false); + final myWalletProvider = + Provider.of<MyWalletsProvider>(context, listen: false); final defaultWallet = myWalletProvider.getDefaultWallet(); final transactionId = const Uuid().v4(); sub.pay( @@ -71,9 +74,9 @@ class WalletOptionsProvider with ChangeNotifier { ); } - await walletBox.delete(wallet.address); - if (wallet.imageCustomPath != null) { - final avatarFile = File(wallet.imageCustomPath!); + await Durt.i.walletService.walletDataBox.delete(wallet.address); + if (wallet.imagePath != null) { + final avatarFile = File(wallet.imagePath!); if (await avatarFile.exists()) { await avatarFile.delete(); } @@ -132,17 +135,17 @@ class WalletOptionsProvider with ChangeNotifier { await File(croppedFile.path).rename(newPath); - final walletData = MyWalletsProvider().getWalletDataByAddress(address.text); + 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.i.walletService.walletDataBox.put(address.text, walletData); notifyListeners(); datapod.setAvatar(address.text, newPath); @@ -156,8 +159,10 @@ class WalletOptionsProvider with ChangeNotifier { Future<String?> confirmIdentityPopup(BuildContext context) async { final idtyName = TextEditingController(); final sub = Provider.of<SubstrateSdk>(context, listen: false); - final walletOptions = Provider.of<WalletOptionsProvider>(context, listen: false); - final myWalletProvider = Provider.of<MyWalletsProvider>(context, listen: false); + final walletOptions = + Provider.of<WalletOptionsProvider>(context, listen: false); + final myWalletProvider = + Provider.of<MyWalletsProvider>(context, listen: false); final duniterIndexer = Provider.of<DuniterIndexer>(context, listen: false); bool canValidate = false; @@ -181,7 +186,10 @@ class WalletOptionsProvider with ChangeNotifier { key: keyEnterIdentityUsername, onChanged: (_) async { idtyExist = await duniterIndexer.isIdtyExist(idtyName.text); - canValidate = !idtyExist && !await duniterIndexer.isIdtyExist(idtyName.text) && idtyName.text.length >= 2 && idtyName.text.length <= 32; + canValidate = !idtyExist && + !await duniterIndexer.isIdtyExist(idtyName.text) && + idtyName.text.length >= 2 && + idtyName.text.length <= 32; notifyListeners(); }, @@ -197,7 +205,8 @@ class WalletOptionsProvider with ChangeNotifier { ), const SizedBox(height: 10), Consumer<WalletOptionsProvider>(builder: (context, wOptions, _) { - return Text(idtyExist ? "thisIdentityAlreadyExist".tr() : '', style: TextStyle(color: Colors.red[500])); + return Text(idtyExist ? "thisIdentityAlreadyExist".tr() : '', + style: TextStyle(color: Colors.red[500])); }) ]), ), @@ -205,22 +214,30 @@ class WalletOptionsProvider with ChangeNotifier { Row( mainAxisAlignment: MainAxisAlignment.center, children: [ - Consumer<WalletOptionsProvider>(builder: (context, wOptions, _) { + Consumer<WalletOptionsProvider>( + builder: (context, wOptions, _) { return TextButton( key: keyConfirm, onPressed: canValidate ? () async { - idtyName.text = idtyName.text.trim().replaceAll(' ', ''); + idtyName.text = + idtyName.text.trim().replaceAll(' ', ''); - if (idtyName.text.length.clamp(3, 32) != idtyName.text.length) { + if (idtyName.text.length.clamp(3, 32) != + idtyName.text.length) { return; } if (!await myWalletProvider.askPinCode()) return; - final wallet = myWalletProvider.getWalletDataByAddress(address.text); - await sub.setCurrentWallet(wallet!); - final transactionId = await sub.confirmIdentity(walletOptions.address.text, idtyName.text, myWalletProvider.pinCode); + final wallet = myWalletProvider + .getWalletDataByAddress(address.text); + await Durt.i.walletService + .setDefaultAddress(wallet!.address); + final transactionId = await sub.confirmIdentity( + walletOptions.address.text, + idtyName.text, + myWalletProvider.pinCode); Navigator.pop(context); Navigator.push( @@ -238,7 +255,11 @@ class WalletOptionsProvider with ChangeNotifier { : null, child: Text( "validate".tr(), - style: TextStyle(fontSize: 20, color: canValidate ? const Color(0xffD80000) : Colors.grey[500]), + style: TextStyle( + fontSize: 20, + color: canValidate + ? const Color(0xffD80000) + : Colors.grey[500]), ), ); }) @@ -251,7 +272,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; @@ -282,21 +303,25 @@ class WalletOptionsProvider with ChangeNotifier { Row( mainAxisAlignment: MainAxisAlignment.center, children: [ - Consumer<WalletOptionsProvider>(builder: (context, wOptions, _) { + Consumer<WalletOptionsProvider>( + builder: (context, wOptions, _) { return TextButton( key: keyInfoPopup, child: Text( "validate".tr(), style: TextStyle( fontSize: 20, - color: canValidateNameBool ? const Color(0xffD80000) : Colors.grey, + color: canValidateNameBool + ? const Color(0xffD80000) + : Colors.grey, fontWeight: FontWeight.w600, ), ), onPressed: () async { if (canValidateNameBool) { nameController.text = walletName.text; - _renameWallet(wID, walletName.text, isCesium: false); + _renameWallet(address, walletName.text, + isCesium: false); notifyListeners(); Navigator.pop(context); } @@ -312,7 +337,10 @@ class WalletOptionsProvider with ChangeNotifier { key: keyCancel, child: Text( "cancel".tr(), - style: TextStyle(fontSize: 17, color: Colors.grey[800], fontWeight: FontWeight.w300), + style: TextStyle( + fontSize: 17, + color: Colors.grey[800], + fontWeight: FontWeight.w300), ), onPressed: () async { Navigator.pop(context); @@ -328,9 +356,12 @@ class WalletOptionsProvider with ChangeNotifier { } bool canValidateName(BuildContext context, final walletName) { - final myWalletProvider = Provider.of<MyWalletsProvider>(context, listen: false); + final myWalletProvider = + Provider.of<MyWalletsProvider>(context, listen: false); - bool isNameValid = walletName.text.length >= 2 && !walletName.text.contains(':') && walletName.text.length <= 39; + bool isNameValid = walletName.text.length >= 2 && + !walletName.text.contains(':') && + walletName.text.length <= 39; if (isNameValid) { for (var wallet in myWalletProvider.listWallets) { diff --git a/lib/screens/home.dart b/lib/screens/home.dart index 4e0fa3b1103d8c2a7198b11c98d19f14ebf7eb43..1222cf1e9f133b869b1954b91364a892bb9460e5 100644 --- a/lib/screens/home.dart +++ b/lib/screens/home.dart @@ -1,29 +1,18 @@ -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/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 { @@ -36,82 +25,10 @@ class HomeScreen extends StatefulWidget { class _HomeScreenState extends State<HomeScreen> { @override void initState() { + super.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); - } + await Provider.of<HomeProvider>(context, listen: false).initHome(context); }); - super.initState(); } @override @@ -120,10 +37,11 @@ class _HomeScreenState extends State<HomeScreen> { final myWalletProvider = Provider.of<MyWalletsProvider>(context); Provider.of<ChestProvider>(context); - final isWalletsExists = myWalletProvider.isWalletsExists(); - - isTall = (MediaQuery.of(context).size.height / MediaQuery.of(context).size.width) > 1.75; + final isWalletsExists = myWalletProvider.isWalletsExists; + isTall = (MediaQuery.of(context).size.height / + MediaQuery.of(context).size.width) > + 1.75; return Scaffold( resizeToAvoidBottomInset: false, drawer: MainDrawer(isWalletsExists: isWalletsExists), @@ -143,7 +61,8 @@ Widget geckHome(context) { fit: BoxFit.cover, ), ), - child: Column(crossAxisAlignment: CrossAxisAlignment.start, children: <Widget>[ + child: + Column(crossAxisAlignment: CrossAxisAlignment.start, children: <Widget>[ Stack(children: <Widget>[ Positioned( top: statusBarHeight + scaleSize(10), @@ -151,12 +70,15 @@ Widget geckHome(context) { child: IconHomeSettings(), ), Align( - child: Image(image: const AssetImage('assets/home/header.png'), height: scaleSize(165)), + child: Image( + image: const AssetImage('assets/home/header.png'), + height: scaleSize(165)), ), ]), Padding( padding: const EdgeInsets.only(top: 15), - child: Row(mainAxisAlignment: MainAxisAlignment.center, children: <Widget>[ + child: + Row(mainAxisAlignment: MainAxisAlignment.center, children: <Widget>[ DefaultTextStyle( textAlign: TextAlign.center, style: scaledTextStyle( @@ -217,7 +139,8 @@ Widget welcomeHome(context) { fit: BoxFit.cover, ), ), - child: Column(crossAxisAlignment: CrossAxisAlignment.start, children: <Widget>[ + child: + Column(crossAxisAlignment: CrossAxisAlignment.start, children: <Widget>[ Stack(children: <Widget>[ Positioned( top: statusBarHeight + scaleSize(10), @@ -225,12 +148,15 @@ Widget welcomeHome(context) { child: IconHomeSettings(), ), Align( - child: Image(image: const AssetImage('assets/home/header.png'), height: scaleSize(165)), + child: Image( + image: const AssetImage('assets/home/header.png'), + height: scaleSize(165)), ), ]), Padding( padding: const EdgeInsets.only(top: 1), - child: Row(mainAxisAlignment: MainAxisAlignment.center, children: <Widget>[ + child: + Row(mainAxisAlignment: MainAxisAlignment.center, children: <Widget>[ Expanded( child: Text( "fastAppDescription".tr(args: [currencyName]), @@ -278,9 +204,11 @@ Widget welcomeHome(context) { Expanded( child: Stack(children: <Widget>[ Padding( - padding: EdgeInsets.only(top: scaleSize(isTall ? 55 : 0)), + padding: + EdgeInsets.only(top: scaleSize(isTall ? 55 : 0)), child: Image( - image: const AssetImage('assets/home/gecko-bienvenue.png'), + image: const AssetImage( + 'assets/home/gecko-bienvenue.png'), height: scaleSize(isTall ? 180 : 160), ), ), @@ -326,7 +254,10 @@ Widget welcomeHome(context) { }, child: Text( 'createWallet'.tr(), - style: scaledTextStyle(fontSize: 20, fontWeight: FontWeight.w600, color: Colors.white), + style: scaledTextStyle( + fontSize: 20, + fontWeight: FontWeight.w600, + color: Colors.white), ), ), ), @@ -364,7 +295,10 @@ Widget welcomeHome(context) { }, child: Text( "restoreWallet".tr(), - style: scaledTextStyle(fontSize: 20, color: orangeC, fontWeight: FontWeight.w600), + style: scaledTextStyle( + fontSize: 20, + color: orangeC, + fontWeight: FontWeight.w600), ), ), ), diff --git a/lib/screens/myWallets/chest_options.dart b/lib/screens/myWallets/chest_options.dart index 3645fca61ea9ab094ac74b3389c1200725e0e5e4..b5197711040eab537add215d58fa489d52fcfa96 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.i.walletService.defaultSafeBox; return Scaffold( backgroundColor: backgroundColor, resizeToAvoidBottomInset: false, - appBar: GeckoAppBar(currentChest.name!), + appBar: GeckoAppBar(currentSafe.name), bottomNavigationBar: const GeckoBottomAppBar(), body: Stack(children: [ Builder( @@ -54,8 +55,9 @@ class ChestOptionsContent extends StatelessWidget { @override 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 myWalletProvider = + Provider.of<MyWalletsProvider>(context, listen: false); + final currentChest = Durt.i.walletService.defaultSafeBox; final isAlone = myWalletProvider.listWallets.length == 1; return Column( @@ -75,7 +77,8 @@ class ChestOptionsContent extends StatelessWidget { ); }, child: Container( - padding: EdgeInsets.symmetric(horizontal: scaleSize(16), vertical: scaleSize(12)), + padding: EdgeInsets.symmetric( + horizontal: scaleSize(16), vertical: scaleSize(12)), child: Row( children: [ Icon( @@ -115,7 +118,8 @@ class ChestOptionsContent extends StatelessWidget { ); }, child: Container( - padding: EdgeInsets.symmetric(horizontal: scaleSize(16), vertical: scaleSize(12)), + padding: EdgeInsets.symmetric( + horizontal: scaleSize(16), vertical: scaleSize(12)), child: Row( children: [ Icon( @@ -145,22 +149,26 @@ class ChestOptionsContent extends StatelessWidget { builder: (context, sub, _) { return InkWell( key: keycreateRootDerivation, - onTap: sub.nodeConnected + onTap: Durt.i.isConnected ? () async { await Navigator.push( context, - MaterialPageRoute(builder: (context) => const CustomDerivation()), + MaterialPageRoute( + builder: (context) => const CustomDerivation()), ); } : null, child: Container( - padding: EdgeInsets.symmetric(horizontal: scaleSize(16), vertical: scaleSize(12)), + padding: EdgeInsets.symmetric( + horizontal: scaleSize(16), vertical: scaleSize(12)), child: Row( children: [ Icon( Icons.manage_accounts, size: scaleSize(24), - color: sub.nodeConnected ? Colors.black87 : Colors.grey[400], + color: Durt.i.isConnected + ? Colors.black87 + : Colors.grey[400], ), ScaledSizedBox(width: 16), Expanded( @@ -168,7 +176,9 @@ class ChestOptionsContent extends StatelessWidget { 'createDerivation'.tr(), style: scaledTextStyle( fontSize: 16, - color: sub.nodeConnected ? Colors.black87 : Colors.grey[500], + color: Durt.i.isConnected + ? Colors.black87 + : Colors.grey[500], ), softWrap: true, ), @@ -187,7 +197,8 @@ class ChestOptionsContent extends StatelessWidget { await chestProvider.forgetSafe(context, currentChest); }, child: Container( - padding: EdgeInsets.symmetric(horizontal: scaleSize(16), vertical: scaleSize(12)), + padding: EdgeInsets.symmetric( + horizontal: scaleSize(16), vertical: scaleSize(12)), child: Row( children: [ Image.asset( diff --git a/lib/screens/myWallets/choose_chest.dart b/lib/screens/myWallets/choose_chest.dart index fa1b7d9b5c1cdbe9818fbaa2bcae8d7daba972dd..843905105767ea13cd5ac699a8b8193ec232704e 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.i.walletService.defaultSafeBoxNumber; @override Widget build(BuildContext context) { @@ -41,30 +44,31 @@ class _ChooseChestState extends State<ChooseChest> { options: CarouselOptions( height: 210, onPageChanged: (index, reason) { - currentChest = chestBox.toMap().keys.toList()[index]; + currentChest = + Durt.i.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.i.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,10 +76,11 @@ class _ChooseChestState extends State<ChooseChest> { ); }).toList(), ), - if (chestBox.values.toList().length > 1) + if (Durt.i.walletService.safeBox.values.toList().length > 1) Row( mainAxisAlignment: MainAxisAlignment.center, - children: chestBox.toMap().entries.map((entry) { + children: + Durt.i.walletService.safeBox.values.toList().map((entry) { return GestureDetector( onTap: () => buttonCarouselController.animateToPage(entry.key), @@ -86,10 +91,13 @@ class _ChooseChestState extends State<ChooseChest> { vertical: 8.0, horizontal: 4.0), decoration: BoxDecoration( shape: BoxShape.circle, - color: (Theme.of(context).brightness == Brightness.dark + color: (Theme.of(context).brightness == + Brightness.dark ? Colors.white : Colors.black) - .withValues(alpha: currentChest == entry.key ? 0.9 : 0.4)), + .withValues( + alpha: + currentChest == entry.key ? 0.9 : 0.4)), ), ); }).toList(), diff --git a/lib/screens/myWallets/confirm_change_pin.dart b/lib/screens/myWallets/confirm_change_pin.dart index 8ae690a2348e8929f41fd3aabb7dacea97b9eb4d..88a57d94dde63523f1859b9ebbb79982fd58a455 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 d97e94eb76acf713b735eac789472c4e8b70faa4..9d60927d3bf85fdd5d6eab430fc0df774dbf52b6 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 98e5ff8c9e665afe0bd345de777680c3c8c44ed3..0704ba6cd47c9a6622376e2bcbc0d38b8ca3921d 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 e60898b935d92ec50177d897d03bc9323891f020..064118acacd141860445e79a27350235c46ec5cf 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/migrate_identity.dart b/lib/screens/myWallets/migrate_identity.dart index 1f24c4387d133d3d5ab391b2700126f31390b302..4f3c01cfe7c2b84f03ab867c713ad9a64b0f3569 100644 --- a/lib/screens/myWallets/migrate_identity.dart +++ b/lib/screens/myWallets/migrate_identity.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:gecko/globals.dart'; import 'package:flutter/material.dart'; @@ -43,7 +44,7 @@ class MigrateIdentityScreen extends StatelessWidget { String matchInfo = ''; Future scanDerivations() async { - if (!await isAddress(newWalletAddress.text) || !await sub.isMnemonicValid(newMnemonicSentence.text) || !statusData.canValidate) { + if (!await isAddress(newWalletAddress.text) || !Durt.i.walletService.isMnemonicValid(newMnemonicSentence.text) || !statusData.canValidate) { mnemonicIsValid = false; matchInfo = ''; walletOptions.reload(); diff --git a/lib/screens/myWallets/restore_chest.dart b/lib/screens/myWallets/restore_chest.dart index dbf626813c43ab064b1cef88242cbd3a19211b58..567d9f4ae8d23368661a4c221229c4e1bbde862e 100644 --- a/lib/screens/myWallets/restore_chest.dart +++ b/lib/screens/myWallets/restore_chest.dart @@ -1,13 +1,13 @@ // ignore_for_file: use_build_context_synchronously import 'package:bubble/bubble.dart'; +import 'package:durt2/durt2.dart' show Durt; 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/widgets_keys.dart'; import 'package:gecko/providers/generate_wallets.dart'; -import 'package:gecko/providers/substrate_sdk.dart'; import 'package:gecko/screens/onBoarding/7.dart'; import 'package:gecko/screens/onBoarding/9.dart'; import 'package:gecko/widgets/commons/fader_transition.dart'; @@ -24,7 +24,6 @@ class RestoreChest extends StatelessWidget { @override Widget build(BuildContext context) { final genW = Provider.of<GenerateWalletsProvider>(context, listen: false); - final sub = Provider.of<SubstrateSdk>(context, listen: false); if (genW.isSentenceComplete(context)) { genW.generatedMnemonic = @@ -97,7 +96,7 @@ class RestoreChest extends StatelessWidget { ), ), onPressed: () async { - if (await sub.isMnemonicValid(genW.generatedMnemonic!)) { + if (Durt.i.walletService.isMnemonicValid(genW.generatedMnemonic!)) { genW.resetImportView(); await Navigator.push( context, diff --git a/lib/screens/myWallets/show_seed.dart b/lib/screens/myWallets/show_seed.dart index 78bcac4056087a5e0ff0f558fe11f0e378c173f8..15f50526e8ab2ce9d0a2cd754cb0ae14a027a9db 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 a10337c0f3249d558bae59b8476af143fe293e3c..d4c541084a3ebf67c19d6b28fae69be69c3444a5 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,14 +36,16 @@ class _UnlockingWalletState extends State<UnlockingWallet> { super.initState(); pinFocus = FocusNode(debugLabel: 'pinFocusNode'); enterPin = TextEditingController(); - currentChestNumber = configBox.get('currentChest'); - currentChest = chestBox.get(currentChestNumber)!; + currentSafeNumber = Durt.i.walletService.defaultSafeBoxNumber; + currentSafe = Durt.i.walletService.safeBox.get(currentSafeNumber)!; } @override Widget build(BuildContext context) { - final walletOptions = Provider.of<WalletOptionsProvider>(context, listen: false); - final myWalletProvider = Provider.of<MyWalletsProvider>(context, listen: false); + final walletOptions = + Provider.of<WalletOptionsProvider>(context, listen: false); + final myWalletProvider = + Provider.of<MyWalletsProvider>(context, listen: false); final pinLenght = walletOptions.getPinLenght(widget.wallet.number); @@ -79,19 +81,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, @@ -129,7 +131,8 @@ class _UnlockingWalletState extends State<UnlockingWallet> { ), ), ScaledSizedBox(height: isTall ? 24 : 12), - if (!myWalletProvider.isPinValid && !myWalletProvider.isPinLoading) + if (!myWalletProvider.isPinValid && + !myWalletProvider.isPinLoading) Padding( padding: const EdgeInsets.only(bottom: 16), child: Text( @@ -144,7 +147,8 @@ class _UnlockingWalletState extends State<UnlockingWallet> { pinForm(context, pinLenght), ScaledSizedBox(height: isTall ? 16 : 8), if (canUnlock) - Consumer<WalletOptionsProvider>(builder: (context, sub, _) { + Consumer<WalletOptionsProvider>( + builder: (context, sub, _) { return InkWell( key: keyCachePassword, onTap: () { @@ -155,7 +159,9 @@ class _UnlockingWalletState extends State<UnlockingWallet> { mainAxisSize: MainAxisSize.min, children: [ Icon( - configBox.get('isCacheChecked') ? Icons.check_box : Icons.check_box_outline_blank, + configBox.get('isCacheChecked') + ? Icons.check_box + : Icons.check_box_outline_blank, color: orangeC, size: scaleSize(20), ), @@ -193,7 +199,8 @@ class _UnlockingWalletState extends State<UnlockingWallet> { return Form( child: Padding( - padding: EdgeInsets.symmetric(vertical: scaleSize(3), horizontal: scaleSize(isTall ? 30 : 20)), + padding: EdgeInsets.symmetric( + vertical: scaleSize(3), horizontal: scaleSize(isTall ? 30 : 20)), child: PinCodeTextField( key: keyPinForm, textCapitalization: TextCapitalization.characters, @@ -246,7 +253,8 @@ class _UnlockingWalletState extends State<UnlockingWallet> { onCompleted: (pin) async { myWalletProvider.isPinLoading = true; myWalletProvider.pinCode = pin.toUpperCase(); - final isValid = await sub.checkPassword(defaultWallet.address, pin.toUpperCase()); + final isValid = await sub.checkPassword( + defaultWallet.address, pin.toUpperCase()); if (!isValid) { await Future.delayed(const Duration(milliseconds: 20)); pinColor = Colors.red[600]!; diff --git a/lib/screens/myWallets/wallet_options.dart b/lib/screens/myWallets/wallet_options.dart index 3b708d5aa144d670b5f4c6e2a6aac7c3c4df939d..95740e028393ed99ea03cb95343ef94a970daf1c 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'; @@ -29,25 +29,30 @@ import 'package:gecko/widgets/wallet_header.dart'; import 'package:gecko/screens/identity/confirm_identity.dart'; class WalletOptions extends StatelessWidget { - const WalletOptions({Key? keyMyWallets, required this.wallet}) : super(key: keyMyWallets); + const WalletOptions({Key? keyMyWallets, required this.wallet}) + : super(key: keyMyWallets); final WalletData wallet; @override Widget build(BuildContext context) { - final walletOptions = Provider.of<WalletOptionsProvider>(context, listen: false); - WalletsProfilesProvider historyProvider = Provider.of<WalletsProfilesProvider>(context, listen: false); - final myWalletProvider = Provider.of<MyWalletsProvider>(context, listen: false); + final walletOptions = + Provider.of<WalletOptionsProvider>(context, listen: false); + WalletsProfilesProvider historyProvider = + Provider.of<WalletsProfilesProvider>(context, listen: false); + final myWalletProvider = + Provider.of<MyWalletsProvider>(context, listen: false); final duniterIndexer = Provider.of<DuniterIndexer>(context, listen: false); walletOptions.address.text = wallet.address; - final currentChest = myWalletProvider.getCurrentChest(); - final isWalletNameIndexed = duniterIndexer.walletNameIndexer[walletOptions.address.text] != null; + 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: (_, __) { @@ -58,7 +63,9 @@ class WalletOptions extends StatelessWidget { backgroundColor: Colors.white, appBar: WalletAppBar( address: wallet.address, - title: isWalletNameIndexed ? duniterIndexer.walletNameIndexer[walletOptions.address.text]! : wallet.name!, + title: isWalletNameIndexed + ? duniterIndexer.walletNameIndexer[walletOptions.address.text]! + : wallet.name!, ), body: Stack( children: [ @@ -66,8 +73,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( @@ -85,24 +92,37 @@ class WalletOptions extends StatelessWidget { spacing: 8, children: [ buildConfirmIdentitySection(walletProvider), - if (wallet.hasIdentity) buildRenewMembershipSection(walletProvider), - buildOptionsSection(context, walletProvider, historyProvider), - if (!isAlone) buildDefaultWalletSection(context, walletProvider, myWalletProvider, walletOptions, currentChest), + if (wallet.hasIdentity) + buildRenewMembershipSection(walletProvider), + buildOptionsSection( + context, walletProvider, historyProvider), + if (!isAlone) + buildDefaultWalletSection( + context, + walletProvider, + myWalletProvider, + walletOptions, + currentChest), if (!wallet.hasIdentity) 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)), + padding: EdgeInsets.symmetric( + horizontal: scaleSize(17), + vertical: scaleSize(12)), child: Row( - crossAxisAlignment: CrossAxisAlignment.center, + crossAxisAlignment: + CrossAxisAlignment.center, children: [ Image.asset( 'assets/walletOptions/edit.png', height: scaleSize(22), - color: const Color(0xFF4A90E2).withValues(alpha: 0.8), + color: const Color(0xFF4A90E2) + .withValues(alpha: 0.8), ), ScaledSizedBox(width: 18), Expanded( @@ -119,8 +139,12 @@ class WalletOptions extends StatelessWidget { ), ), ), - if (!walletProvider.isDefaultWallet && !wallet.hasIdentity) deleteWallet(context, walletProvider, currentChest), - if (wallet.hasIdentity) const ManageMembershipButton(), + if (!walletProvider.isDefaultWallet && + !wallet.hasIdentity) + deleteWallet( + context, walletProvider, currentChest), + if (wallet.hasIdentity) + const ManageMembershipButton(), if (isAlone) aloneWalletOptions(), ], ); @@ -168,13 +192,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 +214,7 @@ class WalletOptions extends StatelessWidget { ), child: InkWell( onTap: () async { - wallet.imageCustomPath = await walletProvider.changeAvatar(); + wallet.imagePath = await walletProvider.changeAvatar(); walletProvider.reload(); }, child: Icon( @@ -205,17 +229,23 @@ class WalletOptions extends StatelessWidget { ); } - Widget activityWidget(BuildContext context, WalletsProfilesProvider historyProvider, WalletOptionsProvider walletProvider) { + Widget activityWidget( + BuildContext context, + WalletsProfilesProvider historyProvider, + WalletOptionsProvider walletProvider) { return InkWell( key: keyOpenActivity, onTap: () { Navigator.push( context, - PageNoTransit(builder: (context) => ActivityScreen(address: walletProvider.address.text)), + PageNoTransit( + builder: (context) => + ActivityScreen(address: walletProvider.address.text)), ); }, child: Container( - padding: EdgeInsets.symmetric(horizontal: scaleSize(16), vertical: scaleSize(12)), + padding: EdgeInsets.symmetric( + horizontal: scaleSize(16), vertical: scaleSize(12)), child: Row( crossAxisAlignment: CrossAxisAlignment.center, children: [ @@ -242,44 +272,56 @@ 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); + final myWalletProvider = + Provider.of<MyWalletsProvider>(context, listen: false); + final walletOptions = + Provider.of<WalletOptionsProvider>(context, listen: false); - await sub.setCurrentWallet(wallet); + await Durt.i.walletService.setDefaultWallet(walletOptions.address.text); await myWalletProvider.readAllWallets(currentChest); myWalletProvider.reload(); walletOptions.reload(); } - Widget deleteWallet(BuildContext context, WalletOptionsProvider walletOptions, int currentChest) { + Widget deleteWallet(BuildContext context, WalletOptionsProvider walletOptions, + int currentChest) { final sub = Provider.of<SubstrateSdk>(context, listen: false); - final myWalletProvider = Provider.of<MyWalletsProvider>(context, listen: false); + final myWalletProvider = + Provider.of<MyWalletsProvider>(context, listen: false); final defaultWallet = myWalletProvider.getDefaultWallet(); - final bool isDefaultWallet = walletOptions.address.text == defaultWallet.address; + final bool isDefaultWallet = + walletOptions.address.text == defaultWallet.address; return FutureBuilder( future: sub.hasAccountConsumers(wallet.address), builder: (BuildContext context, AsyncSnapshot<bool> hasConsumers) { - if (hasConsumers.connectionState != ConnectionState.done || hasConsumers.hasError || !hasConsumers.hasData) { + if (hasConsumers.connectionState != ConnectionState.done || + hasConsumers.hasError || + !hasConsumers.hasData) { return const SizedBox.shrink(); } - final int balance = walletOptions.balanceCache[walletOptions.address.text] ?? -1; - final bool canDelete = !isDefaultWallet && !hasConsumers.data! && (balance > 2 || balance == 0) && !wallet.hasIdentity; + final int balance = + walletOptions.balanceCache[walletOptions.address.text] ?? -1; + final bool canDelete = !isDefaultWallet && + !hasConsumers.data! && + (balance > 2 || balance == 0) && + !wallet.hasIdentity; return InkWell( key: keyDeleteWallet, onTap: canDelete ? () async { await walletOptions.deleteWallet(context, wallet); WidgetsBinding.instance.addPostFrameCallback((_) async { - myWalletProvider.listWallets = await myWalletProvider.readAllWallets(currentChest); + myWalletProvider.listWallets = + await myWalletProvider.readAllWallets(currentChest); myWalletProvider.reload(); }); } : null, child: canDelete ? Container( - padding: EdgeInsets.symmetric(horizontal: scaleSize(16), vertical: scaleSize(12)), + padding: EdgeInsets.symmetric( + horizontal: scaleSize(16), vertical: scaleSize(12)), child: Row( crossAxisAlignment: CrossAxisAlignment.center, children: [ @@ -322,8 +364,12 @@ class WalletOptions extends StatelessWidget { sub.currencyParameters['membershipRenewalPeriod']!, ); - final twentyDaysBeforeExpiration = info.expireDate?.subtract(const Duration(days: 20)); - final shouldHideButton = !info.canRenew || (info.expireDate != null && !(twentyDaysBeforeExpiration?.isBefore(DateTime.now()) ?? false)); + final twentyDaysBeforeExpiration = + info.expireDate?.subtract(const Duration(days: 20)); + final shouldHideButton = !info.canRenew || + (info.expireDate != null && + !(twentyDaysBeforeExpiration?.isBefore(DateTime.now()) ?? + false)); if (shouldHideButton) return const SizedBox.shrink(); @@ -343,10 +389,12 @@ class WalletOptions extends StatelessWidget { borderRadius: BorderRadius.circular(8), ), ), - onPressed: () => MembershipRenewal.executeRenewal(context, walletProvider.address.text), + onPressed: () => MembershipRenewal.executeRenewal( + context, walletProvider.address.text), child: Text( 'renewMembership'.tr(), - style: scaledTextStyle(fontSize: 16, color: Colors.white), + style: + scaledTextStyle(fontSize: 16, color: Colors.white), ), ), ), @@ -361,12 +409,19 @@ class WalletOptions extends StatelessWidget { ); } - Widget buildOptionsSection(BuildContext context, WalletOptionsProvider walletProvider, WalletsProfilesProvider historyProvider) { + Widget buildOptionsSection( + BuildContext context, + WalletOptionsProvider walletProvider, + WalletsProfilesProvider historyProvider) { return activityWidget(context, historyProvider, walletProvider); } Widget buildDefaultWalletSection( - BuildContext context, WalletOptionsProvider walletProvider, MyWalletsProvider myWalletProvider, WalletOptionsProvider walletOptions, int currentChest) { + BuildContext context, + WalletOptionsProvider walletProvider, + MyWalletsProvider myWalletProvider, + WalletOptionsProvider walletOptions, + int currentChest) { return Consumer<MyWalletsProvider>( builder: (context, myWalletProvider, _) { return InkWell( @@ -378,22 +433,29 @@ class WalletOptions extends StatelessWidget { } : null, child: Container( - padding: EdgeInsets.symmetric(horizontal: scaleSize(16), vertical: scaleSize(12)), + padding: EdgeInsets.symmetric( + horizontal: scaleSize(16), vertical: scaleSize(12)), child: Row( crossAxisAlignment: CrossAxisAlignment.center, children: [ Icon( Icons.check_circle_outline, size: scaleSize(24), - color: walletProvider.isDefaultWallet ? Colors.grey[400] : const Color(0xFF4CAF50).withValues(alpha: 0.8), + color: walletProvider.isDefaultWallet + ? Colors.grey[400] + : const Color(0xFF4CAF50).withValues(alpha: 0.8), ), ScaledSizedBox(width: 16), Expanded( child: Text( - walletProvider.isDefaultWallet ? 'thisWalletIsDefault'.tr() : 'defineWalletAsDefault'.tr(), + walletProvider.isDefaultWallet + ? 'thisWalletIsDefault'.tr() + : 'defineWalletAsDefault'.tr(), style: scaledTextStyle( fontSize: 16, - color: walletProvider.isDefaultWallet ? Colors.grey[500] : Colors.black87, + color: walletProvider.isDefaultWallet + ? Colors.grey[500] + : Colors.black87, ), softWrap: true, ), @@ -411,9 +473,12 @@ class WalletOptions extends StatelessWidget { return FutureBuilder( future: sub.idtyStatusMulti([walletProvider.address.text]), initialData: const [IdtyStatus.unknown], - builder: (BuildContext context, AsyncSnapshot<List<IdtyStatus>> snapshot) { + 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,20 +538,25 @@ Widget aloneWalletOptions() { onTap: () async { if (!myWalletProvider.isNewDerivationLoading) { if (!await myWalletProvider.askPinCode()) return; - String newDerivationName = '${'wallet'.tr()} ${myWalletProvider.listWallets.last.number! + 2}'; - await myWalletProvider.generateNewDerivation(context, newDerivationName); + String newDerivationName = + '${'wallet'.tr()} ${myWalletProvider.listWallets.last.number + 2}'; + await myWalletProvider.generateNewDerivation( + context, newDerivationName); Navigator.pushReplacementNamed(context, '/mywallets'); } }, child: Container( - padding: EdgeInsets.symmetric(horizontal: scaleSize(16), vertical: scaleSize(12)), + padding: EdgeInsets.symmetric( + horizontal: scaleSize(16), vertical: scaleSize(12)), child: Row( crossAxisAlignment: CrossAxisAlignment.center, children: [ Icon( Icons.add_circle_outline, size: scaleSize(24), - color: sub.nodeConnected ? Color(0xFF4CAF50).withValues(alpha: 0.8) : Colors.grey[400], + color: Durt.i.isConnected + ? Color(0xFF4CAF50).withValues(alpha: 0.8) + : Colors.grey[400], ), ScaledSizedBox(width: 16), Expanded( @@ -494,7 +564,9 @@ Widget aloneWalletOptions() { 'createNewWallet'.tr(), style: scaledTextStyle( fontSize: 16, - color: sub.nodeConnected ? Colors.black87 : Colors.grey[500], + color: Durt.i.isConnected + ? Colors.black87 + : Colors.grey[500], ), softWrap: true, ), @@ -513,7 +585,8 @@ Widget aloneWalletOptions() { ); }, child: Container( - padding: EdgeInsets.symmetric(horizontal: scaleSize(16), vertical: scaleSize(12)), + padding: EdgeInsets.symmetric( + horizontal: scaleSize(16), vertical: scaleSize(12)), child: Row( children: [ SvgPicture.asset( diff --git a/lib/screens/myWallets/wallets_home.dart b/lib/screens/myWallets/wallets_home.dart index 882ed481fd37ac93d7572d7b4a1834449e24b7c1..80bd603a49b871fe1c0f260e63f49a769c958662 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'; @@ -27,13 +27,17 @@ class WalletsHome extends StatefulWidget { State<WalletsHome> createState() => _WalletsHomeState(); } -class _WalletsHomeState extends State<WalletsHome> with SingleTickerProviderStateMixin { +class _WalletsHomeState extends State<WalletsHome> + with SingleTickerProviderStateMixin { @override Widget build(BuildContext context) { - final myWalletProvider = Provider.of<MyWalletsProvider>(context, listen: false); + final myWalletProvider = + Provider.of<MyWalletsProvider>(context, listen: false); return Scaffold( - body: myWalletProvider.listWallets.length == 1 ? WalletOptions(wallet: myWalletProvider.listWallets[0]) : _WalletsHomeContent(), + body: myWalletProvider.listWallets.length == 1 + ? WalletOptions(wallet: myWalletProvider.listWallets[0]) + : _WalletsHomeContent(), ); } } @@ -41,9 +45,11 @@ class _WalletsHomeState extends State<WalletsHome> with SingleTickerProviderStat 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 myWalletProvider = + Provider.of<MyWalletsProvider>(context, listen: false); + final currentChestNumber = myWalletProvider.getCurrentSafe; + final SafeBox currentChest = + Durt.i.walletService.safeBox.get(currentChestNumber)!; return Scaffold( backgroundColor: backgroundColor, @@ -52,18 +58,22 @@ 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!, - style: scaledTextStyle(color: Colors.grey[850], fontSize: 16, fontWeight: FontWeight.w500), + currentChest.name, + style: scaledTextStyle( + color: Colors.grey[850], + fontSize: 16, + fontWeight: FontWeight.w500), ), ], ), ), - bottomNavigationBar: Consumer<MyWalletsProvider>(builder: (context, _, __) { + bottomNavigationBar: + Consumer<MyWalletsProvider>(builder: (context, _, __) { return myWalletProvider.lastFlyBy == null ? const GeckoBottomAppBar( actualRoute: 'safeHome', @@ -83,7 +93,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(''); @@ -122,7 +132,8 @@ class _WalletsHomeContent extends StatelessWidget { Text( 'explainDraggableWallet'.tr(), textAlign: TextAlign.center, - style: scaledTextStyle(fontSize: 16, fontWeight: FontWeight.w500), + style: scaledTextStyle( + fontSize: 16, fontWeight: FontWeight.w500), ), ], )) @@ -138,7 +149,8 @@ class _WalletsHomeContent extends StatelessWidget { ); // configBox.delete('showDraggableTutorial'); - final bool showDraggableTutorial = configBox.get('showDraggableTutorial') ?? true; + final bool showDraggableTutorial = + configBox.get('showDraggableTutorial') ?? true; if (myWalletProvider.listWallets.length > 1 && showDraggableTutorial) { tutorialCoachMark.show(context: context); @@ -156,16 +168,25 @@ class _WalletsHomeContent extends StatelessWidget { child: WalletTileMembre(wallet: myWalletProvider.idtyWallet!), ), ), - SliverGrid.count(key: keyListWallets, crossAxisCount: nTule, childAspectRatio: 1, crossAxisSpacing: 0, mainAxisSpacing: 0, children: <Widget>[ - for (final repository in myWalletProvider.listWalletsWithoutIdty) - DragTuleAction( - wallet: repository, - child: WalletTile(repository: repository), - ), - Consumer<SubstrateSdk>(builder: (context, sub, _) { - return sub.nodeConnected && myWalletProvider.listWallets.length < maxWalletsInSafe ? const AddNewDerivationButton() : const Text(''); - }), - ]), + SliverGrid.count( + key: keyListWallets, + crossAxisCount: nTule, + childAspectRatio: 1, + crossAxisSpacing: 0, + mainAxisSpacing: 0, + children: <Widget>[ + for (final repository in myWalletProvider.listWalletsWithoutIdty) + DragTuleAction( + wallet: repository, + child: WalletTile(repository: repository), + ), + Consumer<SubstrateSdk>(builder: (context, sub, _) { + return Durt.i.isConnected && + myWalletProvider.listWallets.length < maxWalletsInSafe + ? const AddNewDerivationButton() + : const Text(''); + }), + ]), const SliverToBoxAdapter(child: ChestOptionsButtons()), ]), ); diff --git a/lib/screens/onBoarding/10.dart b/lib/screens/onBoarding/10.dart index 96f98e2de72886f751c542ebde1d2d0d7cd2d2e6..619ca93fedfcd853bf9744d29b2d1d483357fbe7 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'; @@ -44,18 +44,19 @@ class _OnboardingStepTenState extends State<OnboardingStepTen> { bool hasError = false; late final FocusNode pinFocus; late final TextEditingController enterPin; + final generateWalletProvider = Provider.of<GenerateWalletsProvider>(homeContext); @override void initState() { super.initState(); pinFocus = FocusNode(debugLabel: 'pinFocusNode10'); enterPin = TextEditingController(); + generateWalletProvider.scanStatus = ScanDerivationsStatus.none; } @override Widget build(BuildContext context) { final walletOptions = Provider.of<WalletOptionsProvider>(context); - final sub = Provider.of<SubstrateSdk>(context); final myWalletProvider = Provider.of<MyWalletsProvider>(context, listen: false); final pinLenght = widget.pinCode.length; @@ -88,7 +89,7 @@ class _OnboardingStepTenState extends State<OnboardingStepTen> { }), ScaledSizedBox(height: isTall ? 20 : 0), Consumer<SubstrateSdk>(builder: (context, sub, _) { - return sub.nodeConnected + return Durt.i.isConnected ? pinForm(context, walletOptions, pinLenght, 1, 2) : Row(mainAxisAlignment: MainAxisAlignment.center, children: [ Text( @@ -103,7 +104,7 @@ class _OnboardingStepTenState extends State<OnboardingStepTen> { ]); }), Consumer<WalletOptionsProvider>(builder: (context, walletOptions, _) { - return sub.nodeConnected + return Durt.i.isConnected ? InkWell( key: keyCachePassword, onTap: () { @@ -136,10 +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.i.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.i.walletService.importRootWallet(pinCode: widget.pinCode); + final address = Durt.i.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.i.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.i.walletService.getAddress(defaultWallet.address); + await Durt.i.walletService.setDefaultWallet(address); + } await Navigator.push( context, diff --git a/lib/screens/onBoarding/5.dart b/lib/screens/onBoarding/5.dart index b83780fcda05a74f785f5c950cd362df9556e6a8..8dfd761e07fceee3f0bc6ddcaf63839b236a04df 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/settings.dart b/lib/screens/settings.dart index 7170563015f42f3fdfb277372e0045eedea7e1f3..5ff588f8b8bd29c508d3676da59c46b3b7869d55 100644 --- a/lib/screens/settings.dart +++ b/lib/screens/settings.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/models/scale_functions.dart'; @@ -41,7 +42,9 @@ class _SettingsScreenState extends State<SettingsScreen> { final duniterIndexer = Provider.of<DuniterIndexer>(context, listen: false); _endpointController = TextEditingController( - text: configBox.containsKey('customEndpoint') ? configBox.get('customEndpoint') : sub.getConnectedEndpoint() ?? 'wss://', + text: configBox.containsKey('customEndpoint') + ? configBox.get('customEndpoint') + : sub.getConnectedEndpoint() ?? 'wss://', ); _indexerEndpointController = TextEditingController( @@ -60,7 +63,7 @@ class _SettingsScreenState extends State<SettingsScreen> { final duniterIndexer = Provider.of<DuniterIndexer>(context); // Mise à jour du champ node quand le nœud est connecté - if (sub.nodeConnected && !configBox.containsKey('customEndpoint')) { + if (Durt.i.isConnected && !configBox.containsKey('customEndpoint')) { final endpoint = sub.getConnectedEndpoint(); if (endpoint != null && endpoint != _endpointController.text) { _endpointController.text = endpoint; @@ -68,7 +71,8 @@ class _SettingsScreenState extends State<SettingsScreen> { } // Mise à jour du champ indexer quand il devient disponible - if (duniterIndexer.listIndexerEndpoints.isNotEmpty && !configBox.containsKey('customIndexer')) { + if (duniterIndexer.listIndexerEndpoints.isNotEmpty && + !configBox.containsKey('customIndexer')) { final indexerEndpoint = duniterIndexer.listIndexerEndpoints[0]; if (indexerEndpoint != _indexerEndpointController.text) { _indexerEndpointController.text = indexerEndpoint; @@ -129,7 +133,8 @@ class _SettingsScreenState extends State<SettingsScreen> { child: Column( children: [ Padding( - padding: EdgeInsets.all(scaleSize(isSmallScreen ? 10 : 14)), + padding: + EdgeInsets.all(scaleSize(isSmallScreen ? 10 : 14)), child: chooseCurrencyUnit(context), ), ], @@ -176,7 +181,8 @@ class _SettingsScreenState extends State<SettingsScreen> { } }, child: Padding( - padding: EdgeInsets.all(scaleSize(isSmallScreen ? 10 : 14)), + padding: + EdgeInsets.all(scaleSize(isSmallScreen ? 10 : 14)), child: Row( children: [ Icon( @@ -226,7 +232,8 @@ class _SettingsScreenState extends State<SettingsScreen> { child: Column( children: [ Padding( - padding: EdgeInsets.all(scaleSize(isSmallScreen ? 10 : 14)), + padding: + EdgeInsets.all(scaleSize(isSmallScreen ? 10 : 14)), child: duniterEndpointSelection(context), ), ], @@ -250,7 +257,8 @@ class _SettingsScreenState extends State<SettingsScreen> { child: Column( children: [ Padding( - padding: EdgeInsets.all(scaleSize(isSmallScreen ? 10 : 14)), + padding: + EdgeInsets.all(scaleSize(isSmallScreen ? 10 : 14)), child: indexerEndpointSelection(context), ), ], @@ -274,7 +282,8 @@ class _SettingsScreenState extends State<SettingsScreen> { decoration: BoxDecoration( color: Colors.white, borderRadius: BorderRadius.circular(12), - border: Border.all(color: const Color(0xffD80000).withValues(alpha: 0.1)), + border: Border.all( + color: const Color(0xffD80000).withValues(alpha: 0.1)), boxShadow: [ BoxShadow( color: Colors.black.withValues(alpha: 0.05), @@ -290,7 +299,8 @@ class _SettingsScreenState extends State<SettingsScreen> { await _myWallets.deleteAllWallet(context); }, child: Padding( - padding: EdgeInsets.all(scaleSize(isSmallScreen ? 10 : 14)), + padding: + EdgeInsets.all(scaleSize(isSmallScreen ? 10 : 14)), child: Row( children: [ Icon( @@ -363,7 +373,11 @@ class _SettingsScreenState extends State<SettingsScreen> { ); } - Future<void> _showNodeSelectionDialog(BuildContext context, List<NetworkParams> nodes, String selectedEndpoint, TextEditingController controller) async { + Future<void> _showNodeSelectionDialog( + BuildContext context, + List<NetworkParams> nodes, + String selectedEndpoint, + TextEditingController controller) async { final sub = Provider.of<SubstrateSdk>(context, listen: false); final set = Provider.of<SettingsProvider>(context, listen: false); @@ -397,7 +411,9 @@ class _SettingsScreenState extends State<SettingsScreen> { mainAxisSize: MainAxisSize.min, children: [ Icon( - isSelected ? Icons.radio_button_checked : Icons.radio_button_unchecked, + isSelected + ? Icons.radio_button_checked + : Icons.radio_button_unchecked, color: isSelected ? orangeC : Colors.grey[400], size: scaleSize(20), ), @@ -440,7 +456,8 @@ class _SettingsScreenState extends State<SettingsScreen> { String? selectedDuniterEndpoint; var duniterBootstrapNodes = sub.getDuniterBootstrap(); - selectedDuniterEndpoint = sub.getConnectedEndpoint() ?? duniterBootstrapNodes.first.endpoint; + selectedDuniterEndpoint = + sub.getConnectedEndpoint() ?? duniterBootstrapNodes.first.endpoint; final customEndpoint = NetworkParams(); customEndpoint.endpoint = 'Personnalisé'; @@ -491,8 +508,12 @@ class _SettingsScreenState extends State<SettingsScreen> { ), ScaledSizedBox(width: 12), Icon( - sub.nodeConnected && !sub.isLoadingEndpoint ? Icons.check_circle : Icons.error, - color: sub.nodeConnected && !sub.isLoadingEndpoint ? Colors.green : Colors.red, + Durt.i.isConnected && !sub.isLoadingEndpoint + ? Icons.check_circle + : Icons.error, + color: Durt.i.isConnected && !sub.isLoadingEndpoint + ? Colors.green + : Colors.red, size: scaleSize(16), ), const Spacer(), @@ -536,8 +557,12 @@ class _SettingsScreenState extends State<SettingsScreen> { child: Row( children: [ Icon( - configBox.get('autoEndpoint') == true ? Icons.radio_button_checked : Icons.radio_button_unchecked, - color: configBox.get('autoEndpoint') == true ? orangeC : Colors.grey[400], + configBox.get('autoEndpoint') == true + ? Icons.radio_button_checked + : Icons.radio_button_unchecked, + color: configBox.get('autoEndpoint') == true + ? orangeC + : Colors.grey[400], size: scaleSize(20), ), ScaledSizedBox(width: 12), @@ -557,8 +582,12 @@ class _SettingsScreenState extends State<SettingsScreen> { child: Row( children: [ Icon( - configBox.get('autoEndpoint') != true ? Icons.radio_button_checked : Icons.radio_button_unchecked, - color: configBox.get('autoEndpoint') != true ? orangeC : Colors.grey[400], + configBox.get('autoEndpoint') != true + ? Icons.radio_button_checked + : Icons.radio_button_unchecked, + color: configBox.get('autoEndpoint') != true + ? orangeC + : Colors.grey[400], size: scaleSize(20), ), ScaledSizedBox(width: 12), @@ -599,7 +628,10 @@ class _SettingsScreenState extends State<SettingsScreen> { await _showNodeSelectionDialog( context, duniterBootstrapNodes - .where((node) => node.endpoint != 'Auto' && node.endpoint != 'Personnalisé' && node.endpoint != 'ws://10.0.2.2:9944') + .where((node) => + node.endpoint != 'Auto' && + node.endpoint != 'Personnalisé' && + node.endpoint != 'ws://10.0.2.2:9944') .toList(), selectedDuniterEndpoint ?? '', endpointController, @@ -612,12 +644,15 @@ class _SettingsScreenState extends State<SettingsScreen> { } else { configBox.put('autoEndpoint', false); if (!configBox.containsKey('customEndpoint')) { - configBox.put('customEndpoint', _endpointController.text); + configBox.put( + 'customEndpoint', _endpointController.text); } set.reload(); _duniterFocusNode.requestFocus(); - _endpointController.selection = TextSelection.fromPosition( - TextPosition(offset: _endpointController.text.length), + _endpointController.selection = + TextSelection.fromPosition( + TextPosition( + offset: _endpointController.text.length), ); } }, @@ -629,7 +664,8 @@ class _SettingsScreenState extends State<SettingsScreen> { if (sub.isLoadingEndpoint) Padding( padding: EdgeInsets.only(top: scaleSize(16)), - child: Center(child: Loading(size: scaleSize(24), stroke: 2)), + child: + Center(child: Loading(size: scaleSize(24), stroke: 2)), ), ], ); @@ -713,7 +749,11 @@ class _SettingsScreenState extends State<SettingsScreen> { ); } - Future<void> _showIndexerSelectionDialog(BuildContext context, List<String> indexers, String selectedEndpoint, TextEditingController controller) async { + Future<void> _showIndexerSelectionDialog( + BuildContext context, + List<String> indexers, + String selectedEndpoint, + TextEditingController controller) async { final duniterIndexer = Provider.of<DuniterIndexer>(context, listen: false); final set = Provider.of<SettingsProvider>(context, listen: false); @@ -747,7 +787,9 @@ class _SettingsScreenState extends State<SettingsScreen> { mainAxisSize: MainAxisSize.min, children: [ Icon( - isSelected ? Icons.radio_button_checked : Icons.radio_button_unchecked, + isSelected + ? Icons.radio_button_checked + : Icons.radio_button_unchecked, color: isSelected ? orangeC : Colors.grey[400], size: scaleSize(20), ), @@ -791,7 +833,9 @@ class _SettingsScreenState extends State<SettingsScreen> { if (configBox.containsKey('customIndexer')) { selectedIndexerEndpoint = configBox.get('customIndexer'); } else { - selectedIndexerEndpoint = duniterIndexer.listIndexerEndpoints.isNotEmpty ? duniterIndexer.listIndexerEndpoints[0] : 'https://'; + selectedIndexerEndpoint = duniterIndexer.listIndexerEndpoints.isNotEmpty + ? duniterIndexer.listIndexerEndpoints[0] + : 'https://'; } final indexerEndpointController = _indexerEndpointController; @@ -868,8 +912,13 @@ class _SettingsScreenState extends State<SettingsScreen> { child: Row( children: [ Icon( - !configBox.containsKey('customIndexer') ? Icons.radio_button_checked : Icons.radio_button_unchecked, - color: !configBox.containsKey('customIndexer') ? orangeC : Colors.grey[400], + !configBox.containsKey('customIndexer') + ? Icons.radio_button_checked + : Icons.radio_button_unchecked, + color: + !configBox.containsKey('customIndexer') + ? orangeC + : Colors.grey[400], size: scaleSize(20), ), ScaledSizedBox(width: 12), @@ -888,8 +937,13 @@ class _SettingsScreenState extends State<SettingsScreen> { child: Row( children: [ Icon( - configBox.containsKey('customIndexer') ? Icons.radio_button_checked : Icons.radio_button_unchecked, - color: configBox.containsKey('customIndexer') ? orangeC : Colors.grey[400], + configBox.containsKey('customIndexer') + ? Icons.radio_button_checked + : Icons.radio_button_unchecked, + color: + configBox.containsKey('customIndexer') + ? orangeC + : Colors.grey[400], size: scaleSize(20), ), ScaledSizedBox(width: 12), @@ -934,19 +988,27 @@ class _SettingsScreenState extends State<SettingsScreen> { ); } else if (value == 'Auto') { configBox.delete('customIndexer'); - final defaultEndpoint = duniterIndexer.listIndexerEndpoints.isNotEmpty ? duniterIndexer.listIndexerEndpoints[0] : 'https://'; + final defaultEndpoint = + duniterIndexer.listIndexerEndpoints.isNotEmpty + ? duniterIndexer.listIndexerEndpoints[0] + : 'https://'; selectedIndexerEndpoint = defaultEndpoint; indexerEndpointController.text = defaultEndpoint; - await indexer.checkIndexerEndpoint(defaultEndpoint); + await indexer + .checkIndexerEndpoint(defaultEndpoint); set.reload(); } else { if (!configBox.containsKey('customIndexer')) { - configBox.put('customIndexer', _indexerEndpointController.text); + configBox.put('customIndexer', + _indexerEndpointController.text); } set.reload(); _indexerFocusNode.requestFocus(); - _indexerEndpointController.selection = TextSelection.fromPosition( - TextPosition(offset: _indexerEndpointController.text.length), + _indexerEndpointController.selection = + TextSelection.fromPosition( + TextPosition( + offset: + _indexerEndpointController.text.length), ); } }, @@ -958,7 +1020,8 @@ class _SettingsScreenState extends State<SettingsScreen> { if (indexer.isLoadingIndexer) Padding( padding: EdgeInsets.only(top: scaleSize(16)), - child: Center(child: Loading(size: scaleSize(24), stroke: 2)), + child: + Center(child: Loading(size: scaleSize(24), stroke: 2)), ), ], ); diff --git a/lib/screens/wallet_view.dart b/lib/screens/wallet_view.dart index b5cf4f155ee38d6f8a3e49c430f1fae9d652d9a2..d0ecaf8dd3989fcefcda16452e778b5241a6e462 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'; @@ -23,7 +24,8 @@ const double buttonSize = 75; const double buttonFontSize = 13; class WalletViewScreen extends StatefulWidget { - const WalletViewScreen({required this.address, required this.username, super.key}); + const WalletViewScreen( + {required this.address, required this.username, super.key}); final String address; final String? username; @@ -44,20 +46,20 @@ 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(); + final walletProfile = + Provider.of<WalletsProfilesProvider>(context, listen: false); walletProfile.address = address; - sub.setCurrentWallet(defaultWallet); + Durt.i.walletService.setDefaultWallet(address); return Scaffold( backgroundColor: backgroundColor, resizeToAvoidBottomInset: true, appBar: WalletAppBar( address: address, - titleBuilder: (username) => username == null ? 'seeAWallet'.tr() : 'memberAccountOf'.tr(args: [username]), + titleBuilder: (username) => username == null + ? 'seeAWallet'.tr() + : 'memberAccountOf'.tr(args: [username]), ), bottomNavigationBar: const GeckoBottomAppBar(), body: SafeArea( @@ -87,7 +89,8 @@ class _WalletViewScreenState extends State<WalletViewScreen> { onTap: () => Navigator.push( context, PageNoTransit( - builder: (context) => ActivityScreen(address: address), + builder: (context) => + ActivityScreen(address: address), ), ), ), @@ -95,11 +98,15 @@ class _WalletViewScreenState extends State<WalletViewScreen> { builder: (context, sub, _) { return FutureBuilder( future: sub.certState(address), - builder: (context, AsyncSnapshot<CertState> snapshot) { - if (!snapshot.hasData) return const SizedBox.shrink(); + builder: (context, + AsyncSnapshot<CertState> snapshot) { + if (!snapshot.hasData) { + return const SizedBox.shrink(); + } final certState = snapshot.data!; return Visibility( - visible: certState.status != CertStatus.none, + visible: + certState.status != CertStatus.none, child: CertStateWidget( certState: certState, address: address, @@ -213,13 +220,15 @@ class _WalletViewScreenState extends State<WalletViewScreen> { ), ), child: Opacity( - opacity: sub.nodeConnected ? 1 : 0.5, + opacity: Durt.i.isConnected ? 1 : 0.5, child: Material( color: Colors.transparent, child: InkWell( key: keyPay, borderRadius: BorderRadius.circular((buttonSize + 5) / 2), - onTap: sub.nodeConnected ? () => _handleTransfer(context) : null, + onTap: Durt.i.isConnected + ? () => _handleTransfer(context) + : null, child: Padding( padding: EdgeInsets.all(scaleSize(15)), child: Image.asset( @@ -237,7 +246,7 @@ class _WalletViewScreenState extends State<WalletViewScreen> { textAlign: TextAlign.center, style: Theme.of(context).textTheme.bodySmall?.copyWith( fontWeight: FontWeight.w500, - color: sub.nodeConnected ? Colors.black87 : Colors.grey[500], + color: Durt.i.isConnected ? Colors.black87 : Colors.grey[500], ), ), ], @@ -246,7 +255,8 @@ class _WalletViewScreenState extends State<WalletViewScreen> { } Future<void> _handleTransfer(BuildContext context) async { - final myWalletProvider = Provider.of<MyWalletsProvider>(context, listen: false); + final myWalletProvider = + Provider.of<MyWalletsProvider>(context, listen: false); final defaultWallet = myWalletProvider.getDefaultWallet(); if (myWalletProvider.pinCode == '') { diff --git a/lib/services/durt.service.dart b/lib/services/durt.service.dart deleted file mode 100644 index e39aa6275a9468fb1662d760379095950ecf4df8..0000000000000000000000000000000000000000 --- 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 061cdce1f626813165df9e9b1c8aced216a2dd5c..0000000000000000000000000000000000000000 --- 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 0e621f350697e7a117dd6f03c13e96276e6d42db..bec9623e11f874a6439c4f3bcc57197e9b2f2999 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 16826844cf8a8523ebd97e02e1bf343cd0843aa6..85f54eeddd32fd0d0927ca24fc69d9c4a96ed503 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 17aaffd72046031cd445f17f3b26a91c29f7960c..195348e95a6c05756a0560ba9ddc75a4d8f812e7 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'; @@ -24,7 +25,8 @@ class CertifyButton extends StatelessWidget { Widget build(BuildContext context) { final duniterIndexer = Provider.of<DuniterIndexer>(context, listen: false); final sub = Provider.of<SubstrateSdk>(context, listen: false); - final myWalletProvider = Provider.of<MyWalletsProvider>(context, listen: false); + final myWalletProvider = + Provider.of<MyWalletsProvider>(context, listen: false); return Column( children: <Widget>[ @@ -44,20 +46,25 @@ class CertifyButton extends StatelessWidget { final result = await showConfirmationDialog( context: context, - title: walletName != null ? 'certification'.tr() : 'identityCreation'.tr(), + title: walletName != null + ? 'certification'.tr() + : 'identityCreation'.tr(), message: message, - type: walletName != null ? ConfirmationDialogType.question : ConfirmationDialogType.info, + type: walletName != null + ? ConfirmationDialogType.question + : ConfirmationDialogType.info, ); if (!result) return; - await sub.setCurrentWallet(myWalletProvider.idtyWallet!); + await Durt.i.walletService.setDefaultWallet(address); if (myWalletProvider.pinCode == '') { await Navigator.push( context, MaterialPageRoute( builder: (homeContext) { - return UnlockingWallet(wallet: myWalletProvider.idtyWallet!); + return UnlockingWallet( + wallet: myWalletProvider.idtyWallet!); }, ), ); @@ -65,7 +72,9 @@ class CertifyButton extends StatelessWidget { if (myWalletProvider.pinCode == '') { return; } - WalletsProfilesProvider walletViewProvider = Provider.of<WalletsProfilesProvider>(context, listen: false); + WalletsProfilesProvider walletViewProvider = + Provider.of<WalletsProfilesProvider>(context, + listen: false); final acc = sub.getCurrentKeyPair(); final transactionId = await sub.certify( acc.address!, @@ -96,7 +105,8 @@ class CertifyButton extends StatelessWidget { child: Text( "certify".tr(), textAlign: TextAlign.center, - style: scaledTextStyle(fontSize: buttonFontSize, fontWeight: FontWeight.w500), + style: scaledTextStyle( + fontSize: buttonFontSize, fontWeight: FontWeight.w500), ), ), ], diff --git a/lib/widgets/commons/offline_info.dart b/lib/widgets/commons/offline_info.dart index 0ace80e91c904c75fdcccaff39696a5cdc1a67e8..6aef7452cfbff72dea51f49d78612d77dbaeee4a 100644 --- a/lib/widgets/commons/offline_info.dart +++ b/lib/widgets/commons/offline_info.dart @@ -1,3 +1,4 @@ +import 'package:durt2/durt2.dart' show Durt; import 'package:easy_localization/easy_localization.dart'; import 'package:flutter/material.dart'; import 'package:gecko/globals.dart'; @@ -14,7 +15,7 @@ class OfflineInfo extends StatelessWidget { final screenWidth = MediaQuery.of(homeContext).size.width; return Consumer<SubstrateSdk>(builder: (context, sub, _) { return Visibility( - visible: !sub.nodeConnected, + visible: !Durt.i.isConnected, child: Positioned( top: 0, child: Container( diff --git a/lib/widgets/contacts_list.dart b/lib/widgets/contacts_list.dart index caa43a35c7eb2fa98c00949e6f979d2c8882578a..d3478d29fa8789b403c5775e034707ebb8823733 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 5fc1e07c87b48d90b8e92f002839b97def69c124..184abd4607c6287f09945ac8e1ca5bf602150d89 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'; @@ -22,7 +22,8 @@ class DragTuleAction extends StatelessWidget { return LongPressDraggable<String>( delay: const Duration(milliseconds: 200), data: wallet.address, - dragAnchorStrategy: (Draggable<Object> _, BuildContext __, Offset ___) => const Offset(55, 55), + dragAnchorStrategy: (Draggable<Object> _, BuildContext __, Offset ___) => + const Offset(55, 55), onDragStarted: () => myWalletProvider.dragAddress = wallet, onDragEnd: (_) { myWalletProvider.lastFlyBy = null; @@ -43,10 +44,12 @@ class DragTuleAction extends StatelessWidget { ), child: DragTarget<String>( onAcceptWithDetails: (senderAddress) async { - final walletData = myWalletProvider.getWalletDataByAddress(senderAddress.data); - await sub.setCurrentWallet(walletData!); + final walletData = + myWalletProvider.getWalletDataByAddress(senderAddress.data); + await Durt.i.walletService.setDefaultWallet(walletData!.address); sub.reload(); - paymentPopup(context, wallet.address, g1WalletsBox.get(wallet.address)!.username ?? wallet.name!); + paymentPopup(context, wallet.address, + g1WalletsBox.get(wallet.address)!.username ?? wallet.name!); }, onMove: (details) { if (wallet.address != myWalletProvider.lastFlyBy?.address) { @@ -54,7 +57,8 @@ class DragTuleAction extends StatelessWidget { myWalletProvider.reload(); } }, - onWillAcceptWithDetails: (senderAddress) => senderAddress.data != wallet.address, + onWillAcceptWithDetails: (senderAddress) => + senderAddress.data != wallet.address, builder: ( BuildContext context, List<dynamic> accepted, diff --git a/lib/widgets/drag_wallets_info.dart b/lib/widgets/drag_wallets_info.dart index c02c288e638fbd4b45edfffafca3b36ad6af6546..e567f258e00c0e30b448ce61121f2825f5c58be6 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 a9fda4baa9c94623b3d3676c74a708f96ad3b751..bd221e0a25b5acc566b969e7f18c842d1f478e6e 100644 --- a/lib/widgets/idty_status.dart +++ b/lib/widgets/idty_status.dart @@ -1,21 +1,22 @@ +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'; import 'package:provider/provider.dart'; class IdentityStatus extends StatelessWidget { - const IdentityStatus({super.key, required this.address, this.color = Colors.black}); + const IdentityStatus( + {super.key, required this.address, this.color = Colors.black}); final String address; final Color color; @override Widget build(BuildContext context) { - final walletData = walletBox.get(address) ?? WalletData(address: address); + final walletData = Durt.i.walletService.walletDataBox.get(address) ?? + WalletData(address: address); return Consumer<SubstrateSdk>(builder: (context, sub, _) { return FutureBuilder( @@ -25,21 +26,31 @@ class IdentityStatus extends StatelessWidget { if (snapshot.data != null && !snapshot.hasError) { final resStatus = snapshot.data!.first; walletData.identityStatus = resStatus; - walletBox.put(address, walletData); + Durt.i.walletService.walletDataBox.put(address, walletData); } final resStatus = walletData.identityStatus; - final nameByAddress = resStatus == IdtyStatus.member - ? 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 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,21 +59,27 @@ 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)), ], ); }); }); } - AnimatedFadeOutIn showText(String text, {double size = 18, bool bold = false}) { + AnimatedFadeOutIn showText(String text, + {double size = 18, bool bold = false}) { return AnimatedFadeOutIn<String>( data: text, duration: const Duration(milliseconds: 150), builder: (value) => Text( value, textAlign: TextAlign.center, - style: TextStyle(fontSize: size, color: bold ? color : Colors.black, fontWeight: bold ? FontWeight.w500 : FontWeight.w400), + style: TextStyle( + fontSize: size, + color: bold ? color : Colors.black, + fontWeight: bold ? FontWeight.w500 : FontWeight.w400), ), ); } diff --git a/lib/widgets/name_by_address.dart b/lib/widgets/name_by_address.dart index 49ee3ba85da9c351da8202b704b77b9d0018736a..ca2724bca0ab147a197c8a60819416b66b907562 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 7e2cc0a38a70ebf723876016adf7394553eb7585..9727898f8e96f4db0328f24dbb77469056ad50ec 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'; @@ -21,8 +21,10 @@ import 'package:url_launcher/url_launcher.dart'; import 'package:uuid/uuid.dart'; void paymentPopup(BuildContext context, String toAddress, String? username) { - final walletViewProvider = Provider.of<WalletsProfilesProvider>(context, listen: false); - final myWalletProvider = Provider.of<MyWalletsProvider>(context, listen: false); + final walletViewProvider = + Provider.of<WalletsProfilesProvider>(context, listen: false); + final myWalletProvider = + Provider.of<MyWalletsProvider>(context, listen: false); double fees = 0; const double shapeSize = 16; @@ -77,12 +79,16 @@ void paymentPopup(BuildContext context, String toAddress, String? username) { if (payAmount.isEmpty) return false; // Récupération des soldes - final walletOptions = Provider.of<WalletOptionsProvider>(context, listen: false); - final defaultWalletBalance = walletOptions.balanceCache[defaultWallet.address] ?? 0; + final walletOptions = + Provider.of<WalletOptionsProvider>(context, listen: false); + final defaultWalletBalance = + walletOptions.balanceCache[defaultWallet.address] ?? 0; final toAddressBalance = walletOptions.balanceCache[toAddress] ?? 0; // Conversion du montant en unités de base - final int payAmountValue = balanceRatio == 1 ? (double.parse(payAmount) * balanceRatio * 100).round() : (double.parse(payAmount) * balanceRatio).round(); + final int payAmountValue = balanceRatio == 1 + ? (double.parse(payAmount) * balanceRatio * 100).round() + : (double.parse(payAmount) * balanceRatio).round(); // TODO: récupérer la valeur réelle de l'existential deposit depuis le storage de Duniter const existentialDeposit = 200; @@ -90,13 +96,20 @@ void paymentPopup(BuildContext context, String toAddress, String? username) { // Vérifications de validité final bool isAmountValid = payAmountValue > 0; final bool isNotSendingToSelf = toAddress != defaultWallet.address; - final bool hasEnoughBalance = payAmountValue <= defaultWalletBalance - existentialDeposit || defaultWalletBalance == payAmountValue; - final bool respectsExistentialDeposit = toAddressBalance > 0 || payAmountValue >= existentialDeposit; + final bool hasEnoughBalance = + payAmountValue <= defaultWalletBalance - existentialDeposit || + defaultWalletBalance == payAmountValue; + final bool respectsExistentialDeposit = + toAddressBalance > 0 || payAmountValue >= existentialDeposit; - return isAmountValid && isNotSendingToSelf && hasEnoughBalance && respectsExistentialDeposit; + return isAmountValid && + isNotSendingToSelf && + hasEnoughBalance && + respectsExistentialDeposit; } - myWalletProvider.readAllWallets().then((value) => myWalletProvider.listWallets.sort((a, b) => (a.derivation ?? -1).compareTo(b.derivation ?? -1))); + myWalletProvider.readAllWallets().then((value) => myWalletProvider.listWallets + .sort((a, b) => (a.derivation ?? -1).compareTo(b.derivation ?? -1))); showModalBottomSheet<void>( shape: const RoundedRectangleBorder( @@ -112,7 +125,8 @@ void paymentPopup(BuildContext context, String toAddress, String? username) { // Si l'écran est trop petit, on utilisera 90% de sa hauteur. final screenHeight = MediaQuery.of(context).size.height; final double desiredHeight = scaleSize(380); - final double bottomSheetHeight = screenHeight < desiredHeight ? screenHeight * 0.9 : desiredHeight; + final double bottomSheetHeight = + screenHeight < desiredHeight ? screenHeight * 0.9 : desiredHeight; final sub = Provider.of<SubstrateSdk>(homeContext, listen: false); @@ -121,7 +135,8 @@ void paymentPopup(BuildContext context, String toAddress, String? username) { canValidate = canValidatePayment(); final bool isUdUnit = configBox.get('isUdUnit') ?? false; return Padding( - padding: EdgeInsets.only(bottom: MediaQuery.of(context).viewInsets.bottom), + padding: EdgeInsets.only( + bottom: MediaQuery.of(context).viewInsets.bottom), child: Container( // On fixe la hauteur maximale du bottom sheet height: bottomSheetHeight, @@ -156,7 +171,8 @@ void paymentPopup(BuildContext context, String toAddress, String? username) { children: [ Text( 'executeATransfer'.tr(), - style: scaledTextStyle(fontSize: 17, fontWeight: FontWeight.w700), + style: scaledTextStyle( + fontSize: 17, fontWeight: FontWeight.w700), ), IconButton( key: keyPopButton, @@ -171,14 +187,20 @@ void paymentPopup(BuildContext context, String toAddress, String? username) { ScaledSizedBox(height: 4), Text( 'from'.tr(args: ['']), - style: scaledTextStyle(fontSize: 14, fontWeight: FontWeight.w500, color: Colors.grey[600]), + style: scaledTextStyle( + fontSize: 14, + fontWeight: FontWeight.w500, + color: Colors.grey[600]), ), ScaledSizedBox(height: 4), Consumer<SubstrateSdk>(builder: (context, sub, _) { return Container( decoration: BoxDecoration( - border: Border.all(color: Colors.blueAccent.shade200, width: 1.5), - borderRadius: const BorderRadius.all(Radius.circular(8)), + border: Border.all( + color: Colors.blueAccent.shade200, + width: 1.5), + borderRadius: + const BorderRadius.all(Radius.circular(8)), ), alignment: Alignment.center, padding: const EdgeInsets.all(0), @@ -189,17 +211,21 @@ void paymentPopup(BuildContext context, String toAddress, String? username) { value: defaultWallet, menuMaxHeight: scaleSize(270), onTap: () { - FocusScope.of(context).requestFocus(amountFocus); + FocusScope.of(context) + .requestFocus(amountFocus); }, selectedItemBuilder: (_) { - return myWalletProvider.listWallets.map((WalletData wallet) { + return myWalletProvider.listWallets + .map((WalletData wallet) { return Container( width: scaleSize(isTall ? 315 : 310), padding: EdgeInsets.all(scaleSize(7)), child: Visibility( - visible: wallet.address == defaultWallet.address, + visible: wallet.address == + defaultWallet.address, child: Row( - mainAxisAlignment: MainAxisAlignment.center, + mainAxisAlignment: + MainAxisAlignment.center, children: [ NameByAddress( wallet: wallet, @@ -207,21 +233,26 @@ void paymentPopup(BuildContext context, String toAddress, String? username) { size: 16, ), const Spacer(), - Balance(address: wallet.address, size: 16), + Balance( + address: wallet.address, + size: 16), ], ), ), ); }).toList(); }, - onChanged: (WalletData? newSelectedWallet) async { + onChanged: + (WalletData? newSelectedWallet) async { defaultWallet = newSelectedWallet!; - await sub.setCurrentWallet(newSelectedWallet); + await Durt.i.walletService.setDefaultWallet( + newSelectedWallet.address); sub.reload(); amountFocus.requestFocus(); setState(() {}); }, - items: myWalletProvider.listWallets.map((WalletData wallet) { + items: myWalletProvider.listWallets + .map((WalletData wallet) { return DropdownMenuItem( value: wallet, key: keySelectThisWallet(wallet.address), @@ -230,7 +261,8 @@ void paymentPopup(BuildContext context, String toAddress, String? username) { width: scaleSize(isTall ? 315 : 310), padding: const EdgeInsets.all(10), child: Row( - mainAxisAlignment: MainAxisAlignment.center, + mainAxisAlignment: + MainAxisAlignment.center, children: [ NameByAddress( wallet: wallet, @@ -238,7 +270,9 @@ void paymentPopup(BuildContext context, String toAddress, String? username) { size: 16, ), const Spacer(), - Balance(address: wallet.address, size: 16), + Balance( + address: wallet.address, + size: 16), ], ), ), @@ -252,12 +286,16 @@ void paymentPopup(BuildContext context, String toAddress, String? username) { children: [ Text( 'to'.tr(args: ['']), - style: scaledTextStyle(fontSize: 15, fontWeight: FontWeight.w500, color: Colors.grey[600]), + style: scaledTextStyle( + fontSize: 15, + fontWeight: FontWeight.w500, + color: Colors.grey[600]), ), ScaledSizedBox(width: 10), Text( username ?? getShortPubkey(toAddress), - style: scaledTextStyle(fontSize: 17, fontWeight: FontWeight.w600), + style: scaledTextStyle( + fontSize: 17, fontWeight: FontWeight.w600), ), ], ), @@ -266,7 +304,10 @@ void paymentPopup(BuildContext context, String toAddress, String? username) { children: [ Text( 'amount'.tr(), - style: scaledTextStyle(fontSize: 15, fontWeight: FontWeight.w500, color: Colors.grey[600]), + style: scaledTextStyle( + fontSize: 15, + fontWeight: FontWeight.w500, + color: Colors.grey[600]), ), const Spacer(), if (fees > 0) @@ -274,10 +315,14 @@ void paymentPopup(BuildContext context, String toAddress, String? username) { onTap: () => infoFeesPopup(context), child: Row( children: [ - Icon(Icons.info_outlined, color: orangeC, size: scaleSize(21)), + Icon(Icons.info_outlined, + color: orangeC, size: scaleSize(21)), ScaledSizedBox(width: 5), Text( - 'fees'.tr(args: [fees.toString(), currencyName]), + 'fees'.tr(args: [ + fees.toString(), + currencyName + ]), style: scaledTextStyle( color: orangeC, fontSize: 13, @@ -295,7 +340,8 @@ void paymentPopup(BuildContext context, String toAddress, String? username) { onFocusChange: (focused) { if (!commentFocus.hasFocus) { setState(() { - FocusScope.of(context).requestFocus(amountFocus); + FocusScope.of(context) + .requestFocus(amountFocus); }); } }, @@ -315,18 +361,25 @@ void paymentPopup(BuildContext context, String toAddress, String? username) { maxLines: 1, textAlign: TextAlign.center, autocorrect: false, - keyboardType: const TextInputType.numberWithOptions(decimal: true), + keyboardType: + const TextInputType.numberWithOptions( + decimal: true), onChanged: (_) async { fees = await sub.txFees( defaultWallet.address, toAddress, - double.parse(walletViewProvider.payAmount.text == '' ? '0' : walletViewProvider.payAmount.text), + double.parse( + walletViewProvider.payAmount.text == '' + ? '0' + : walletViewProvider.payAmount.text), ); setState(() {}); }, inputFormatters: <TextInputFormatter>[ - FilteringTextInputFormatter.deny(',', replacementString: '.'), - FilteringTextInputFormatter.allow(RegExp(r'(^\d+\.?\d{0,2})')), + FilteringTextInputFormatter.deny(',', + replacementString: '.'), + FilteringTextInputFormatter.allow( + RegExp(r'(^\d+\.?\d{0,2})')), ], decoration: InputDecoration( hintText: '0.00', @@ -337,20 +390,27 @@ void paymentPopup(BuildContext context, String toAddress, String? username) { filled: true, fillColor: Colors.transparent, focusedBorder: OutlineInputBorder( - borderSide: BorderSide(color: Colors.grey[500]!, width: 1.5), + borderSide: BorderSide( + color: Colors.grey[500]!, width: 1.5), borderRadius: BorderRadius.circular(8), ), contentPadding: EdgeInsets.all(scaleSize(6)), ), - style: scaledTextStyle(fontSize: 22, color: Colors.black, fontWeight: FontWeight.w600), + style: scaledTextStyle( + fontSize: 22, + color: Colors.black, + fontWeight: FontWeight.w600), ), ), - if (walletViewProvider.isCommentVisible) const SizedBox(height: 8), + if (walletViewProvider.isCommentVisible) + const SizedBox(height: 8), Consumer<WalletsProfilesProvider>( builder: (context, provider, _) { return AnimatedCrossFade( duration: const Duration(milliseconds: 200), - crossFadeState: provider.isCommentVisible ? CrossFadeState.showSecond : CrossFadeState.showFirst, + crossFadeState: provider.isCommentVisible + ? CrossFadeState.showSecond + : CrossFadeState.showFirst, firstChild: TextButton.icon( style: TextButton.styleFrom( padding: EdgeInsets.symmetric( @@ -365,11 +425,15 @@ void paymentPopup(BuildContext context, String toAddress, String? username) { ), label: Text( 'addComment'.tr(), - style: scaledTextStyle(fontSize: 13, color: Colors.grey[600], fontWeight: FontWeight.w500), + style: scaledTextStyle( + fontSize: 13, + color: Colors.grey[600], + fontWeight: FontWeight.w500), ), onPressed: () { provider.toggleCommentVisibility(); - Future.delayed(const Duration(milliseconds: 250), () { + Future.delayed( + const Duration(milliseconds: 250), () { if (context.mounted) { amountFocus.unfocus(); commentFocus.requestFocus(); @@ -384,19 +448,25 @@ void paymentPopup(BuildContext context, String toAddress, String? username) { TextField( controller: provider.payComment, focusNode: commentFocus, - onChanged: (value) => provider.comment = value, + onChanged: (value) => + provider.comment = value, inputFormatters: [ - Utf8LengthLimitingTextInputFormatter(146), + Utf8LengthLimitingTextInputFormatter( + 146), ], textInputAction: TextInputAction.done, onEditingComplete: () async { - if (canValidate) await executeTransfert(); + if (canValidate) { + await executeTransfert(); + } }, maxLines: 1, - style: scaledTextStyle(fontSize: 13, color: Colors.black87), + style: scaledTextStyle( + fontSize: 13, color: Colors.black87), decoration: InputDecoration( hintText: 'optionalComment'.tr(), - hintStyle: TextStyle(color: Colors.grey[400]), + hintStyle: + TextStyle(color: Colors.grey[400]), filled: true, fillColor: Colors.white.withAlpha(128), contentPadding: EdgeInsets.symmetric( @@ -420,14 +490,16 @@ void paymentPopup(BuildContext context, String toAddress, String? username) { }, ), border: OutlineInputBorder( - borderRadius: BorderRadius.circular(8), + borderRadius: + BorderRadius.circular(8), borderSide: BorderSide( color: Colors.grey[300]!, width: 1, ), ), focusedBorder: OutlineInputBorder( - borderRadius: BorderRadius.circular(8), + borderRadius: + BorderRadius.circular(8), borderSide: BorderSide( color: Colors.grey[400]!, width: 1.5, @@ -458,7 +530,8 @@ void paymentPopup(BuildContext context, String toAddress, String? username) { : null, child: Text( 'executeTheTransfer'.tr(), - style: scaledTextStyle(fontSize: 16, fontWeight: FontWeight.w600), + style: scaledTextStyle( + fontSize: 16, fontWeight: FontWeight.w600), ), ), ), @@ -536,7 +609,8 @@ Future<void> infoFeesPopup(BuildContext context) async { padding: const EdgeInsets.all(8), child: Text( 'gotit'.tr(), - style: scaledTextStyle(fontSize: 20, color: const Color(0xffD80000)), + style: scaledTextStyle( + fontSize: 20, color: const Color(0xffD80000)), ), ), onPressed: () { diff --git a/lib/widgets/search_result_list.dart b/lib/widgets/search_result_list.dart index 752e118c993ccd67235147c9eb0d6a1002ae5692..47c9fe2c80764dde5455260f13ca74b043b1328e 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 fafed280a50f516e2ae5be6c581e298fc804c147..850cec57ed0f1decfa98b5b3029aa8b4216c3fca 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 735c1fc40bbc33ecd43e405022660cb814e1612c..6d9436dc3bcb7844668ddc01d15ebc09e8d40f7f 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 4340ce249c5aa4f82ce656447ffcb0988e2370e6..72e428862568224b7372b72a093c3b82a20ef186 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 7e9f7e1affd69567265ee4203a88a2f56caf6987..4045fd8944e4a28b6bbae3ecc2f38780ac3859d4 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!), ), ), ), diff --git a/pubspec.lock b/pubspec.lock index 9b3be6503ebe772b593525abe70799764ef7e18a..b6bd8d5a3e6b75f4c14a90e543168337a50c6a8f 100644 --- a/pubspec.lock +++ b/pubspec.lock @@ -346,10 +346,10 @@ packages: dependency: transitive description: name: dart_style - sha256: "7306ab8a2359a48d22310ad823521d723acfed60ee1f7e37388e8986853b6820" + sha256: "27eb0ae77836989a3bc541ce55595e8ceee0992807f14511552a898ddd0d88ac" url: "https://pub.dev" source: hosted - version: "2.3.8" + version: "3.0.1" dbus: dependency: transitive description: @@ -393,10 +393,10 @@ packages: durt2: dependency: "direct main" description: - path: "../../durt2" + path: "../durt2" relative: true source: path - version: "0.1.0" + version: "0.2.0" easy_localization: dependency: "direct main" description: @@ -848,10 +848,10 @@ packages: dependency: transitive description: name: graphql - sha256: b90f3faa525fed0d8b57f528af913cf1363e1d77f287004d3a15ce699fa866ee + sha256: "735bbbaa4db10d38054932e726d291bdd46e46e0575cd482a74b0615b8622e1c" url: "https://pub.dev" source: hosted - version: "5.2.0-beta.9" + version: "5.2.1" graphql_flutter: dependency: "direct main" description: @@ -1445,34 +1445,34 @@ packages: dependency: transitive description: name: polkadart - sha256: a3a5d0a3857f1fa4d3413cdeb2cbc3aee8aa8a8860df34236e13350dfe62fe51 + sha256: b2369eeb33ee155dcdf2a7af18de8961037b9cc28640e200f1475cea497bc3ab url: "https://pub.dev" source: hosted - version: "0.6.1" + version: "0.7.1" polkadart_cli: dependency: transitive description: name: polkadart_cli - sha256: a2aaad2fe19edfc7e2ffc7f27a898b6aef3d2e5a0452f75a8351f54e55779852 + sha256: "3c2371134031c518b7728e24fd1b5dbcce98a364c97dd5a89518cccfc7222712" url: "https://pub.dev" source: hosted - version: "0.6.1" + version: "0.7.1" polkadart_keyring: dependency: transitive description: name: polkadart_keyring - sha256: "3bb8b0a8053efc5b722a113f3d12842178a832cd3d0733e00bae10c2246c70db" + sha256: e99a93c845466dfb53e23bf650bd6ccd772d7cefe7c7ff2c93c6e86d387e5215 url: "https://pub.dev" source: hosted - version: "0.6.1" + version: "0.7.0" polkadart_scale_codec: dependency: transitive description: name: polkadart_scale_codec - sha256: "2eec792030deab36e48f035230f235afd3bcf2db4cd4490c9c1f6a51b57594b2" + sha256: db0d61adc58d8b395e663558ba6b2aed2ab2291d343733c49c693de62a2498d2 url: "https://pub.dev" source: hosted - version: "1.4.2" + version: "1.5.0" polkawallet_sdk: dependency: "direct main" description: @@ -1776,13 +1776,13 @@ packages: source: sdk version: "0.0.0" source_gen: - dependency: transitive + dependency: "direct overridden" description: name: source_gen - sha256: "14658ba5f669685cd3d63701d01b31ea748310f7ab854e471962670abcf57832" + sha256: "35c8150ece9e8c8d263337a265153c3329667640850b9304861faea59fc98f6b" url: "https://pub.dev" source: hosted - version: "1.5.0" + version: "2.0.0" source_helper: dependency: transitive description: @@ -1811,10 +1811,10 @@ packages: dependency: transitive description: name: sr25519 - sha256: e4495d8c86d90610931693565c16277503a3799da9814f3745b7123b5f85659d + sha256: "122c930a933da6af018ec4a2ccdb853a7d0eb1a0891bfb03467e366b56f86f12" url: "https://pub.dev" source: hosted - version: "0.6.1" + version: "0.7.0" ss58: dependency: transitive description: @@ -1867,18 +1867,18 @@ packages: dependency: transitive description: name: substrate_bip39 - sha256: "256f440b45e33a37a374eb2a6a83ff879ecefb67b28a0b15599f09c8d920f6e3" + sha256: ba880015808079804f40a0fde8c5bff0315ec6792fe3a4281a704e408f1c6bdb url: "https://pub.dev" source: hosted - version: "0.6.1" + version: "0.7.0" substrate_metadata: dependency: transitive description: name: substrate_metadata - sha256: "22d1909dafa574edf279bb46da3cd8e5ce26f8607fd32e40e1371d66dab66c3a" + sha256: "6f9e9e3e1078c0c143dd63824043370b9df582d34c431a759253ce2f9cbb7f13" url: "https://pub.dev" source: hosted - version: "1.4.1" + version: "1.5.0" sync_http: dependency: transitive description: @@ -2111,14 +2111,30 @@ packages: url: "https://pub.dev" source: hosted version: "2.7.3" + web_socket: + dependency: transitive + description: + name: web_socket + sha256: "34d64019aa8e36bf9842ac014bb5d2f5586ca73df5e4d9bf5c936975cae6982c" + url: "https://pub.dev" + source: hosted + version: "1.0.1" web_socket_channel: dependency: transitive description: name: web_socket_channel - sha256: d88238e5eac9a42bb43ca4e721edba3c08c6354d4a53063afaa568516217621b + sha256: d645757fb0f4773d602444000a8131ff5d48c9e47adfe9772652dd1a4f2d45c8 url: "https://pub.dev" source: hosted - version: "2.4.0" + version: "3.0.3" + web_socket_client: + dependency: transitive + description: + name: web_socket_client + sha256: "22264cb5143e9bb55c943d6b051d207fdd6470ffb77ee45778c9a7a0fda100bc" + url: "https://pub.dev" + source: hosted + version: "0.2.0" webdriver: dependency: transitive description: diff --git a/pubspec.yaml b/pubspec.yaml index 4cbc2bd7c4092bac5a5dd59182d7ed6ccd3008c9..22129e9f67b4e5c4d751f248f6543b5fc847b618 100644 --- a/pubspec.yaml +++ b/pubspec.yaml @@ -62,12 +62,14 @@ dependencies: gif_view: ^1.0.2 get_it: ^8.0.3 durt2: - path: ../../durt2 + path: ../durt2 # git: # url: https://git.duniter.org/libs/durt2 dependency_overrides: intl: ^0.19.0 + # To keep compatibility with polkadart_cli and Hive + source_gen: ^2.0.0 dev_dependencies: icons_launcher: ^3.0.0 diff --git a/scripts/generatePartFiles.sh b/scripts/build_runner.sh similarity index 100% rename from scripts/generatePartFiles.sh rename to scripts/build_runner.sh