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: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<HistoryProvider, MyWalletsProvider>(
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(),
),
));
}
}

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/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<StatefulWidget> createState() => HistoryScreenState();
}
class HistoryScreenState extends State<HistoryScreen> {
class HistoryScreen extends StatelessWidget with ChangeNotifier {
Widget currentScreen;
Uint8List bytes = Uint8List(0);
@ -29,40 +19,25 @@ class HistoryScreenState extends State<HistoryScreen> {
// 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<HistoryScreen> {
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<HistoryScreen> {
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<HistoryScreen> {
// Build history list
return Expanded(
child: ListView(
controller: _scrollController,
controller: historyProvider.scrollController,
children: <Widget>[
SizedBox(height: 7),
if (this.pubkey != '')
@ -235,7 +210,7 @@ class HistoryScreenState extends State<HistoryScreen> {
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<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) {
String result = n.toStringAsFixed(n.truncateToDouble() == n ? 0 : 1);
return num.parse(result);

View File

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

View File

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

View File

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

View File

@ -35,7 +35,6 @@ class WalletOptionsState extends State<WalletOptions> {
void initState() {
super.initState();
errorController = StreamController<ErrorAnimationType>();
DubpRust.setup();
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/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<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();
}
class WalletsHome extends StatelessWidget with ChangeNotifier {
MyWalletsProvider historyProvider = MyWalletsProvider();
String generatedMnemonic;
bool walletIsGenerated = false;
@ -34,15 +17,14 @@ class WalletsHomeState extends State<WalletsHome> {
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<WalletsHome> {
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<WalletsHome> {
body: SafeArea(
child: Column(children: <Widget>[
Visibility(
visible: (!checkIfWalletExist() && !walletIsGenerated),
visible:
(!historyProvider.checkIfWalletExist() && !walletIsGenerated),
child: Column(children: <Widget>[
SizedBox(height: 120),
Center(
@ -88,10 +68,7 @@ class WalletsHomeState extends State<WalletsHome> {
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<WalletsHome> {
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<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 {}
}