diff --git a/lib/main.dart b/lib/main.dart index c313d40..8f013a9 100644 --- a/lib/main.dart +++ b/lib/main.dart @@ -1,7 +1,11 @@ +import 'package:dubp/dubp.dart'; +import 'package:gecko/models/history.dart'; +import 'package:gecko/models/myWallets.dart'; import 'package:gecko/ui/home.dart'; import 'package:flutter/cupertino.dart'; import 'package:flutter/material.dart'; import 'package:graphql_flutter/graphql_flutter.dart'; +import 'package:provider/provider.dart'; import 'package:sentry_flutter/sentry_flutter.dart'; import 'package:flutter/foundation.dart'; import 'package:http/http.dart' as http; @@ -90,23 +94,41 @@ class Gecko extends StatelessWidget { link: _httpLink, ), ); - return MaterialApp( - title: 'Ğecko', - theme: ThemeData( - primaryColor: Color(0xffFFD58D), - accentColor: Colors.grey[850], - textTheme: TextTheme( - bodyText1: TextStyle(), - bodyText2: TextStyle(), - ).apply( - bodyColor: Color(0xff855F2D), - // displayColor: Colors.blue, - ), - ), - home: GraphQLProvider( - client: _client, - child: HomeScreen(), - ), - ); + + DubpRust.setup(); + return MultiProvider( + providers: [ + // In this sample app, CatalogModel never changes, so a simple Provider + // is sufficient. + Provider(create: (context) => HistoryProvider()), + // CartModel is implemented as a ChangeNotifier, which calls for the use + // of ChangeNotifierProvider. Moreover, CartModel depends + // on CatalogModel, so a ProxyProvider is needed. + ChangeNotifierProxyProvider( + create: (context) => MyWalletsProvider(), + update: (context, history, myWallets) { + cart.catalog = catalog; + return cart; + }, + ), + ], + child: MaterialApp( + title: 'Ğecko', + theme: ThemeData( + primaryColor: Color(0xffFFD58D), + accentColor: Colors.grey[850], + textTheme: TextTheme( + bodyText1: TextStyle(), + bodyText2: TextStyle(), + ).apply( + bodyColor: Color(0xff855F2D), + // displayColor: Colors.blue, + ), + ), + home: GraphQLProvider( + client: _client, + child: HomeScreen(), + ), + )); } } diff --git a/lib/models/history.dart b/lib/models/history.dart new file mode 100644 index 0000000..099ddfd --- /dev/null +++ b/lib/models/history.dart @@ -0,0 +1,59 @@ +import 'package:flutter/foundation.dart'; +import 'package:flutter/material.dart'; +import 'package:permission_handler/permission_handler.dart'; +import 'package:sentry/sentry.dart' as sentry; +import 'package:qrscan/qrscan.dart' as scanner; + +class HistoryProvider with ChangeNotifier { + final TextEditingController _outputPubkey = new TextEditingController(); + String pubkey = ''; + + ScrollController scrollController = new ScrollController(); + + Future scan() async { + await Permission.camera.request(); + String barcode; + try { + barcode = await scanner.scan(); + } catch (e, stack) { + print(e); + if (kReleaseMode) { + await sentry.Sentry.captureException( + e, + stackTrace: stack, + ); + } + return 'false'; + } + // this._outputPubkey.text = ""; + if (barcode != null) { + this._outputPubkey.text = barcode; + isPubkey(barcode); + } else { + return 'false'; + } + return barcode; + } + + String isPubkey(pubkey) { + final RegExp regExp = new RegExp( + r'^[a-zA-Z0-9]+$', + caseSensitive: false, + multiLine: false, + ); + + if (regExp.hasMatch(pubkey) == true && + pubkey.length > 42 && + pubkey.length < 45) { + print("C'est une pubkey !!!"); + + this.pubkey = pubkey; + this._outputPubkey.text = pubkey; + notifyListeners(); + + return pubkey; + } + + return ''; + } +} diff --git a/lib/models/myWallets.dart b/lib/models/myWallets.dart new file mode 100644 index 0000000..ebbed9a --- /dev/null +++ b/lib/models/myWallets.dart @@ -0,0 +1,54 @@ +import 'dart:io'; +import 'package:flutter/foundation.dart'; +import 'package:flutter/material.dart'; +import 'dart:async'; +import 'package:path_provider/path_provider.dart'; + +class MyWalletsProvider with ChangeNotifier { + Directory appPath; + + bool checkIfWalletExist() { + if (this.appPath == null) { + return false; + } + + var walletsFolder = new Directory("${this.appPath.path}/wallets/"); + + bool isWalletFolderExist = walletsFolder.existsSync(); + + if (!isWalletFolderExist) { + Directory(walletsFolder.path).createSync(); + } + + List contents = walletsFolder.listSync(); + if (contents.length == 0) { + print('No wallets detected'); + return false; + } else { + print('Some wallets have been detected:'); + for (var _wallets in contents) { + print(_wallets); + } + return true; + } + + // final bool isExist = + // File('${walletsFolder.path}/$name/wallet.dewif').existsSync(); + // print(this.appPath.path); + // print('Wallet existe ? : ' + isExist.toString()); + // print('Is wallet generated ? : ' + walletIsGenerated.toString()); + // if (isExist) { + // print('Un wallet existe !'); + // return true; + // } else { + // return false; + // } + } + + Future getAppDirectory() async { + this.appPath = await getApplicationDocumentsDirectory(); + notifyListeners(); + } + + Future importWallet() async {} +} diff --git a/lib/ui/historyScreen.dart b/lib/ui/historyScreen.dart index 36cfa46..d1ebcd6 100644 --- a/lib/ui/historyScreen.dart +++ b/lib/ui/historyScreen.dart @@ -1,25 +1,15 @@ 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 'package:qrscan/qrscan.dart' as scanner; -import 'dart:async'; import 'dart:typed_data'; import 'dart:ui'; import 'package:graphql_flutter/graphql_flutter.dart'; -import 'package:permission_handler/permission_handler.dart'; -import 'package:sentry/sentry.dart' as sentry; import 'package:truncate/truncate.dart'; //ignore: must_be_immutable -class HistoryScreen extends StatefulWidget { - const HistoryScreen({Key keyHistory}) : super(key: keyHistory); - - @override - State createState() => HistoryScreenState(); -} - -class HistoryScreenState extends State { +class HistoryScreen extends StatelessWidget with ChangeNotifier { Widget currentScreen; Uint8List bytes = Uint8List(0); @@ -29,40 +19,25 @@ class HistoryScreenState extends State { // String pubkey = 'D2meevcAHFTS2gQMvmRW5Hzi25jDdikk4nC4u1FkwRaU'; // For debug String pubkey = ''; bool isBuilding = true; - ScrollController _scrollController = new ScrollController(); - _scrollListener() { - if (_scrollController.offset >= - _scrollController.position.maxScrollExtent && - !_scrollController.position.outOfRange) { - setState(() { - print("reach the bottom"); - }); + HistoryProvider historyProvider = HistoryProvider(); + + scrollListener() { + if (historyProvider.scrollController.offset >= + historyProvider.scrollController.position.maxScrollExtent && + !historyProvider.scrollController.position.outOfRange) { + notifyListeners(); } } - @override - void initState() { - super.initState(); - _scrollController = ScrollController(); - _scrollController.addListener(_scrollListener); - - // _scrollController - // ..addListener(() { - // if (_scrollController.position.pixels == - // _scrollController.position.maxScrollExtent) { - // // print( - // // "DEBUG H fetchMoreCursor in scrollController: $fetchMoreCursor"); - // fetchMore(opts); - // } - // }); - } - @override Widget build(BuildContext context) { print('Build pubkey : ' + pubkey); print('Build this.pubkey : ' + this.pubkey); print('isBuilding: ' + isBuilding.toString()); + historyProvider.scrollController.addListener(scrollListener); + historyProvider.scrollController = ScrollController(); + return Scaffold( floatingActionButton: Container( height: 80.0, @@ -71,7 +46,7 @@ class HistoryScreenState extends State { child: FloatingActionButton( heroTag: "buttonScan", onPressed: () async { - await scan(); + await historyProvider.scan(); // print(resultScan); // if (resultScan != 'false') { // onTabTapped(0); @@ -93,7 +68,7 @@ class HistoryScreenState extends State { onChanged: (text) { print("Clé tappxé: $text"); this.pubkey = text; - isPubkey(text); + historyProvider.isPubkey(text); }, controller: this._outputPubkey, maxLines: 1, @@ -211,7 +186,7 @@ class HistoryScreenState extends State { // Build history list return Expanded( child: ListView( - controller: _scrollController, + controller: historyProvider.scrollController, children: [ SizedBox(height: 7), if (this.pubkey != '') @@ -235,7 +210,7 @@ class HistoryScreenState extends State { Text(repository[5], style: TextStyle(fontSize: 14.0)), dense: true, onTap: () { - isPubkey(repository[2]); + historyProvider.isPubkey(repository[2]); }), if (result.isLoading) Row( @@ -252,58 +227,6 @@ class HistoryScreenState extends State { )); } - Future scan() async { - await Permission.camera.request(); - String barcode; - try { - barcode = await scanner.scan(); - } catch (e, stack) { - print(e); - if (kReleaseMode) { - await sentry.Sentry.captureException( - e, - stackTrace: stack, - ); - } - return 'false'; - } - // this._outputPubkey.text = ""; - if (barcode != null) { - this._outputPubkey.text = barcode; - isPubkey(barcode); - } else { - return 'false'; - } - return barcode; - } - - String isPubkey(pubkey) { - final RegExp regExp = new RegExp( - r'^[a-zA-Z0-9]+$', - caseSensitive: false, - multiLine: false, - ); - - if (regExp.hasMatch(pubkey) == true && - pubkey.length > 42 && - pubkey.length < 45) { - print("C'est une pubkey !!!"); - - setState(() { - this.pubkey = pubkey; - this._outputPubkey.text = pubkey; - }); - - // setState(() { - // this._outputBalance.text = balance.toString(); - // }); - - return pubkey; - } - - return ''; - } - num removeDecimalZero(double n) { String result = n.toStringAsFixed(n.truncateToDouble() == n ? 0 : 1); return num.parse(result); diff --git a/lib/ui/home.dart b/lib/ui/home.dart index f9e32a5..782e2d5 100644 --- a/lib/ui/home.dart +++ b/lib/ui/home.dart @@ -15,8 +15,6 @@ class HomeScreen extends StatefulWidget { } class HomeScreenState extends State { - GlobalKey _keyHistory = GlobalKey(); - int currentIndex = 0; Widget currentScreen; String appName; @@ -101,9 +99,7 @@ class HomeScreenState extends State { child: IndexedStack( index: currentIndex, children: [ - HistoryScreen( - keyHistory: _keyHistory, - ), + HistoryScreen(), WalletsHome(), ], ), diff --git a/lib/ui/myWallets/changePin.dart b/lib/ui/myWallets/changePin.dart index a132c40..455b812 100644 --- a/lib/ui/myWallets/changePin.dart +++ b/lib/ui/myWallets/changePin.dart @@ -26,7 +26,6 @@ class ChangePinScreenState extends State { void initState() { super.initState(); - DubpRust.setup(); changePin(widget.walletName, widget.oldPin); } diff --git a/lib/ui/myWallets/generateWalletsScreen.dart b/lib/ui/myWallets/generateWalletsScreen.dart index 9f1c75e..931f46f 100644 --- a/lib/ui/myWallets/generateWalletsScreen.dart +++ b/lib/ui/myWallets/generateWalletsScreen.dart @@ -16,7 +16,6 @@ class GenerateWalletsState extends State { // GlobalKey _keyValidWallets = GlobalKey(); void initState() { super.initState(); - DubpRust.setup(); generateMnemonic(); } diff --git a/lib/ui/myWallets/walletOptions.dart b/lib/ui/myWallets/walletOptions.dart index d4f434c..1f7d234 100644 --- a/lib/ui/myWallets/walletOptions.dart +++ b/lib/ui/myWallets/walletOptions.dart @@ -35,7 +35,6 @@ class WalletOptionsState extends State { void initState() { super.initState(); errorController = StreamController(); - DubpRust.setup(); isWalletUnlock = false; } diff --git a/lib/ui/myWallets/walletsHome.dart b/lib/ui/myWallets/walletsHome.dart index 1c415b2..6c37c9d 100644 --- a/lib/ui/myWallets/walletsHome.dart +++ b/lib/ui/myWallets/walletsHome.dart @@ -1,29 +1,12 @@ +import 'package:gecko/models/myWallets.dart'; import 'package:gecko/ui/myWallets/generateWalletsScreen.dart'; import 'package:gecko/ui/myWallets/myWalletsList.dart'; import 'package:flutter/foundation.dart'; import 'package:flutter/material.dart'; import 'package:dubp/dubp.dart'; -import 'dart:io'; -import 'dart:async'; -import 'package:path_provider/path_provider.dart'; -class WalletsHome extends StatefulWidget { - const WalletsHome({Key keyGenWallet}) : super(key: keyGenWallet); - @override - WalletsHomeState createState() => WalletsHomeState(); -} - -class WalletsHomeState extends State { - GlobalKey _keyWalletsHome = GlobalKey(); - // GlobalKey _keyMyWallets = GlobalKey(); - // GlobalKey _keyValidWallets = GlobalKey(); - void initState() { - super.initState(); - DubpRust.setup(); - getAppDirectory(); - // _keyWalletsHome.currentState.getAllWalletsNames(); - // _keyMyWallets.currentState.getAllWalletsNames(); - } +class WalletsHome extends StatelessWidget with ChangeNotifier { + MyWalletsProvider historyProvider = MyWalletsProvider(); String generatedMnemonic; bool walletIsGenerated = false; @@ -34,15 +17,14 @@ class WalletsHomeState extends State { String validPin = 'NO PIN'; String currentText = ""; var pinColor = Colors.grey[300]; - Directory appPath; @override Widget build(BuildContext context) { - // getAppDirectory(); + historyProvider.getAppDirectory(); return Scaffold( floatingActionButton: Visibility( - visible: - (checkIfWalletExist()), //!checkIfWalletExist('MonWallet') && + visible: (historyProvider + .checkIfWalletExist()), //!checkIfWalletExist('MonWallet') && child: Container( height: 80.0, width: 80.0, @@ -55,10 +37,7 @@ class WalletsHomeState extends State { MaterialPageRoute(builder: (context) { return GenerateWalletsScreen(); }), - ).then((value) => setState(() { - this.newWalletName = value; - checkIfWalletExist(); - })); + ); }, child: Container( height: 40.0, @@ -69,7 +48,8 @@ class WalletsHomeState extends State { body: SafeArea( child: Column(children: [ Visibility( - visible: (!checkIfWalletExist() && !walletIsGenerated), + visible: + (!historyProvider.checkIfWalletExist() && !walletIsGenerated), child: Column(children: [ SizedBox(height: 120), Center( @@ -88,10 +68,7 @@ class WalletsHomeState extends State { MaterialPageRoute(builder: (context) { return GenerateWalletsScreen(); }), - ).then((value) => setState(() { - this.newWalletName = value; - checkIfWalletExist(); - })), + ), child: Text('Générer un portefeuille', style: TextStyle(fontSize: 20))), SizedBox(height: 15), @@ -106,13 +83,13 @@ class WalletsHomeState extends State { primary: Color(0xffFFD68E), // background onPrimary: Colors.black, // foreground ), - onPressed: () => importWallet(), + onPressed: () => historyProvider.importWallet(), child: Text('Importer un portefeuille existant', style: TextStyle(fontSize: 20))), ])), Visibility( - visible: checkIfWalletExist(), - child: MyWalletsList(keyMyWallets: _keyWalletsHome)) + visible: historyProvider.checkIfWalletExist(), + child: MyWalletsList()) ]))); } @@ -128,48 +105,4 @@ class WalletsHomeState extends State { // }); // } - bool checkIfWalletExist() { - if (this.appPath == null) { - return false; - } - - var walletsFolder = new Directory("${this.appPath.path}/wallets/"); - - bool isWalletFolderExist = walletsFolder.existsSync(); - - if (!isWalletFolderExist) { - Directory(walletsFolder.path).createSync(); - } - - List contents = walletsFolder.listSync(); - if (contents.length == 0) { - print('No wallets detected'); - return false; - } else { - print('Some wallets have been detected:'); - for (var _wallets in contents) { - print(_wallets); - } - return true; - } - - // final bool isExist = - // File('${walletsFolder.path}/$name/wallet.dewif').existsSync(); - // print(this.appPath.path); - // print('Wallet existe ? : ' + isExist.toString()); - // print('Is wallet generated ? : ' + walletIsGenerated.toString()); - // if (isExist) { - // print('Un wallet existe !'); - // return true; - // } else { - // return false; - // } - } - - Future getAppDirectory() async { - this.appPath = await getApplicationDocumentsDirectory(); - setState(() {}); - } - - Future importWallet() async {} }