import 'package:gecko/parsingGVA.dart'; import 'package:gecko/query.dart'; import 'package:gecko/models/history.dart'; import 'package:flutter/material.dart'; import 'package:flutter/foundation.dart'; import 'dart:ui'; import 'package:graphql_flutter/graphql_flutter.dart'; import 'package:provider/provider.dart'; import 'package:truncate/truncate.dart'; //ignore: must_be_immutable class HistoryScreen extends StatelessWidget with ChangeNotifier { final TextEditingController _outputPubkey = new TextEditingController(); ScrollController scrollController = new ScrollController(); final nRepositories = 20; HistoryProvider _historyProvider; FetchMore fetchMore; FetchMoreOptions opts; // scrollListener() { // if (scrollController.offset >= scrollController.position.maxScrollExtent && // !scrollController.position.outOfRange) { // print('On est en bas !!'); // print(opts.document); // fetchMore(opts); // notifyListeners(); // } // } @override Widget build(BuildContext context) { _historyProvider = Provider.of(context); print('Build pubkey : ' + _historyProvider.pubkey); // scrollController.addListener(scrollListener); return Scaffold( floatingActionButton: Container( height: 80.0, width: 80.0, child: FittedBox( child: FloatingActionButton( heroTag: "buttonScan", onPressed: () async { await _historyProvider.scan(); }, child: Container( height: 40.0, width: 40.0, child: Image.asset('images/scanner.png')), backgroundColor: Color( 0xffEFEFBF), //Color(0xffFFD68E), //Color.fromARGB(500, 204, 255, 255), ), ), ), body: Column(children: [ SizedBox(height: 8), TextField( // Entrée de la pubkey onChanged: (text) { print("Clé tappxé: $text"); _historyProvider.isPubkey(text); }, controller: this._outputPubkey, maxLines: 1, textAlign: TextAlign.center, decoration: InputDecoration( hintText: 'Tappez/Collez une clé publique, ou scannez', hintStyle: TextStyle(fontSize: 14), contentPadding: EdgeInsets.symmetric(horizontal: 7, vertical: 15), border: InputBorder.none, focusedBorder: InputBorder.none, enabledBorder: InputBorder.none, errorBorder: InputBorder.none, disabledBorder: InputBorder.none, ), style: TextStyle(fontSize: 14.0, fontWeight: FontWeight.bold)), if (_historyProvider.pubkey != '') historyQuery(), ])); } historyQuery() { return Expanded( child: Column( mainAxisAlignment: MainAxisAlignment.start, mainAxisSize: MainAxisSize.max, children: [ Query( options: QueryOptions( document: gql(getHistory), variables: { 'pubkey': _historyProvider.pubkey, 'number': nRepositories, // set cursor to null so as to start at the beginning 'cursor': null }, ), builder: (QueryResult result, {refetch, fetchMore}) { if (result.isLoading && result.data == null) { return const Center( child: CircularProgressIndicator(), ); } if (result.hasException) { print('Error GVA: ' + result.exception.toString()); return Column(children: [ SizedBox(height: 50), Text( "Aucun noeud GVA valide n'a pu être trouvé.\nVeuillez réessayer ultérieurement.", style: TextStyle(fontSize: 17.0), ) ]); } if (result.data == null && result.exception.toString() == null) { return const Text('Aucune donnée à afficher.'); } final List blockchainTX = (result.data['txsHistoryBc']['both']['edges'] as List); final Map pageInfo = result.data['txsHistoryBc']['both']['pageInfo']; final String fetchMoreCursor = pageInfo['endCursor']; final num balance = removeDecimalZero(result.data['balance']['amount'] / 100); opts = FetchMoreOptions( variables: {'cursor': fetchMoreCursor}, updateQuery: (previousResultData, fetchMoreResultData) { final List repos = [ ...previousResultData['txsHistoryBc']['both']['edges'] as List, ...fetchMoreResultData['txsHistoryBc']['both']['edges'] as List ]; fetchMoreResultData['txsHistoryBc']['both']['edges'] = repos; return fetchMoreResultData; }, ); // _scrollController // ..addListener(() { // if (_scrollController.position.pixels == // _scrollController.position.maxScrollExtent) { // if (!result.isLoading) { // print( // "DEBUG H fetchMoreCursor in scrollController: $fetchMoreCursor"); // fetchMore(opts); // } // } // }); // s/o : https://stackoverflow.com/questions/54065354/how-to-detect-scroll-position-of-listview-in-flutter/54188385#54188385 // new NotificationListener( // child: new ListView( // controller: _scrollController, // ), // onNotification: (t) { // if (t is ScrollEndNotification) { // fetchMore(opts); // } // }, // ); // fetchMore(opts); print( "###### DEBUG H Parse blockchainTX list. Cursor: $fetchMoreCursor ######"); List _transBC = parseHistory(blockchainTX); // Build history list return NotificationListener( child: Expanded( child: ListView( controller: scrollController, children: [ SizedBox(height: 7), if (_historyProvider.pubkey != '') Text(balance.toString() + ' Ğ1', textAlign: TextAlign.center, style: TextStyle(fontSize: 30.0)), SizedBox(height: 12), for (var repository in _transBC) ListTile( contentPadding: const EdgeInsets.all(5.0), leading: Text(repository[3], style: TextStyle(fontSize: 14.0)), title: Text( repository[1].toString() + '\n' + truncate(repository[2], 17, omission: "...", position: TruncatePosition.end), style: TextStyle(fontSize: 14.0)), subtitle: Text(repository[5], style: TextStyle(fontSize: 14.0)), dense: true, onTap: () { this._outputPubkey.text = repository[2]; _historyProvider.isPubkey(repository[2]); // notifyListeners(); }), if (result.isLoading) Row( mainAxisAlignment: MainAxisAlignment.center, children: [ CircularProgressIndicator(), ], ), ], )), onNotification: (t) { // print(scrollController.position.pixels); // print(scrollController.position.maxScrollExtent); if (t is ScrollEndNotification && scrollController.position.pixels >= scrollController.position.maxScrollExtent * 0.8) { fetchMore(opts); // notifyListeners(); } return true; }); }, ), ], )); } num removeDecimalZero(double n) { String result = n.toStringAsFixed(n.truncateToDouble() == n ? 0 : 1); return num.parse(result); } }