diff --git a/integration_test/utility/tests_utility.dart b/integration_test/utility/tests_utility.dart index b973e6c..1343f19 100644 --- a/integration_test/utility/tests_utility.dart +++ b/integration_test/utility/tests_utility.dart @@ -136,7 +136,7 @@ Future waitFor(String text, Finder finder = exactMatch ? find.text(text) : find.textContaining(text); log.d('INTEGRATION TEST: Wait for: $text'); - final String searchType = reverse ? 'reversed text' : 'text'; + final searchType = reverse ? 'reversed text' : 'text'; do { if (DateTime.now().isAfter(end)) { diff --git a/lib/models/queries_indexer.dart b/lib/models/queries_indexer.dart index 7de418b..8266682 100644 --- a/lib/models/queries_indexer.dart +++ b/lib/models/queries_indexer.dart @@ -79,3 +79,11 @@ query ($address: String!) { } } '''; + +const String isIdtyExistQ = r''' +query ($name: String!) { + identity(where: {name: {_eq: $name}}) { + name + } +} +'''; diff --git a/lib/providers/duniter_indexer.dart b/lib/providers/duniter_indexer.dart index 0712b22..d5c51da 100644 --- a/lib/providers/duniter_indexer.dart +++ b/lib/providers/duniter_indexer.dart @@ -4,7 +4,6 @@ import 'dart:io'; 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/g1_wallets_list.dart'; import 'package:gecko/models/queries_indexer.dart'; @@ -368,8 +367,8 @@ class DuniterIndexer with ChangeNotifier { transBC.add(i); transBC[i] = []; transBC[i].add(DateTime.parse(transaction['created_at'])); - final int amountBrut = transaction['amount']; - final double amount = removeDecimalZero(amountBrut / 100); + final amountBrut = transaction['amount']; + final amount = removeDecimalZero(amountBrut / 100); if (direction == "RECEIVED") { transBC[i].add(transaction['issuer_pubkey']); transBC[i].add(transaction['issuer']['identity']?['name'] ?? ''); @@ -446,3 +445,25 @@ class DuniterIndexer with ChangeNotifier { // checkHistoryResult( // QueryResult result, FetchMoreOptions options, String address) {} } + +Future isIdtyExist(String name) async { + final httpLink = HttpLink( + '$indexerEndpoint/v1/graphql', + ); + + final GraphQLClient client = GraphQLClient( + cache: GraphQLCache(), + link: httpLink, + ); + + final QueryOptions options = QueryOptions( + document: gql(isIdtyExistQ), + variables: { + 'name': name, + }, + ); + + final QueryResult result = await client.query(options); + + return result.data!['identity']?.isEmpty ?? false ? false : true; +} diff --git a/lib/providers/substrate_sdk.dart b/lib/providers/substrate_sdk.dart index 34a4484..235c4f2 100644 --- a/lib/providers/substrate_sdk.dart +++ b/lib/providers/substrate_sdk.dart @@ -1,6 +1,7 @@ // ignore_for_file: use_build_context_synchronously 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'; @@ -10,6 +11,7 @@ import 'package:gecko/providers/home.dart'; import 'package:gecko/providers/my_wallets.dart'; import 'package:gecko/providers/wallet_options.dart'; import 'package:gecko/providers/wallets_profiles.dart'; +import 'package:pinenacl/ed25519.dart'; import 'package:polkawallet_sdk/api/apiKeyring.dart'; import 'package:polkawallet_sdk/api/types/networkParams.dart'; import 'package:polkawallet_sdk/api/types/txInfoData.dart'; @@ -39,6 +41,7 @@ class SubstrateSdk with ChangeNotifier { TextEditingController csSalt = TextEditingController(); TextEditingController csPassword = TextEditingController(); String g1V1NewAddress = ''; + String g1V1OldPubkey = ''; bool isCesiumIDVisible = false; bool isCesiumAddresLoading = false; late int udValue; @@ -679,6 +682,9 @@ class SubstrateSdk with ChangeNotifier { cryptoType: CryptoType.ed25519, rawSeed: rawSeedHex); + SigningKey rootKey = SigningKey(seed: rawSeed); + g1V1OldPubkey = Base58Encode(rootKey.publicKey); + g1V1NewAddress = newAddress.address!; notifyListeners(); return g1V1NewAddress; diff --git a/lib/providers/wallet_options.dart b/lib/providers/wallet_options.dart index 15ae3a1..ce6555e 100644 --- a/lib/providers/wallet_options.dart +++ b/lib/providers/wallet_options.dart @@ -139,7 +139,7 @@ class WalletOptionsProvider with ChangeNotifier { showText(String text, [double size = 18, bool bold = false, bool smooth = true]) { - log.d('$address $text'); + // log.d('$address $text'); return AnimatedFadeOutIn( data: text, duration: Duration(milliseconds: smooth ? 200 : 0), @@ -224,6 +224,9 @@ class WalletOptionsProvider with ChangeNotifier { final myWalletProvider = Provider.of(context, listen: false); + bool canValidate = false; + bool idtyExist = false; + return showDialog( context: context, barrierDismissible: true, // user must tap button! @@ -240,7 +243,16 @@ class WalletOptionsProvider with ChangeNotifier { const SizedBox(height: 20), TextField( key: keyEnterIdentityUsername, - onChanged: (_) => notifyListeners(), + onChanged: (_) async { + idtyExist = await isIdtyExist(idtyName.text); + canValidate = !idtyExist && + !await isIdtyExist(idtyName.text) && + idtyName.text.length >= 2 && + idtyName.text.length <= 32; + log.d('aaaaaaaaaa: $canValidate'); + + notifyListeners(); + }, inputFormatters: [ // FilteringTextInputFormatter.allow(RegExp("[0-9a-zA-Z]")), FilteringTextInputFormatter.deny(RegExp(r'^ ')), @@ -250,7 +262,12 @@ class WalletOptionsProvider with ChangeNotifier { autofocus: true, controller: idtyName, style: const TextStyle(fontSize: 19), - ) + ), + const SizedBox(height: 10), + Consumer(builder: (context, wOptions, _) { + return Text(idtyExist ? 'Cette identité existe déjà' : '', + style: TextStyle(color: Colors.red[500])); + }) ]), ), actions: [ @@ -261,61 +278,66 @@ class WalletOptionsProvider with ChangeNotifier { builder: (context, wOptions, _) { return TextButton( key: keyConfirm, + onPressed: canValidate + ? () async { + idtyName.text = + idtyName.text.trim().replaceAll(' ', ''); + + if (idtyName.text.length.clamp(3, 32) == + idtyName.text.length) { + WalletData? defaultWallet = + myWalletProvider.getDefaultWallet(); + + String? pin; + if (myWalletProvider.pinCode == '') { + pin = await Navigator.push( + context, + MaterialPageRoute( + builder: (homeContext) { + return UnlockingWallet( + wallet: defaultWallet); + }, + ), + ); + } + if (pin != null || + myWalletProvider.pinCode != '') { + final wallet = myWalletProvider + .getWalletDataByAddress(address.text); + await sub.setCurrentWallet(wallet!); + sub.confirmIdentity(walletOptions.address.text, + idtyName.text, myWalletProvider.pinCode); + Navigator.pop(context); + + Navigator.push( + context, + MaterialPageRoute(builder: (context) { + return TransactionInProgress( + transType: 'comfirmIdty', + fromAddress: + getShortPubkey(wallet.address!), + toAddress: + getShortPubkey(wallet.address!), + ); + }), + ); + } + } + } + : null, child: Text( "validate".tr(), style: TextStyle( - fontSize: 21, - color: idtyName.text.length.clamp(3, 64) == - idtyName.text.length - ? const Color(0xffD80000) - : Colors.grey, - ), + fontSize: 21, + color: canValidate + ? const Color(0xffD80000) + : Colors.grey[500]), ), - onPressed: () async { - idtyName.text = idtyName.text.trim().replaceAll(' ', ''); - - if (idtyName.text.length.clamp(3, 64) == - idtyName.text.length) { - WalletData? defaultWallet = - myWalletProvider.getDefaultWallet(); - - String? pin; - if (myWalletProvider.pinCode == '') { - pin = await Navigator.push( - context, - MaterialPageRoute( - builder: (homeContext) { - return UnlockingWallet(wallet: defaultWallet); - }, - ), - ); - } - if (pin != null || myWalletProvider.pinCode != '') { - final wallet = myWalletProvider - .getWalletDataByAddress(address.text); - await sub.setCurrentWallet(wallet!); - sub.confirmIdentity(walletOptions.address.text, - idtyName.text, myWalletProvider.pinCode); - Navigator.pop(context); - - Navigator.push( - context, - MaterialPageRoute(builder: (context) { - return TransactionInProgress( - transType: 'comfirmIdty', - fromAddress: getShortPubkey(wallet.address!), - toAddress: getShortPubkey(wallet.address!), - ); - }), - ); - } - } - }, ); }) ], ), - const SizedBox(height: 20) + const SizedBox(height: 5) ], ); }, diff --git a/lib/screens/common_elements.dart b/lib/screens/common_elements.dart index 900836c..89d8014 100644 --- a/lib/screens/common_elements.dart +++ b/lib/screens/common_elements.dart @@ -160,7 +160,7 @@ class CommonElements { } Widget offlineInfo(BuildContext context) { - final double screenWidth = MediaQuery.of(homeContext).size.width; + final screenWidth = MediaQuery.of(homeContext).size.width; return Consumer(builder: (context, sub, _) { return Visibility( visible: !sub.nodeConnected, diff --git a/lib/screens/home.dart b/lib/screens/home.dart index 68ac609..55359d6 100644 --- a/lib/screens/home.dart +++ b/lib/screens/home.dart @@ -187,7 +187,7 @@ Widget geckHome(context) { WalletsProfilesProvider historyProvider = Provider.of(context); - final double statusBarHeight = MediaQuery.of(context).padding.top; + final statusBarHeight = MediaQuery.of(context).padding.top; return Container( decoration: const BoxDecoration( image: DecorationImage( @@ -433,7 +433,7 @@ Widget geckHome(context) { } Widget welcomeHome(context) { - final double statusBarHeight = MediaQuery.of(context).padding.top; + final statusBarHeight = MediaQuery.of(context).padding.top; return Container( decoration: const BoxDecoration( diff --git a/lib/screens/myWallets/choose_wallet.dart b/lib/screens/myWallets/choose_wallet.dart index cf60b78..24d4720 100644 --- a/lib/screens/myWallets/choose_wallet.dart +++ b/lib/screens/myWallets/choose_wallet.dart @@ -95,7 +95,7 @@ class ChooseWalletScreen extends StatelessWidget { } List listWallets = myWalletProvider.listWallets; - final double screenWidth = MediaQuery.of(context).size.width; + final screenWidth = MediaQuery.of(context).size.width; int nTule = 2; if (screenWidth >= 900) { diff --git a/lib/screens/myWallets/import_g1_v1.dart b/lib/screens/myWallets/import_g1_v1.dart index 8f22332..b7428ab 100644 --- a/lib/screens/myWallets/import_g1_v1.dart +++ b/lib/screens/myWallets/import_g1_v1.dart @@ -185,13 +185,13 @@ class ImportG1v1 extends StatelessWidget { key: keyCopyAddress, onTap: () { Clipboard.setData( - ClipboardData(text: sub.g1V1NewAddress)); + ClipboardData(text: sub.g1V1OldPubkey)); snackCopyKey(context); }, child: Text( - getShortPubkey(sub.g1V1NewAddress), + sub.g1V1OldPubkey, style: const TextStyle( - fontSize: 20, + fontSize: 16, fontWeight: FontWeight.w600, ), ), diff --git a/lib/screens/myWallets/wallet_options.dart b/lib/screens/myWallets/wallet_options.dart index d47834b..4829e36 100644 --- a/lib/screens/myWallets/wallet_options.dart +++ b/lib/screens/myWallets/wallet_options.dart @@ -45,7 +45,7 @@ class WalletOptions extends StatelessWidget { log.d(walletOptions.address.text); - final int currentChest = myWalletProvider.getCurrentChest(); + final currentChest = myWalletProvider.getCurrentChest(); // final currentWallet = _myWalletProvider.getDefaultWallet(); // log.d(_walletOptions.getAddress(_currentChest, 3)); @@ -325,7 +325,7 @@ class WalletOptions extends StatelessWidget { foregroundColor: Colors.white, elevation: 4, backgroundColor: orangeC, // foreground ), - onPressed: () { + onPressed: () async { walletProvider.confirmIdentityPopup(context); // Navigator.push( // context, @@ -360,7 +360,7 @@ class WalletOptions extends StatelessWidget { } Widget pubkeyWidget(WalletOptionsProvider walletProvider, BuildContext ctx) { - final String shortPubkey = getShortPubkey(walletProvider.address.text); + final shortPubkey = getShortPubkey(walletProvider.address.text); return GestureDetector( key: keyCopyAddress, onTap: () { diff --git a/lib/screens/myWallets/wallets_home.dart b/lib/screens/myWallets/wallets_home.dart index 88d5c19..86b4c03 100644 --- a/lib/screens/myWallets/wallets_home.dart +++ b/lib/screens/myWallets/wallets_home.dart @@ -23,6 +23,7 @@ import 'package:gecko/screens/myWallets/unlocking_wallet.dart'; import 'package:gecko/screens/myWallets/wallet_options.dart'; import 'package:gecko/screens/wallet_view.dart'; import 'package:provider/provider.dart'; +import 'package:flutter_svg/flutter_svg.dart'; class WalletsHome extends StatelessWidget { const WalletsHome({Key? key}) : super(key: key); @@ -33,7 +34,7 @@ class WalletsHome extends StatelessWidget { HomeProvider homeProvider = Provider.of(context, listen: false); - final int currentChestNumber = myWalletProvider.getCurrentChest(); + final currentChestNumber = myWalletProvider.getCurrentChest(); final ChestData currentChest = chestBox.get(currentChestNumber)!; myWalletProvider.listWallets = myWalletProvider.readAllWallets(currentChestNumber); @@ -88,7 +89,7 @@ class WalletsHome extends StatelessWidget { final bool isSameAddress = myWalletProvider.dragAddress == myWalletProvider.lastFlyBy; - final double screenWidth = MediaQuery.of(homeContext).size.width; + final screenWidth = MediaQuery.of(homeContext).size.width; return Container( color: yellowC, width: screenWidth, @@ -138,28 +139,39 @@ class WalletsHome extends StatelessWidget { ), )), const SizedBox(height: 30), - InkWell( - key: keyImportG1v1, - onTap: () { - Navigator.push( - context, - MaterialPageRoute(builder: (context) { - return const ImportG1v1(); - }), - ); - }, - child: SizedBox( - width: 400, - height: 60, - child: Center( - child: Text('importG1v1'.tr(), - style: TextStyle( - fontSize: 22, - color: Colors.blue[900], - fontWeight: FontWeight.w500))), - ), + Row( + mainAxisAlignment: MainAxisAlignment.center, + children: [ + SvgPicture.asset( + 'assets/cesium_bw2.svg', + semanticsLabel: 'CS', + height: 50, + ), + const SizedBox(width: 5), + InkWell( + key: keyImportG1v1, + onTap: () { + Navigator.push( + context, + MaterialPageRoute(builder: (context) { + return const ImportG1v1(); + }), + ); + }, + child: SizedBox( + width: 350, + height: 60, + child: Center( + child: Text('importG1v1'.tr(), + style: TextStyle( + fontSize: 22, + color: Colors.blue[900], + fontWeight: FontWeight.w500))), + ), + ), + ], ), - const SizedBox(height: 5), + const SizedBox(height: 20), InkWell( key: keyChangeChest, onTap: () { @@ -209,7 +221,7 @@ class WalletsHome extends StatelessWidget { List listWallets = myWalletProvider.listWallets; WalletData? defaultWallet = myWalletProvider.getDefaultWallet(); - final double screenWidth = MediaQuery.of(context).size.width; + final screenWidth = MediaQuery.of(context).size.width; int nTule = 2; if (screenWidth >= 900) { diff --git a/lib/screens/onBoarding/10.dart b/lib/screens/onBoarding/10.dart index 89ea95b..0fb0f3a 100644 --- a/lib/screens/onBoarding/10.dart +++ b/lib/screens/onBoarding/10.dart @@ -33,7 +33,7 @@ class OnboardingStepTen extends StatelessWidget { Provider.of(context); final walletOptions = Provider.of(context); CommonElements common = CommonElements(); - final int pinLenght = generateWalletProvider.pin.text.length; + final pinLenght = generateWalletProvider.pin.text.length; return Scaffold( backgroundColor: backgroundColor, @@ -142,7 +142,7 @@ class OnboardingStepTen extends StatelessWidget { Provider.of(context); final sub = Provider.of(context, listen: false); - final int currentChest = myWalletProvider.getCurrentChest(); + final currentChest = myWalletProvider.getCurrentChest(); return Form( key: formKey, diff --git a/lib/screens/onBoarding/11_congratulations.dart b/lib/screens/onBoarding/11_congratulations.dart index ee9dd6e..50411c3 100644 --- a/lib/screens/onBoarding/11_congratulations.dart +++ b/lib/screens/onBoarding/11_congratulations.dart @@ -69,13 +69,13 @@ Widget finishButton(BuildContext context) { // Navigator.pushNamed(homeContext, '/mywallets'); - final tmpConext = homeContext; - Navigator.pushNamedAndRemoveUntil( - context, '/mywallets', (route) => route.isFirst) - .then((value) => homeContext = tmpConext); - + // final tmpConext = homeContext; // Navigator.pushNamedAndRemoveUntil( - // homeContext, '/mywallets', ModalRoute.withName('/')); + // context, '/mywallets', (route) => route.isFirst); + // .then((value) => homeContext = tmpConext); + + Navigator.pushNamedAndRemoveUntil( + homeContext, '/mywallets', ModalRoute.withName('/')); }, child: Text("accessMyChest".tr(), style: diff --git a/lib/screens/search.dart b/lib/screens/search.dart index 5805bdc..50f9009 100644 --- a/lib/screens/search.dart +++ b/lib/screens/search.dart @@ -17,7 +17,7 @@ class SearchScreen extends StatelessWidget { @override Widget build(BuildContext context) { final searchProvider = Provider.of(context); - final double screenHeight = MediaQuery.of(context).size.height; + final screenHeight = MediaQuery.of(context).size.height; // final _homeProvider = // Provider.of(context, listen: false); diff --git a/lib/screens/wallet_view.dart b/lib/screens/wallet_view.dart index 86137a6..3428281 100644 --- a/lib/screens/wallet_view.dart +++ b/lib/screens/wallet_view.dart @@ -161,8 +161,8 @@ class WalletViewScreen extends StatelessWidget { final Duration durationSeconds = Duration( seconds: snapshot.data!['certDelay'] ?? snapshot.data!['certRenewable']!); - final int seconds = durationSeconds.inSeconds; - final int minutes = durationSeconds.inMinutes; + final seconds = durationSeconds.inSeconds; + final minutes = durationSeconds.inMinutes; if (seconds <= 0) { duration = 'seconds'.tr(args: ['0']); @@ -171,8 +171,8 @@ class WalletViewScreen extends StatelessWidget { } else if (seconds <= 3600) { duration = 'minutes'.tr(args: [minutes.toString()]); } else if (seconds <= 86400) { - final int hours = durationSeconds.inHours; - final int minutesLeft = minutes - hours * 60; + final hours = durationSeconds.inHours; + final minutesLeft = minutes - hours * 60; String showMinutes = ''; if (minutesLeft < 60) {} showMinutes = @@ -180,11 +180,10 @@ class WalletViewScreen extends StatelessWidget { duration = 'hours'.tr(args: [hours.toString(), showMinutes]); } else if (seconds <= 2592000) { - final int days = durationSeconds.inDays; + final days = durationSeconds.inDays; duration = 'days'.tr(args: [days.toString()]); } else { - final int months = - (durationSeconds.inDays / 30).round(); + final months = (durationSeconds.inDays / 30).round(); duration = 'months'.tr(args: [months.toString()]); } } diff --git a/pubspec.lock b/pubspec.lock index ca20439..b307928 100644 --- a/pubspec.lock +++ b/pubspec.lock @@ -338,7 +338,7 @@ packages: source: hosted version: "1.3.1" fast_base58: - dependency: transitive + dependency: "direct main" description: name: fast_base58 url: "https://pub.dartlang.org" @@ -429,6 +429,13 @@ packages: url: "https://pub.dartlang.org" source: hosted version: "2.0.7" + flutter_svg: + dependency: "direct main" + description: + name: flutter_svg + url: "https://pub.dartlang.org" + source: hosted + version: "1.1.6" flutter_test: dependency: "direct dev" description: flutter @@ -522,7 +529,7 @@ packages: source: hosted version: "0.2.2+1" graphql: - dependency: transitive + dependency: "direct main" description: name: graphql url: "https://pub.dartlang.org" @@ -841,6 +848,13 @@ packages: url: "https://pub.dartlang.org" source: hosted version: "1.8.2" + path_drawing: + dependency: transitive + description: + name: path_drawing + url: "https://pub.dartlang.org" + source: hosted + version: "1.0.1" path_parsing: dependency: transitive description: @@ -961,7 +975,7 @@ packages: source: hosted version: "7.4.0" pinenacl: - dependency: transitive + dependency: "direct main" description: name: pinenacl url: "https://pub.dartlang.org" diff --git a/pubspec.yaml b/pubspec.yaml index d3ee49d..3b468c6 100644 --- a/pubspec.yaml +++ b/pubspec.yaml @@ -18,7 +18,7 @@ dependencies: bubble: ^1.2.1 carousel_slider: ^4.0.0 flutter_lints: ^2.0.1 - graphql_flutter: ^5.1.1-beta.3 + graphql_flutter: ^5.1.1-beta.4 hive_flutter: ^1.1.0 image_picker: ^0.8.4 jdenticon_dart: ^2.0.0 @@ -58,6 +58,10 @@ dependencies: hex: ^0.2.0 flutter_dotenv: ^5.0.2 accordion: ^2.5.1 + flutter_svg: ^1.1.6 + pinenacl: ^0.3.3 + fast_base58: ^0.2.1 + graphql: ^5.1.1 dev_dependencies: # flutter_launcher_icons: ^0.9.2