diff --git a/lib/models/walletOptions.dart b/lib/models/walletOptions.dart index 2e3053d..5b0ac9d 100644 --- a/lib/models/walletOptions.dart +++ b/lib/models/walletOptions.dart @@ -207,7 +207,10 @@ class WalletOptionsProvider with ChangeNotifier { final _walletFile = Directory('${walletsDirectory.path}/$_walletNbr'); await _walletFile.delete(recursive: true); } - Navigator.pop(context); + Navigator.popUntil( + context, + ModalRoute.withName('/mywallets'), + ); } return 0; } diff --git a/lib/screens/home.dart b/lib/screens/home.dart index ed73172..0fdf06a 100644 --- a/lib/screens/home.dart +++ b/lib/screens/home.dart @@ -4,7 +4,6 @@ import 'package:gecko/models/history.dart'; import 'package:gecko/models/home.dart'; import 'package:flutter/material.dart'; import 'package:gecko/models/myWallets.dart'; -import 'package:gecko/screens/myWallets/walletsHome.dart'; import 'package:gecko/screens/onBoarding/1_noKeychainFound.dart'; import 'dart:ui'; import 'package:gecko/screens/settings.dart'; @@ -271,13 +270,8 @@ class HomeScreen extends StatelessWidget { height: 57)), onTap: () { isWalletsExists - ? Navigator.push( - context, - MaterialPageRoute( - builder: (context) { - return WalletsHome(); - }), - ) + ? Navigator.pushNamed( + context, '/mywallets') : Navigator.push(context, MaterialPageRoute( builder: (context) { diff --git a/lib/screens/myWallets/unlockingWallet.dart b/lib/screens/myWallets/unlockingWallet.dart new file mode 100644 index 0000000..eb70588 --- /dev/null +++ b/lib/screens/myWallets/unlockingWallet.dart @@ -0,0 +1,164 @@ +import 'dart:async'; + +import 'package:dubp/dubp.dart'; +import 'package:flutter/services.dart'; +import 'package:gecko/models/walletOptions.dart'; +import 'package:gecko/screens/commonElements.dart'; +import 'package:flutter/material.dart'; +import 'package:gecko/screens/myWallets/walletOptions.dart'; +import 'package:pin_code_fields/pin_code_fields.dart'; +import 'package:provider/provider.dart'; +// import 'package:gecko/models/home.dart'; +// import 'package:provider/provider.dart'; + +// ignore: must_be_immutable +class UnlockingWallet extends StatelessWidget { + UnlockingWallet( + {Key keyUnlockWallet, + @required this.walletNbr, + @required this.walletName, + @required this.derivation}) + : super(key: keyUnlockWallet); + int walletNbr; + String walletName; + int derivation; + + // ignore: close_sinks + StreamController errorController; + final formKey = GlobalKey(); + bool hasError = false; + var pinColor = Color(0xffF9F9F1); + var walletPin = ''; + + Future get badWallet => null; + + @override + Widget build(BuildContext context) { + SystemChrome.setPreferredOrientations([DeviceOrientation.portraitUp]); + WalletOptionsProvider _walletOptions = + Provider.of(context); + final int _pinLenght = _walletOptions.getPinLenght(this.walletNbr); + errorController = StreamController(); + + return Scaffold( + // backgroundColor: Colors.brown[600], + body: SafeArea( + child: Column(children: [ + SizedBox(height: 20), + Expanded( + child: Column(children: [ + SizedBox(height: 150), + Text( + 'Veuillez tapper votre code secret pour dévérouiller votre portefeuille.', + textAlign: TextAlign.center, + style: TextStyle( + fontSize: 15.0, + color: Colors.black, + fontWeight: FontWeight.w400), + ), + SizedBox(height: 50), + pinForm(context, _pinLenght, walletNbr, derivation), + ]), + ), + GestureDetector( + onTap: () { + Navigator.popUntil( + context, + ModalRoute.withName('/'), + ); + }, + child: Icon(Icons.home)) + ]), + )); + } + + Widget pinForm(context, _pinLenght, int _walletNbr, int _derivation) { + // var _walletPin = ''; +// ignore: close_sinks + StreamController errorController = + StreamController(); + TextEditingController _enterPin = TextEditingController(); + WalletOptionsProvider _walletOptions = + Provider.of(context); + + return Form( + key: formKey, + child: Padding( + padding: const EdgeInsets.symmetric(vertical: 8.0, horizontal: 30), + child: PinCodeTextField( + autoFocus: true, + appContext: context, + pastedTextStyle: TextStyle( + color: Colors.green.shade600, + fontWeight: FontWeight.bold, + ), + length: _pinLenght, + obscureText: false, + obscuringCharacter: '*', + animationType: AnimationType.fade, + validator: (v) { + if (v.length < _pinLenght) { + return "Votre code PIN fait $_pinLenght caractères"; + } else { + return null; + } + }, + pinTheme: PinTheme( + activeColor: pinColor, + borderWidth: 4, + shape: PinCodeFieldShape.box, + borderRadius: BorderRadius.circular(5), + fieldHeight: 60, + fieldWidth: 50, + activeFillColor: hasError ? Colors.blueAccent : Colors.black, + ), + cursorColor: Colors.black, + animationDuration: Duration(milliseconds: 300), + textStyle: TextStyle(fontSize: 20, height: 1.6), + backgroundColor: Color(0xffF9F9F1), + enableActiveFill: false, + errorAnimationController: errorController, + controller: _enterPin, + keyboardType: TextInputType.text, + boxShadows: [ + BoxShadow( + offset: Offset(0, 1), + color: Colors.black12, + blurRadius: 10, + ) + ], + onCompleted: (_pin) async { + print("Completed"); + final resultWallet = await _walletOptions.readLocalWallet( + this.walletNbr, + _pin.toUpperCase(), + _pinLenght, + this.derivation); + if (resultWallet == 'bad') { + errorController.add(ErrorAnimationType + .shake); // Triggering error shake animation + hasError = true; + pinColor = Colors.red[600]; + _walletOptions.reloadBuild(); + } else { + pinColor = Colors.green[400]; + // await Future.delayed(Duration(milliseconds: 50)); + Navigator.push( + context, + SmoothTransition( + page: WalletOptions( + walletNbr: walletNbr, + walletName: walletName, + derivation: derivation))); + } + }, + onChanged: (value) { + if (pinColor != Color(0xFFA4B600)) { + pinColor = Color(0xFFA4B600); + } + print(value); + }, + )), + ); + } +} diff --git a/lib/screens/myWallets/walletOptions.dart b/lib/screens/myWallets/walletOptions.dart index 6bc7910..221e9e1 100644 --- a/lib/screens/myWallets/walletOptions.dart +++ b/lib/screens/myWallets/walletOptions.dart @@ -1,10 +1,8 @@ import 'package:flutter/foundation.dart'; import 'package:flutter/material.dart'; -import 'package:dubp/dubp.dart'; import 'package:gecko/models/myWallets.dart'; import 'package:gecko/models/walletOptions.dart'; import 'dart:async'; -import 'package:pin_code_fields/pin_code_fields.dart'; import 'package:provider/provider.dart'; import 'package:flutter/services.dart'; @@ -20,15 +18,6 @@ class WalletOptions extends StatelessWidget with ChangeNotifier { String walletName; int derivation; - // ignore: close_sinks - StreamController errorController; - final formKey = GlobalKey(); - bool hasError = false; - var pinColor = Color(0xffF9F9F1); - var walletPin = ''; - - Future get badWallet => null; - @override Widget build(BuildContext context) { SystemChrome.setPreferredOrientations([DeviceOrientation.portraitUp]); @@ -37,319 +26,137 @@ class WalletOptions extends StatelessWidget with ChangeNotifier { Provider.of(context); MyWalletsProvider _myWalletProvider = Provider.of(context); - errorController = StreamController(); + // _walletOptions.isWalletUnlock = false; print("Is unlock ? ${_walletOptions.isWalletUnlock}"); - final int _pinLenght = _walletOptions.getPinLenght(this.walletNbr); - return WillPopScope( onWillPop: () { _walletOptions.isWalletUnlock = false; + Navigator.popUntil( + context, + ModalRoute.withName('/mywallets'), + ); return Future.value(true); }, child: Scaffold( - resizeToAvoidBottomInset: false, - appBar: AppBar( - leading: IconButton( - icon: Icon(Icons.arrow_back, color: Colors.black), - onPressed: () { - _walletOptions.isWalletUnlock = false; - Navigator.of(context).pop(); - }), - title: SizedBox( - height: 22, - child: Text(walletName), - )), - body: Builder( - builder: (ctx) => SafeArea( - child: Column(children: [ - Visibility( - visible: _walletOptions.isWalletUnlock, - child: Expanded( - child: Column(children: [ - SizedBox(height: 15), - Text( - 'Clé publique:', + resizeToAvoidBottomInset: false, + appBar: AppBar( + leading: IconButton( + icon: Icon(Icons.arrow_back, color: Colors.black), + onPressed: () { + _walletOptions.isWalletUnlock = false; + Navigator.popUntil( + context, + ModalRoute.withName('/mywallets'), + ); + }), + title: SizedBox( + height: 22, + child: Text(walletName), + )), + body: Builder( + builder: (ctx) => SafeArea( + child: Column(children: [ + Expanded( + child: Column(children: [ + SizedBox(height: 15), + Text( + 'Clé publique:', + style: TextStyle( + fontSize: 15.0, + color: Colors.grey[600], + fontWeight: FontWeight.w400), + ), + SizedBox(height: 15), + GestureDetector( + onTap: () { + Clipboard.setData(ClipboardData( + text: _walletOptions.pubkey.text)); + _walletOptions.snackCopyKey(ctx); + }, + child: Text( + _walletOptions.pubkey.text, style: TextStyle( - fontSize: 15.0, - color: Colors.grey[600], - fontWeight: FontWeight.w400), - ), - SizedBox(height: 15), - GestureDetector( - onTap: () { - Clipboard.setData(ClipboardData( - text: _walletOptions.pubkey.text)); - _walletOptions.snackCopyKey(ctx); - }, - child: Text( - _walletOptions.pubkey.text, - style: TextStyle( - fontSize: 14.0, - color: Colors.black, - fontWeight: FontWeight.bold, - fontFamily: 'Monospace'), - )), - Expanded( - child: Align( - alignment: Alignment.bottomCenter, - child: SizedBox( - height: 50, - width: 300, - child: ElevatedButton( - style: ElevatedButton.styleFrom( - elevation: 5, - primary: Color( - 0xffFFD68E), //Color(0xffFFD68E), // background - onPrimary: - Colors.black, // foreground - ), - onPressed: () => _walletOptions - .renameWalletAlerte( - context, - walletName, - walletNbr, - derivation) - .then((_result) { - if (_result == true) { - WidgetsBinding.instance - .addPostFrameCallback( - (_) { - _myWalletProvider - .listWallets = - _myWalletProvider - .getAllWalletsNames(); - _myWalletProvider - .rebuildWidget(); - }); - Navigator.pop( - context, true); - } - }), - child: Text( - 'Renommer ce portefeuille', - style: TextStyle( - fontSize: 20)))))), - SizedBox(height: 30), - SizedBox( - height: 50, - width: 300, - child: ElevatedButton( - style: ElevatedButton.styleFrom( - elevation: 6, - primary: Colors - .redAccent, //Color(0xffFFD68E), // background - onPrimary: Colors.black, // foreground - ), - onPressed: () async { - await _walletOptions.deleteWallet(context, - walletNbr, walletName, derivation); - WidgetsBinding.instance - .addPostFrameCallback((_) { - _myWalletProvider.listWallets = - _myWalletProvider - .getAllWalletsNames(); - _myWalletProvider.rebuildWidget(); - }); - }, - child: Text('Supprimer ce portefeuille', - style: TextStyle(fontSize: 20)))), - SizedBox(height: 50), - Text( - 'Portefeuille déverrouillé', - style: TextStyle( - color: Colors.green, - fontWeight: FontWeight.w700, - fontSize: 15), - ), - SizedBox(height: 10) - ]))), - Visibility( - visible: !_walletOptions.isWalletUnlock, - child: Expanded( - child: Column(children: [ - SizedBox(height: 80), - Text( - 'Veuillez tapper votre code secret pour dévérouiller votre portefeuille.', - textAlign: TextAlign.center, - style: TextStyle( - fontSize: 15.0, + fontSize: 14.0, color: Colors.black, - fontWeight: FontWeight.w400), - ), - SizedBox(height: 50), - pinForm(context, _pinLenght, walletNbr, derivation) - // Form( - // key: formKey, - // child: Padding( - // padding: const EdgeInsets.symmetric( - // vertical: 8.0, horizontal: 30), - // child: PinCodeTextField( - // autoFocus: true, - // appContext: context, - // pastedTextStyle: TextStyle( - // color: Colors.green.shade600, - // fontWeight: FontWeight.bold, - // ), - // length: _pinLenght, - // obscureText: false, - // obscuringCharacter: '*', - // animationType: AnimationType.fade, - // validator: (v) { - // if (v.length < _pinLenght) { - // return "Votre code PIN fait $_pinLenght caractères"; - // } else { - // return null; - // } - // }, - // pinTheme: PinTheme( - // shape: PinCodeFieldShape.box, - // borderRadius: BorderRadius.circular(5), - // fieldHeight: 60, - // fieldWidth: 50, - // activeFillColor: hasError - // ? Colors.orange - // : Colors.white, - // ), - // cursorColor: Colors.black, - // animationDuration: - // Duration(milliseconds: 300), - // textStyle: - // TextStyle(fontSize: 20, height: 1.6), - // backgroundColor: pinColor, - // enableActiveFill: false, - // errorAnimationController: errorController, - // controller: _enterPin, - // keyboardType: TextInputType.text, - // boxShadows: [ - // BoxShadow( - // offset: Offset(0, 1), - // color: Colors.black12, - // blurRadius: 10, - // ) - // ], - // onCompleted: (_pin) async { - // print("Completed"); - // final resultWallet = - // await _walletOptions.readLocalWallet( - // this.walletNbr, - // _pin.toUpperCase(), - // _pinLenght, - // this.derivation); - // if (resultWallet == 'bad') { - // errorController.add(ErrorAnimationType - // .shake); // Triggering error shake animation - // hasError = true; - // pinColor = Colors.red[200]; - // notifyListeners(); - // } else { - // pinColor = Colors.green[200]; - // // setState(() {}); - // // await Future.delayed(Duration(milliseconds: 50)); - // this.walletPin = _pin.toUpperCase(); - // // isWalletUnlock = true; - // notifyListeners(); - // } - // }, - // onChanged: (value) { - // if (pinColor != Color(0xffF9F9F1)) { - // pinColor = Color(0xffF9F9F1); - // } - // print(value); - // }, - // )), - // ) - ]))), - ]))))); - } - - Widget pinForm(context, _pinLenght, int _walletNbr, int _derivation) { - // var _walletPin = ''; -// ignore: close_sinks - StreamController errorController = - StreamController(); - TextEditingController _enterPin = TextEditingController(); - WalletOptionsProvider _walletOptions = - Provider.of(context); - - return Form( - key: formKey, - child: Padding( - padding: const EdgeInsets.symmetric(vertical: 8.0, horizontal: 30), - child: PinCodeTextField( - autoFocus: true, - appContext: context, - pastedTextStyle: TextStyle( - color: Colors.green.shade600, - fontWeight: FontWeight.bold, - ), - length: _pinLenght, - obscureText: false, - obscuringCharacter: '*', - animationType: AnimationType.fade, - validator: (v) { - if (v.length < _pinLenght) { - return "Votre code PIN fait $_pinLenght caractères"; - } else { - return null; - } - }, - pinTheme: PinTheme( - activeColor: pinColor, - borderWidth: 4, - shape: PinCodeFieldShape.box, - borderRadius: BorderRadius.circular(5), - fieldHeight: 60, - fieldWidth: 50, - activeFillColor: hasError ? Colors.blueAccent : Colors.black, - ), - cursorColor: Colors.black, - animationDuration: Duration(milliseconds: 300), - textStyle: TextStyle(fontSize: 20, height: 1.6), - backgroundColor: Color(0xffF9F9F1), - enableActiveFill: false, - errorAnimationController: errorController, - controller: _enterPin, - keyboardType: TextInputType.text, - boxShadows: [ - BoxShadow( - offset: Offset(0, 1), - color: Colors.black12, - blurRadius: 10, - ) - ], - onCompleted: (_pin) async { - print("Completed"); - final resultWallet = await _walletOptions.readLocalWallet( - this.walletNbr, - _pin.toUpperCase(), - _pinLenght, - this.derivation); - if (resultWallet == 'bad') { - errorController.add(ErrorAnimationType - .shake); // Triggering error shake animation - hasError = true; - pinColor = Colors.red[600]; - _walletOptions.reloadBuild(); - } else { - pinColor = Colors.green[400]; - // setState(() {}); - // await Future.delayed(Duration(milliseconds: 50)); - this.walletPin = _pin.toUpperCase(); - _walletOptions.isWalletUnlock = true; - // isWalletUnlock = true; - _walletOptions.reloadBuild(); - // notifyListeners(); - } - }, - onChanged: (value) { - if (pinColor != Color(0xFFA4B600)) { - pinColor = Color(0xFFA4B600); - } - print(value); - }, - )), - ); + fontWeight: FontWeight.bold, + fontFamily: 'Monospace'), + )), + Expanded( + child: Align( + alignment: Alignment.bottomCenter, + child: SizedBox( + height: 50, + width: 300, + child: ElevatedButton( + style: ElevatedButton.styleFrom( + elevation: 5, + primary: Color( + 0xffFFD68E), //Color(0xffFFD68E), // background + onPrimary: Colors.black, // foreground + ), + onPressed: () => _walletOptions + .renameWalletAlerte( + context, + walletName, + walletNbr, + derivation) + .then((_result) { + if (_result == true) { + WidgetsBinding.instance + .addPostFrameCallback((_) { + _myWalletProvider + .listWallets = + _myWalletProvider + .getAllWalletsNames(); + _myWalletProvider + .rebuildWidget(); + }); + Navigator.popUntil( + context, + ModalRoute.withName( + '/mywallets'), + ); + } + }), + child: Text('Renommer ce portefeuille', + style: TextStyle(fontSize: 20)))))), + SizedBox(height: 30), + SizedBox( + height: 50, + width: 300, + child: ElevatedButton( + style: ElevatedButton.styleFrom( + elevation: 6, + primary: Colors + .redAccent, //Color(0xffFFD68E), // background + onPrimary: Colors.black, // foreground + ), + onPressed: () async { + await _walletOptions.deleteWallet(context, + walletNbr, walletName, derivation); + WidgetsBinding.instance + .addPostFrameCallback((_) { + _myWalletProvider.listWallets = + _myWalletProvider.getAllWalletsNames(); + _myWalletProvider.rebuildWidget(); + }); + }, + child: Text('Supprimer ce portefeuille', + style: TextStyle(fontSize: 20)))), + SizedBox(height: 50), + Text( + 'Portefeuille déverrouillé', + style: TextStyle( + color: Colors.green, + fontWeight: FontWeight.w700, + fontSize: 15), + ), + SizedBox(height: 10) + ])), + ]), + )), + )); } } diff --git a/lib/screens/myWallets/walletsHome.dart b/lib/screens/myWallets/walletsHome.dart index a6ca0d3..98f88f4 100644 --- a/lib/screens/myWallets/walletsHome.dart +++ b/lib/screens/myWallets/walletsHome.dart @@ -2,7 +2,7 @@ import 'package:flutter/services.dart'; import 'package:gecko/models/myWallets.dart'; import 'package:gecko/models/walletOptions.dart'; import 'package:flutter/material.dart'; -import 'package:gecko/screens/myWallets/walletOptions.dart'; +import 'package:gecko/screens/myWallets/unlockingWallet.dart'; import 'package:gecko/screens/onBoarding/1_noKeychainFound.dart'; import 'package:provider/provider.dart'; @@ -97,7 +97,7 @@ class WalletsHome extends StatelessWidget { dense: true, onTap: () { Navigator.push(context, MaterialPageRoute(builder: (context) { - return WalletOptions( + return UnlockingWallet( walletNbr: int.parse(_repository.split(':')[0]), walletName: _repository.split(':')[1], derivation: int.parse(_repository.split(':')[2])); diff --git a/lib/screens/templateScreen.dart b/lib/screens/templateScreen.dart index 75e3d86..6b34bea 100644 --- a/lib/screens/templateScreen.dart +++ b/lib/screens/templateScreen.dart @@ -71,11 +71,9 @@ class TemplateScreen extends StatelessWidget { SizedBox(height: 20), GestureDetector( onTap: () { - Navigator.push( + Navigator.popUntil( context, - MaterialPageRoute(builder: (context) { - return HomeScreen(); - }), + ModalRoute.withName('/'), ); }, child: Icon(Icons.home))