start to rebuild in provider way

This commit is contained in:
poka 2021-01-23 16:38:03 +01:00
parent 63dfee0ebf
commit df772db864
9 changed files with 183 additions and 199 deletions

View File

@ -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:gecko/ui/home.dart';
import 'package:flutter/cupertino.dart'; import 'package:flutter/cupertino.dart';
import 'package:flutter/material.dart'; import 'package:flutter/material.dart';
import 'package:graphql_flutter/graphql_flutter.dart'; import 'package:graphql_flutter/graphql_flutter.dart';
import 'package:provider/provider.dart';
import 'package:sentry_flutter/sentry_flutter.dart'; import 'package:sentry_flutter/sentry_flutter.dart';
import 'package:flutter/foundation.dart'; import 'package:flutter/foundation.dart';
import 'package:http/http.dart' as http; import 'package:http/http.dart' as http;
@ -90,23 +94,41 @@ class Gecko extends StatelessWidget {
link: _httpLink, link: _httpLink,
), ),
); );
return MaterialApp(
title: 'Ğecko', DubpRust.setup();
theme: ThemeData( return MultiProvider(
primaryColor: Color(0xffFFD58D), providers: [
accentColor: Colors.grey[850], // In this sample app, CatalogModel never changes, so a simple Provider
textTheme: TextTheme( // is sufficient.
bodyText1: TextStyle(), Provider(create: (context) => HistoryProvider()),
bodyText2: TextStyle(), // CartModel is implemented as a ChangeNotifier, which calls for the use
).apply( // of ChangeNotifierProvider. Moreover, CartModel depends
bodyColor: Color(0xff855F2D), // on CatalogModel, so a ProxyProvider is needed.
// displayColor: Colors.blue, ChangeNotifierProxyProvider<HistoryProvider, MyWalletsProvider>(
), create: (context) => MyWalletsProvider(),
), update: (context, history, myWallets) {
home: GraphQLProvider( cart.catalog = catalog;
client: _client, return cart;
child: HomeScreen(), },
), ),
); ],
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(),
),
));
} }
} }

59
lib/models/history.dart Normal file
View File

@ -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 '';
}
}

54
lib/models/myWallets.dart Normal file
View File

@ -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 {}
}

View File

@ -1,25 +1,15 @@
import 'package:gecko/parsingGVA.dart'; import 'package:gecko/parsingGVA.dart';
import 'package:gecko/query.dart'; import 'package:gecko/query.dart';
import 'package:gecko/models/history.dart';
import 'package:flutter/material.dart'; import 'package:flutter/material.dart';
import 'package:flutter/foundation.dart'; import 'package:flutter/foundation.dart';
import 'package:qrscan/qrscan.dart' as scanner;
import 'dart:async';
import 'dart:typed_data'; import 'dart:typed_data';
import 'dart:ui'; import 'dart:ui';
import 'package:graphql_flutter/graphql_flutter.dart'; 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'; import 'package:truncate/truncate.dart';
//ignore: must_be_immutable //ignore: must_be_immutable
class HistoryScreen extends StatefulWidget { class HistoryScreen extends StatelessWidget with ChangeNotifier {
const HistoryScreen({Key keyHistory}) : super(key: keyHistory);
@override
State<StatefulWidget> createState() => HistoryScreenState();
}
class HistoryScreenState extends State<HistoryScreen> {
Widget currentScreen; Widget currentScreen;
Uint8List bytes = Uint8List(0); Uint8List bytes = Uint8List(0);
@ -29,40 +19,25 @@ class HistoryScreenState extends State<HistoryScreen> {
// String pubkey = 'D2meevcAHFTS2gQMvmRW5Hzi25jDdikk4nC4u1FkwRaU'; // For debug // String pubkey = 'D2meevcAHFTS2gQMvmRW5Hzi25jDdikk4nC4u1FkwRaU'; // For debug
String pubkey = ''; String pubkey = '';
bool isBuilding = true; bool isBuilding = true;
ScrollController _scrollController = new ScrollController();
_scrollListener() { HistoryProvider historyProvider = HistoryProvider();
if (_scrollController.offset >=
_scrollController.position.maxScrollExtent && scrollListener() {
!_scrollController.position.outOfRange) { if (historyProvider.scrollController.offset >=
setState(() { historyProvider.scrollController.position.maxScrollExtent &&
print("reach the bottom"); !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 @override
Widget build(BuildContext context) { Widget build(BuildContext context) {
print('Build pubkey : ' + pubkey); print('Build pubkey : ' + pubkey);
print('Build this.pubkey : ' + this.pubkey); print('Build this.pubkey : ' + this.pubkey);
print('isBuilding: ' + isBuilding.toString()); print('isBuilding: ' + isBuilding.toString());
historyProvider.scrollController.addListener(scrollListener);
historyProvider.scrollController = ScrollController();
return Scaffold( return Scaffold(
floatingActionButton: Container( floatingActionButton: Container(
height: 80.0, height: 80.0,
@ -71,7 +46,7 @@ class HistoryScreenState extends State<HistoryScreen> {
child: FloatingActionButton( child: FloatingActionButton(
heroTag: "buttonScan", heroTag: "buttonScan",
onPressed: () async { onPressed: () async {
await scan(); await historyProvider.scan();
// print(resultScan); // print(resultScan);
// if (resultScan != 'false') { // if (resultScan != 'false') {
// onTabTapped(0); // onTabTapped(0);
@ -93,7 +68,7 @@ class HistoryScreenState extends State<HistoryScreen> {
onChanged: (text) { onChanged: (text) {
print("Clé tappxé: $text"); print("Clé tappxé: $text");
this.pubkey = text; this.pubkey = text;
isPubkey(text); historyProvider.isPubkey(text);
}, },
controller: this._outputPubkey, controller: this._outputPubkey,
maxLines: 1, maxLines: 1,
@ -211,7 +186,7 @@ class HistoryScreenState extends State<HistoryScreen> {
// Build history list // Build history list
return Expanded( return Expanded(
child: ListView( child: ListView(
controller: _scrollController, controller: historyProvider.scrollController,
children: <Widget>[ children: <Widget>[
SizedBox(height: 7), SizedBox(height: 7),
if (this.pubkey != '') if (this.pubkey != '')
@ -235,7 +210,7 @@ class HistoryScreenState extends State<HistoryScreen> {
Text(repository[5], style: TextStyle(fontSize: 14.0)), Text(repository[5], style: TextStyle(fontSize: 14.0)),
dense: true, dense: true,
onTap: () { onTap: () {
isPubkey(repository[2]); historyProvider.isPubkey(repository[2]);
}), }),
if (result.isLoading) if (result.isLoading)
Row( Row(
@ -252,58 +227,6 @@ class HistoryScreenState extends State<HistoryScreen> {
)); ));
} }
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) { num removeDecimalZero(double n) {
String result = n.toStringAsFixed(n.truncateToDouble() == n ? 0 : 1); String result = n.toStringAsFixed(n.truncateToDouble() == n ? 0 : 1);
return num.parse(result); return num.parse(result);

View File

@ -15,8 +15,6 @@ class HomeScreen extends StatefulWidget {
} }
class HomeScreenState extends State<HomeScreen> { class HomeScreenState extends State<HomeScreen> {
GlobalKey<HistoryScreenState> _keyHistory = GlobalKey();
int currentIndex = 0; int currentIndex = 0;
Widget currentScreen; Widget currentScreen;
String appName; String appName;
@ -101,9 +99,7 @@ class HomeScreenState extends State<HomeScreen> {
child: IndexedStack( child: IndexedStack(
index: currentIndex, index: currentIndex,
children: <Widget>[ children: <Widget>[
HistoryScreen( HistoryScreen(),
keyHistory: _keyHistory,
),
WalletsHome(), WalletsHome(),
], ],
), ),

View File

@ -26,7 +26,6 @@ class ChangePinScreenState extends State<ChangePinScreen> {
void initState() { void initState() {
super.initState(); super.initState();
DubpRust.setup();
changePin(widget.walletName, widget.oldPin); changePin(widget.walletName, widget.oldPin);
} }

View File

@ -16,7 +16,6 @@ class GenerateWalletsState extends State<GenerateWalletsScreen> {
// GlobalKey<ValidStoreWalletState> _keyValidWallets = GlobalKey(); // GlobalKey<ValidStoreWalletState> _keyValidWallets = GlobalKey();
void initState() { void initState() {
super.initState(); super.initState();
DubpRust.setup();
generateMnemonic(); generateMnemonic();
} }

View File

@ -35,7 +35,6 @@ class WalletOptionsState extends State<WalletOptions> {
void initState() { void initState() {
super.initState(); super.initState();
errorController = StreamController<ErrorAnimationType>(); errorController = StreamController<ErrorAnimationType>();
DubpRust.setup();
isWalletUnlock = false; isWalletUnlock = false;
} }

View File

@ -1,29 +1,12 @@
import 'package:gecko/models/myWallets.dart';
import 'package:gecko/ui/myWallets/generateWalletsScreen.dart'; import 'package:gecko/ui/myWallets/generateWalletsScreen.dart';
import 'package:gecko/ui/myWallets/myWalletsList.dart'; import 'package:gecko/ui/myWallets/myWalletsList.dart';
import 'package:flutter/foundation.dart'; import 'package:flutter/foundation.dart';
import 'package:flutter/material.dart'; import 'package:flutter/material.dart';
import 'package:dubp/dubp.dart'; import 'package:dubp/dubp.dart';
import 'dart:io';
import 'dart:async';
import 'package:path_provider/path_provider.dart';
class WalletsHome extends StatefulWidget { class WalletsHome extends StatelessWidget with ChangeNotifier {
const WalletsHome({Key keyGenWallet}) : super(key: keyGenWallet); MyWalletsProvider historyProvider = MyWalletsProvider();
@override
WalletsHomeState createState() => WalletsHomeState();
}
class WalletsHomeState extends State<WalletsHome> {
GlobalKey<WalletsHomeState> _keyWalletsHome = GlobalKey();
// GlobalKey<MyWalletState> _keyMyWallets = GlobalKey();
// GlobalKey<ValidStoreWalletState> _keyValidWallets = GlobalKey();
void initState() {
super.initState();
DubpRust.setup();
getAppDirectory();
// _keyWalletsHome.currentState.getAllWalletsNames();
// _keyMyWallets.currentState.getAllWalletsNames();
}
String generatedMnemonic; String generatedMnemonic;
bool walletIsGenerated = false; bool walletIsGenerated = false;
@ -34,15 +17,14 @@ class WalletsHomeState extends State<WalletsHome> {
String validPin = 'NO PIN'; String validPin = 'NO PIN';
String currentText = ""; String currentText = "";
var pinColor = Colors.grey[300]; var pinColor = Colors.grey[300];
Directory appPath;
@override @override
Widget build(BuildContext context) { Widget build(BuildContext context) {
// getAppDirectory(); historyProvider.getAppDirectory();
return Scaffold( return Scaffold(
floatingActionButton: Visibility( floatingActionButton: Visibility(
visible: visible: (historyProvider
(checkIfWalletExist()), //!checkIfWalletExist('MonWallet') && .checkIfWalletExist()), //!checkIfWalletExist('MonWallet') &&
child: Container( child: Container(
height: 80.0, height: 80.0,
width: 80.0, width: 80.0,
@ -55,10 +37,7 @@ class WalletsHomeState extends State<WalletsHome> {
MaterialPageRoute(builder: (context) { MaterialPageRoute(builder: (context) {
return GenerateWalletsScreen(); return GenerateWalletsScreen();
}), }),
).then((value) => setState(() { );
this.newWalletName = value;
checkIfWalletExist();
}));
}, },
child: Container( child: Container(
height: 40.0, height: 40.0,
@ -69,7 +48,8 @@ class WalletsHomeState extends State<WalletsHome> {
body: SafeArea( body: SafeArea(
child: Column(children: <Widget>[ child: Column(children: <Widget>[
Visibility( Visibility(
visible: (!checkIfWalletExist() && !walletIsGenerated), visible:
(!historyProvider.checkIfWalletExist() && !walletIsGenerated),
child: Column(children: <Widget>[ child: Column(children: <Widget>[
SizedBox(height: 120), SizedBox(height: 120),
Center( Center(
@ -88,10 +68,7 @@ class WalletsHomeState extends State<WalletsHome> {
MaterialPageRoute(builder: (context) { MaterialPageRoute(builder: (context) {
return GenerateWalletsScreen(); return GenerateWalletsScreen();
}), }),
).then((value) => setState(() { ),
this.newWalletName = value;
checkIfWalletExist();
})),
child: Text('Générer un portefeuille', child: Text('Générer un portefeuille',
style: TextStyle(fontSize: 20))), style: TextStyle(fontSize: 20))),
SizedBox(height: 15), SizedBox(height: 15),
@ -106,13 +83,13 @@ class WalletsHomeState extends State<WalletsHome> {
primary: Color(0xffFFD68E), // background primary: Color(0xffFFD68E), // background
onPrimary: Colors.black, // foreground onPrimary: Colors.black, // foreground
), ),
onPressed: () => importWallet(), onPressed: () => historyProvider.importWallet(),
child: Text('Importer un portefeuille existant', child: Text('Importer un portefeuille existant',
style: TextStyle(fontSize: 20))), style: TextStyle(fontSize: 20))),
])), ])),
Visibility( Visibility(
visible: checkIfWalletExist(), visible: historyProvider.checkIfWalletExist(),
child: MyWalletsList(keyMyWallets: _keyWalletsHome)) child: MyWalletsList())
]))); ])));
} }
@ -128,48 +105,4 @@ class WalletsHomeState extends State<WalletsHome> {
// }); // });
// } // }
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 {}
} }