From 806a96d1274d99366812aade41d813e2c3c0b4a5 Mon Sep 17 00:00:00 2001 From: poka Date: Sat, 3 Dec 2022 08:44:44 +0100 Subject: [PATCH] activity screen: add gdev start time delimiter --- lib/globals.dart | 3 ++ lib/models/queries_indexer.dart | 9 ++++ lib/providers/duniter_indexer.dart | 29 +++++++---- lib/providers/substrate_sdk.dart | 77 +++++++++++++++++++++++++++++- lib/screens/activity.dart | 22 +++++++++ lib/widgets/header_profile.dart | 1 + pubspec.yaml | 2 +- 7 files changed, 132 insertions(+), 11 deletions(-) diff --git a/lib/globals.dart b/lib/globals.dart index 012c6a5..6b026f0 100644 --- a/lib/globals.dart +++ b/lib/globals.dart @@ -50,3 +50,6 @@ const debugPin = true; String indexerEndpoint = ''; late double balanceRatio; late int udValue; + +// Indexer +late DateTime startBlockchainTime; diff --git a/lib/models/queries_indexer.dart b/lib/models/queries_indexer.dart index 8266682..e1987fe 100644 --- a/lib/models/queries_indexer.dart +++ b/lib/models/queries_indexer.dart @@ -87,3 +87,12 @@ query ($name: String!) { } } '''; + +const String getBlockchainStartQ = r''' +query { + block(limit: 1) { + created_at + number + } +} +'''; diff --git a/lib/providers/duniter_indexer.dart b/lib/providers/duniter_indexer.dart index d5c51da..644203b 100644 --- a/lib/providers/duniter_indexer.dart +++ b/lib/providers/duniter_indexer.dart @@ -446,7 +446,24 @@ class DuniterIndexer with ChangeNotifier { // QueryResult result, FetchMoreOptions options, String address) {} } +//// Manuals queries + Future isIdtyExist(String name) async { + final variables = { + 'name': name, + }; + final result = await _execQuery(isIdtyExistQ, variables); + return result.data!['identity']?.isEmpty ?? false ? false : true; +} + +Future getBlockStart() async { + final result = await _execQuery(getBlockchainStartQ, {}); + startBlockchainTime = DateTime.parse(result.data!['block'][0]['created_at']); + return startBlockchainTime; +} + +Future _execQuery( + String query, Map variables) async { final httpLink = HttpLink( '$indexerEndpoint/v1/graphql', ); @@ -456,14 +473,8 @@ Future isIdtyExist(String name) async { link: httpLink, ); - final QueryOptions options = QueryOptions( - document: gql(isIdtyExistQ), - variables: { - 'name': name, - }, - ); + final QueryOptions options = + QueryOptions(document: gql(query), variables: variables); - final QueryResult result = await client.query(options); - - return result.data!['identity']?.isEmpty ?? false ? false : true; + return await client.query(options); } diff --git a/lib/providers/substrate_sdk.dart b/lib/providers/substrate_sdk.dart index 235c4f2..e170c9d 100644 --- a/lib/providers/substrate_sdk.dart +++ b/lib/providers/substrate_sdk.dart @@ -7,6 +7,7 @@ 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/duniter_indexer.dart'; import 'package:gecko/providers/home.dart'; import 'package:gecko/providers/my_wallets.dart'; import 'package:gecko/providers/wallet_options.dart'; @@ -383,6 +384,77 @@ class SubstrateSdk with ChangeNotifier { return estimateFees.partialFee / 100; } + int hexStringToUint16(String input) { + // Slice the string in 2-char substrings and parse it from hex to decimal + final bytes = sliceString(input, 2).map((s) => int.parse(s, radix: 16)); + + // Create a Uint8 from the 2-bytes list + final u8list = Uint8List.fromList(bytes.toList()); + + // Return a Uint16 little endian representation + return ByteData.view(u8list.buffer).getUint16(0, Endian.little); + } + + List sliceString(String input, int count) { + if (input.isEmpty) return []; + + if (input.length % count != 0) { + throw ArgumentError("Cannot slice $input in $count slices."); + } + // final slices = List(count); + var slices = List.filled(count, ''); + + int len = input.length; + int sliceSize = len ~/ count; + + for (var i = 0; i < count; i++) { + var start = i * sliceSize; + slices[i] = input.substring(start, start + sliceSize); + } + + return List.unmodifiable(slices); + } + + Future getBlockchainStart() async { + ////// Manu indexer + //// Extract block date. Ugly, I can't find a better way to get the date of the block ? + //// The only polkadot issue for that : https://github.com/polkadot-js/api/issues/2603 + // const created_at = new Date( + // signedBlock.block.extrinsics + // .filter( + // ({ method: { section, method } }) => + // section === 'timestamp' && method === 'set' + // )[0] + // .args[0].toNumber() + // ) + //// manu rpc + // genesis: api.genesisHash.toHex(), + // chain: await api.rpc.chain.getHeader(), + // chainInfo: await api.registry.getChainProperties(), + // test: await api.rpc.state.getPairs('0x') + // query block finalisé qui ne change jamais. + // api.rpc.chain.subscribeFinalizedHeads + // events: await api.rpc.state.getStorage('0x26aa394eea5630e07c48ae0c9558cef780d41e5e16056765bc8461851072c9d7'), + // lastFinalizedBlock: await api.rpc.chain.getFinalizedHead() + // get block + // api.rpc.chain.getFinalizedHead + + // shit + // final blockHash = + // await sdk.webView!.evalJavascript('api.rpc.chain.getBlockHash(1)'); + // final Map blockContent = await sdk.webView! + // .evalJavascript('api.rpc.chain.getBlock("$blockHash")'); + // final String dateBrut = blockContent['block']['extrinsics'][0]; + + // final dateTextByte = hex.decode(dateBrut.substring(2)); + + // final dateText = await sdk.webView! + // .evalJavascript('api.tx($dateTextByte)', wrapPromise: false); + + // log.d('aaaaaaaaaaaaaaaaaaaaa: $dateText'); + return DateFormat(); + } + ///////////////////////////////////// ////// 3: SUBSTRATE CONNECTION ////// ///////////////////////////////////// @@ -403,7 +475,7 @@ class SubstrateSdk with ChangeNotifier { } Future connectNode(BuildContext ctx) async { - HomeProvider homeProvider = Provider.of(ctx, listen: false); + final homeProvider = Provider.of(ctx, listen: false); final myWalletProvider = Provider.of(ctx, listen: false); homeProvider.changeMessage("connectionPending".tr(), 0); @@ -448,6 +520,9 @@ class SubstrateSdk with ChangeNotifier { await initCurrencyParameters(); await getBalanceRatio(); + // Indexer + getBlockStart(); + notifyListeners(); homeProvider.changeMessage( "wellConnectedToNode" diff --git a/lib/screens/activity.dart b/lib/screens/activity.dart index 4ef95ae..1f98bc3 100644 --- a/lib/screens/activity.dart +++ b/lib/screens/activity.dart @@ -34,6 +34,8 @@ class ActivityScreen extends StatelessWidget with ChangeNotifier { HomeProvider homeProvider = Provider.of(context, listen: false); + // log.d('aaaaaaaaaaaaaaaaaaaaa $startBlockchainTime'); + return Scaffold( key: _scaffoldKey, appBar: AppBar( @@ -196,6 +198,8 @@ class ActivityScreen extends StatelessWidget with ChangeNotifier { bool isTody = false; bool isYesterday = false; bool isThisWeek = false; + bool isMigrationTime = false; + bool isMigrationTimePassed = false; final Map monthsInYear = { 1: "month1".tr(), @@ -278,7 +282,25 @@ class ActivityScreen extends StatelessWidget with ChangeNotifier { finalAmount = '$amount $currencyName'; } + if (!isMigrationTimePassed && date.compareTo(startBlockchainTime) < 0) { + isMigrationTimePassed = true; + isMigrationTime = true; + } else { + isMigrationTime = false; + } + return Column(children: [ + if (isMigrationTime) + const Padding( + padding: EdgeInsets.symmetric(vertical: 30), + child: Text( + 'Début de la ĞDev', + style: TextStyle( + fontSize: 25, + color: Colors.blueAccent, + fontWeight: FontWeight.w500), + ), + ), if (dateDelimiter != null) Padding( padding: const EdgeInsets.symmetric(vertical: 30), diff --git a/lib/widgets/header_profile.dart b/lib/widgets/header_profile.dart index ac7a028..178dd1b 100644 --- a/lib/widgets/header_profile.dart +++ b/lib/widgets/header_profile.dart @@ -32,6 +32,7 @@ class HeaderProfile extends StatelessWidget { return Stack(children: [ Consumer(builder: (context, sub, _) { + // sub.getBlockchainStart(); bool isAccountExist = balanceCache[address] != 0; return Container( height: 180, diff --git a/pubspec.yaml b/pubspec.yaml index 3b468c6..670d838 100644 --- a/pubspec.yaml +++ b/pubspec.yaml @@ -5,7 +5,7 @@ description: Pay with G1. # pub.dev using `pub publish`. This is preferred for private packages. publish_to: 'none' # Remove this line if you wish to publish to pub.dev -version: 0.0.12+37 +version: 0.0.12+39 environment: sdk: '>=2.12.0 <3.0.0'